क्या लिनक्स सिस्टम पर चल रही प्रक्रिया को रोकने और बाद में फिर से शुरू करने का एक तरीका है?


37

मुझे एक मशीन पर फाइल कॉपी करनी है। और डेटा बहुत बड़ा है। अब सर्वर को सामान्य रूप से सेवा करने की आवश्यकता होती है, और आमतौर पर उन पर व्यस्त घंटों की एक विशेष श्रेणी होती है। तो क्या इस तरह से कमांड को चलाने का एक तरीका है कि अगर सर्वर व्यस्त घंटों को हिट करता है, तो यह प्रक्रिया को रोक देता है, और जब यह उस सीमा से बाहर हो जाता है, तो यह इसे फिर से शुरू करता है?

इरादा-परिणाम

cp src dst

if time between 9:00-14:00 pause process
After 14:00 resume cp command.

22
rsync आंशिक स्थानांतरण फिर से शुरू कर सकता है
Thorbjørn Ravn Andersen

2
क्या आपको बैकअप के रूप में कॉपी किए जाने वाले वास्तविक डेटा की आवश्यकता है? यदि नहीं, तो क्या आप cp -alहार्डलिंक फार्म बनाने के लिए उपयोग कर सकते हैं ? या एक फाइल सिस्टम का उपयोग करें जो कॉपी-ऑन-राइट के साथ ब्लॉक-लेवल रिफ्लिंक्स का समर्थन करता है, का उपयोग कर cp -a --reflink=auto? BTRFS और ZFS एक ही भौतिक उपकरण के भीतर प्रतियों के लिए समर्थन करते हैं।
पीटर कॉर्ड्स

9
src9:00 और 14:00 के बीच परिवर्तन में कोई भी फाइल करें ? यदि ऐसा है, तो बस cpप्रक्रिया को रोकने और फिर से शुरू करने के परिणामस्वरूप दूषित फाइलें हो सकती हैं। कमांड के rsyncसाथ संयोजन में चलाना बेहतर हो सकता है timeout
मार्क प्लॉटनिक

कहां से और कहां से फाइल कॉपी की जा रही हैं? क्या यह वर्चुअल सिस्टम है? सोर्स फाइलसिस्टम क्या है? कॉपी का उद्देश्य क्या है?
ब्रिअम

@Braiam Im rsync का उपयोग कर, और रिमोट मशीन से फाइल को स्थानीय मशीन में कॉपी कर रहा है। मैंने अभी उदाहरण के लिए btw के रूप में cp कमांड का इस्तेमाल किया
Sollosa

जवाबों:


7

हां, आपको चाहिए

acquire the process id of the process-to-paus (PS), then do
$> kill -SIGSTOP <pid>

प्रक्रिया तब स्थिति "टी" (पीएस) के साथ दिखाई देगी। जारी रखने के लिए ए

$> kill -CONT <pid>

शुभ लाभ!


77

आप इसे SIGSTOP सिग्नल भेजकर किसी प्रक्रिया का निष्पादन रोक सकते हैं और बाद में इसे SIGCONT भेजकर फिर से शुरू कर सकते हैं।

अपना कार्यभार मान लेना एक एकल प्रक्रिया है (पृष्ठभूमि में चलने वाले सहायकों को कांटा नहीं), आप कुछ इस तरह का उपयोग कर सकते हैं:

# start copy in background, store pid
cp src dst &
echo "$!" >/var/run/bigcopy.pid

फिर जब व्यस्त समय शुरू होता है, तो इसे भेजें:

# pause execution of bigcopy
kill -STOP "$(cat /var/run/bigcopy.pid)"

बाद में, जब सर्वर फिर से निष्क्रिय हो जाता है, तो इसे फिर से शुरू करें।

# resume execution of bigcopy
kill -CONT "$(cat /var/run/bigcopy.pid)"

आपको इसे विशिष्ट समय के लिए शेड्यूल करना होगा जब आप इसे निष्पादित करना चाहते हैं, तो आप इस शेड्यूल को प्राप्त करने के लिए क्रोन या सिस्टमड टाइमर (या इसी तरह के अन्य उपकरणों की एक किस्म) जैसे उपकरणों का उपयोग कर सकते हैं। समय अंतराल के आधार पर शेड्यूलिंग के बजाय, आप कॉपी को रोकने / फिर से शुरू करने का निर्णय लेने के लिए सर्वर (शायद लोड औसत, सीपीयू उपयोग या सर्वर लॉग से गतिविधि को देखकर) की निगरानी करने का विकल्प चुन सकते हैं।

आपको PID फ़ाइल को प्रबंधित करने की भी आवश्यकता है (यदि आप एक का उपयोग करते हैं), सुनिश्चित करें कि आपकी प्रतिलिपि वास्तव में अभी भी इसे रोकने से पहले चल रही है, शायद आप कॉपी समाप्त होने के बाद pidfile को हटाकर साफ करना चाहेंगे।

दूसरे शब्दों में, एक विश्वसनीय बनाने के लिए आपको इसके आसपास और अधिक की आवश्यकता है, लेकिन एक प्रक्रिया के निष्पादन को रोकने / फिर से शुरू करने के लिए इन SIGSTOP और SIGCONT संकेतों का उपयोग करने के आधार विचार से लगता है कि आप क्या देख रहे हैं।



1
शायद एक रिमाइंडर जोड़ें जो आपको बहुत सावधान रहना चाहिए कि '/var/run/bigcopy.pid' अभी भी उसी प्रक्रिया को संदर्भित करता है जैसा आप सोचते हैं कि यह करता है। सिस्टम पर अन्य प्रक्रियाओं को बेतरतीब ढंग से रोकना वांछनीय नहीं हो सकता है। मैं यह सुनिश्चित करने का कोई सुरक्षित तरीका नहीं जानता कि पीआईडी ​​उस कार्यक्रम को संदर्भित करता है जो आपको लगता है कि यह करता है ...
इवान बेन

@EvanBenn हाँ, इसका मतलब यह है कि "आपकी प्रतिलिपि वास्तव में इसे रोकने से पहले ही चल रही है", हालांकि आपकी बात निश्चित रूप से इससे अधिक स्पष्ट है! हाँ जाँच पीआईडी ​​स्वाभाविक रूप से दौड़-वाई है इसलिए यह कभी-कभी वास्तव में 100% मज़बूती से करना संभव नहीं है ...
फाइलब्रांडेन

@ वास्तव में नहीं, एक प्रक्रिया SIGSTOP को ब्लॉक नहीं कर सकती है। पहली टिप्पणी से लिंक देखें: "SIGSTOP एक गैर-ब्लॉक करने योग्य संकेत है जैसे कि SIGKILL" (या बस इसे Google करें, आप देखेंगे कि यह मामला है।)
filbranden

76

प्रक्रिया को निलंबित करने के बजाय, आप इसे कम प्राथमिकता दे सकते हैं:

renice 19 "$pid"

इसे सबसे कम प्राथमिकता (उच्चतम श्रेष्ठता) देगा, ताकि यह प्रक्रिया सीपीयू को अन्य प्रक्रियाओं के लिए उतारेगी, जिन्हें इसकी सबसे अधिक आवश्यकता होती है।

लिनक्स पर, I / O के साथ भी ऐसा ही किया जा सकता है ionice:

ionice -c idle -p "$pid"

प्रक्रिया को "निष्क्रिय" वर्ग में डाल देगा, ताकि इसे केवल डिस्क समय मिल जाएगा जब किसी अन्य कार्यक्रम ने परिभाषित आई अवधि के लिए डिस्क I / O के लिए नहीं पूछा है


22
यह एक XY समस्या का एक विशिष्ट मामला है । सवाल यह था कि किसी प्रक्रिया को कैसे रोका जाए, लेकिन यह सवाल का जवाब नहीं देता है। जबकि वास्तव में प्राथमिकता कम करना वास्तविक समस्या का बेहतर तरीका है, यह सवाल का जवाब नहीं देता है। मैं इस प्रश्न को भी संपादित करूंगा कि किसी प्रक्रिया को रोकना कैसे शामिल है और रोकना एक समस्या क्यों हो सकती है (उदाहरण के लिए फ़ाइल को रोकते समय संपादित किया जा सकता है)।
MechMK1

22
@DavidStockinger, तकनीकी रूप से, यह उत्तर बताता है कि प्रक्रिया को रोकने के लिए ओएस को कैसे बताया जाए (जब ओएस, सीपीयू, आई / ओ अनुसूचक) व्यस्त हो (भले ही यह एक समय में सेकंड के अंश के लिए हो)। मैन्युअल रूप से प्रक्रिया को निलंबित करने के लिए कैसे पहले से ही अन्य उत्तरों में कवर किया गया है। यह समाधान फ़ाइलों की समस्या को हल नहीं करता है, जबकि वे कॉपी किए जा रहे हैं।
स्टीफन चेज़लस

5
I / O प्राथमिकता को बदलना हमेशा सबसे अच्छा समाधान नहीं होता है। यदि आप कताई डिस्क से नकल कर रहे हैं, तो आप अभी भी प्रत्येक उच्च प्राथमिकता वाले अनुरोध से पहले एक मांग कर सकते हैं, जिसे आप कम-प्राथमिकता वाले ऑपरेशन को पूरी तरह से रोक दिए जाने पर रोक नहीं पाएंगे।
मार्क

2
कम प्राथमिकता भी समस्या का समाधान नहीं है। यहां तक ​​कि अगर बॉक्स कुछ सेकंड या मिनटों के लिए पूरी तरह से निष्क्रिय है, तो इसका मतलब यह नहीं है कि एक बड़ी प्रतिलिपि प्रक्रिया जो फ़ाइलसिस्टम कैश से सब कुछ बेदखल कर देगी, विनीत होने जा रही है। जैसे ही वहाँ फिर से लोड होता है, यह बहुत धीमी गति से सब कुछ वापस करने वाला है।
R ..

2
@DavidStockinger को XY समस्याओं से निपटने का पसंदीदा तरीका सही समाधान देना है , भले ही वह सवाल ही क्यों न हो। जब आप जानते हैं कि प्रश्न में वर्णित दृष्टिकोण गलत है, तो एक अच्छा जवाब उस गलत दृष्टिकोण को नहीं देता है, बल्कि एक बेहतर प्रस्ताव देता है।
terdon

8

इस परिदृश्य के लिए, rsync का उपयोग करें, cp के बारे में भूल जाएं। बैंडवाथ को सीमित करने के लिए परम हैं, या इसे मार / रोका जा सकता है और बाद में शुरू किया जा सकता है, एक तरह से यह जारी रहेगा, जहां इसने Google rsync का उदाहरण छोड़ दिया


3

यदि आप इसे चलाने की प्रक्रिया को बाधित करके करने जा रहे हैं, तो मैं स्क्रीन प्रोग्राम के साथ खेलने का सुझाव देता हूं। मैंने कुछ समय में लिनक्स का उपयोग नहीं किया है, लेकिन IIRC सिर्फ कमांड को रोक रहा है और इसे फिर से शुरू करना आपको बाद में बहुत कमजोर बनाता है, यदि आप गलती से लॉग ऑफ हो जाते हैं तो आप अपना सत्र फिर से शुरू नहीं कर पाएंगे।

स्क्रीन के साथ मेरा मानना ​​है कि आप सत्र को बाधित कर सकते हैं फिर इसे अलग कर सकते हैं और लॉग आउट कर सकते हैं। बाद में आप उस सत्र में वापस जा सकते हैं और रिटैटचैट कर सकते हैं। आपको इसके साथ थोड़ा खेलना होगा लेकिन इसने सत्रों को और अधिक मजबूत बना दिया।

आप लॉग आउट भी कर सकते हैं और घर जा सकते हैं, फिर दूरस्थ रूप से लॉग इन कर सकते हैं, सिस्टम y को आप कार्यालय में शुरू कर सकते हैं और शाम के लिए इसे फिर से शुरू कर सकते हैं, फिर इसे अगले दिन फिर से काम पर ले जा सकते हैं।


मैं पहले से ही thaux के लिए tmux का उपयोग कर रहा हूँ। लेकिन मैं एक ऐसी स्क्रिप्ट लिख रहा हूं, जो स्वयं-जागरूक या अधिमानतः पर्यावरण के प्रति जागरूक होगी, इसलिए सर्वर के उच्च स्तर पर पहुंचने पर यह रुक जाता है, और सामान्य होने पर जारी रहता है।
सोलासा

0

यदि आपका शेल इसका समर्थन करता है (लगभग सभी करते हैं), तो आप आसानी SIGTSTPसे अग्रभूमि कार्य को संकेत भेजने के लिए ^ Z (Ctrl + Z) दबा सकते हैं , फिर इसे fg(अग्रभूमि पर) या bgपृष्ठभूमि पर जारी रखें ।

यदि आप कई कार्यों पर ऐसा करते हैं और बाद में उनके पास लौटना चाहते हैं, तो आप jobsकमांड का उपयोग कर सकते हैं , फिर साथ लौट सकते हैं fg/bg %#, जहां # नौकरियों पर कोष्ठक में दी गई संख्या है।

ध्यान रखें कि SIGTSTPथोड़ा अलग है SIGSTOP(जो कि अन्य सभी उत्तरों पर उपयोग किया जाता है), सबसे महत्वपूर्ण बात यह है कि इसे नजरअंदाज किया जा सकता है (लेकिन मुझे ऐसा कोई कार्यक्रम नजरअंदाज नहीं दिखता sl)। StackOverflow पर इस उत्तर पर अधिक जानकारी प्राप्त की जा सकती है ।


हैरानी की बात है कि इसका कोई जवाब अभी तक नहीं मिला है।
Ave

Ty Ave, मैं इस मल्टीटास्किंग ट्रिक को जानता हूं। लेकिन ऐसा होने के लिए, किसी को टर्मिनल पर होने की आवश्यकता है, जबकि मुझे एक स्क्रिप्ट का निर्माण करना था जो काम अपने आप ही कर लेगा, भले ही इसमें कुछ दिन लगें।
सोलासा

@ सलोसा यह एक ही प्रश्न के साथ, और एक टर्मिनल तक पहुंच के साथ दूसरों के लिए उपयोगी हो सकता है।
Ave

मैं सहमत हूँ। आपको जानकर अच्छा लगा :) :)
सोलासा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.