एक कतार में कमांड कैसे चलाएं


42

मुझे कई फाइलों को विभिन्न फ़ोल्डरों में कॉपी करने की आवश्यकता है। मैं अपने सभी कॉपी कमांड को बैश स्क्रिप्ट में जोड़ सकता हूं और फिर उसे चला सकता हूं, लेकिन तब तक इंतजार करना होगा जब तक कि मैं उस कॉपी "कतार" में और कमांड जोड़ना नहीं चाहता।

क्या कोई तरीका है कि मैं एक कतार के रूप में कमांड चला सकता हूं और चीजों को चलाने के दौरान उस कतार में अधिक कमांड जोड़ सकता हूं?

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


3
क्या मेरा सुझाव है कि आप एक ऐसे उत्तर को स्वीकार करें जो आपकी समस्या को हल करे। ऐसा लगता है कि उनमें से कुछ जोड़े हैं जो आपके लिए काम करेंगे।
होल्ब

2
हाँ, आप कर सकते हैं और मैं चाहता था। समस्या यह है कि मैंने यह पूछा जब मैंने एक कंपनी में काम किया था जो मैक का उपयोग कर रहे थे। मैं अब वहां काम नहीं कर रहा हूं, न ही मेरे पास कोई मैक है इसलिए मेरे पास इनमें से किसी के परीक्षण का कोई तरीका नहीं है। एक उत्तर के रूप में एक अंकन के साथ सहज महसूस न करें जब मैं यह परीक्षण करने में असमर्थ हूं कि यह वास्तव में काम करता है, इसलिए अब मुझे उम्मीद है कि लोग उन उत्तरों को वोट देते हैं जो वे उनके लिए अच्छी तरह से काम करते हैं, इसलिए "उत्तर" उस तरह से उभर सकता है बजाय।
शविश

जवाबों:


25

atउपयोगिता, सबसे अच्छा एक निर्धारित समय में आदेशों को चलाने के लिए जाना जाता है, यह भी एक कतार सुविधा है और अब चल आदेशों शुरू करने के लिए कहा जा सकता है। यह मानक इनपुट से चलने के लिए कमांड पढ़ता है।

echo 'command1 --option arg1 arg2' | at -q myqueue now
echo 'command2 ...' | at -q myqueue now

batchआदेश के बराबर है at -q b -m now( -mआदेश उत्पादन जिसका अर्थ है, यदि कोई हो, के लिए, आप पर भेज दिया जाएगा क्रॉन करता है की तरह)। सभी यूनिक्स वेरिएंट कतार नामों का समर्थन नहीं करते हैं ( -q myqueue); आप नामक एकल कतार तक सीमित हो सकते हैं b। लिनक्स atएकल-अक्षर कतार नामों तक सीमित है।


2
कम से कम लिनक्स पर यह अंतिम कमांड के खत्म होने का इंतजार नहीं करता है।
WDS

@wds मेरे लिए डेबियन मट्ठा पर काम करता है। यह आपके लिए कहां और कैसे टूट गया? ध्यान दें कि केवल कमांड खत्म होने का इंतजार करता है; अगर कमांड सबप्रोसेस को लॉन्च करता है जो अपने माता-पिता को समझाते हैं, तो सबप्रोसेस के लिए इंतजार न करें।
गिलेस एसओ- बुराई को रोकना '

मैंने CentOS 6 पर कोशिश की। मैंने बस एक साधारण "स्लीप एक्स" के साथ परीक्षण किया। मुझे यकीन नहीं है कि इसे चलाने के लिए क्या होता है, लेकिन मुझे लगता है कि यह एक सबमिशन शुरू करता है और सब्सक्रिप्शन को परिणाम के लिए इंतजार करना चाहिए (एक नींद कॉल तुरंत वापस नहीं आती है)।
WDS

साथ ही कतार के नाम, 'अब' मानक नहीं दिखाई देते हैं:
उबंटू

@winwaed ओह, यह है now, नहीं -t now, क्षमा करें। मैंने देखा नहीं था कि मैं नमूना कोड में गलत था।
गिल्स एसओ- बुराई को रोकना '

23

&पृष्ठभूमि को भेजने के लिए अपने कमांड के अंत में संलग्न करें , और फिर waitअगले चलाने से पहले उस पर। उदाहरण के लिए:

$ command1 &
$ wait; command2 &
$ wait; command3 &
$ ...

2
वाह! जब आप किसी चीज़ को लात मारते हैं तो यह वाक्यविन्यास भयानक होता है और फिर
स्टैकओवरफ्लो को देखने के लिए

2
यदि आप इस बीच में से किसी भी आदेश पर अपना मन बदलते हैं, तो गर्भपात करने के लिए क्या किया जा सकता है wait? यह मेरे सभी हत्याओं के लिए अभेद्य लगता है।
केन विलियम्स

1
तुम बस आज्ञा को मार डालो। waitबस काम बंद हो जाता है जब तक पिछले अभियानों खत्म।
गर्ट सोंडर्बी

क्या यह साथ काम करेगा nohup?
माइकल

11

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

पहला रन:

$ screen -d -m -S queue

(संयोग से, अब कुछ भयानक के साथ खेलने के लिए एक अच्छा समय है। स्क्रीन आर्क फ़ाइलें )

कि आप कतार के नाम के लिए एक पृष्ठभूमि स्क्रीन सत्र शुरू होगा।

अब, आप जितने चाहें उतने आदेशों को कतारबद्ध करें:

screen -S queue -X stuff "echo first; sleep 4; echo second^M"

मैं सिर्फ परीक्षण के लिए ऊपर में कई कमांड कर रहा हूं। आपके उपयोग का मामला संभवतः अधिक दिखाई देगा:

screen -S queue -X stuff "echo first^M"
screen -S queue -X stuff "echo second^M"

ध्यान दें कि ऊपर दी गई मेरी लाइन में "^ M" एक एम्बेडेड नईलाइन प्राप्त करने का एक तरीका है जिसे बाद में स्क्रीन द्वारा आपके मौजूदा बैश शेल में स्टफ किए जाने के बाद व्याख्या की जाएगी। उस क्रम को प्राप्त करने के लिए "CTL-V," का उपयोग करें।

यह बहुत आसान होगा कि कुछ सरल शेल-स्क्रिप्ट बनाएं जो कि स्वचालित और कमांड को कतारबद्ध करें। फिर, जब भी आप अपनी पृष्ठभूमि कतार की स्थिति की जांच करना चाहते हैं, आप इसके माध्यम से पुनः संलग्न करते हैं:

screen -S queue -r

तकनीकी रूप से, आपको अपने स्क्रीन सत्र को नाम देने की भी आवश्यकता नहीं है और यह ठीक काम करेगा, लेकिन एक बार जब आप इस पर आसीन हो जाते हैं, तो आप हर समय किसी एक को छोड़ना चाहते हैं। ;-)

बेशक, यदि आप ऐसा करते हैं, तो ऐसा करने का एक और अच्छा तरीका यह होगा कि वर्तमान खिड़कियों में से एक का नाम "कतार" और उपयोग करें:

screen -S queue -p queue -X stuff "command"

ऐसा लगता है कि यह मूल रूप से चल रहे स्क्रीन सत्र में केवल "प्रकार" कमांड है, ताकि जब पहली कमांड खत्म होने के बाद शेल फिर से नियंत्रण करे, तो यह कमांड शुरू हो जाएगा। दूसरे शब्दों में, यह @ mankoff के समाधान के बराबर है, लेकिन टाइपिंग करने के लिए एक कट्टर उपकरण का उपयोग करता है।
केन विलियम्स

बहुत ज्यादा - मुख्य अंतर यह है कि स्क्रीन समाधान बेहतर स्वचालन का समर्थन करता है। आप हाथ से कुछ सामान कर सकते हैं, स्क्रिप्ट के साथ अन्य चीजें, सभी एक सरल इंटरफ़ेस के साथ।
जॉर्डन

@ जोर्डन बहुत अच्छा, यह मेरे लिए काम करता है। लेकिन बाद के लिए "सामान" क्या है?
कॉन्सटेंटिन

@Konstantin gnu.org/software/screen/manual/html_node/Paste.html#aste (TL (DR; DR) - टर्मिनल में जो कुछ भी आपके द्वारा टाइप किया गया है, उसके अनुसार सामान
जॉर्डन

@ जोर्डन ओह, मैं अब देख रहा हूं। यह एक कमांड है। मैंने सोचा कि यह एक मनमाना स्ट्रिंग है।
कॉन्स्टेंटिन

8

एक उपयोगिता है जो मैंने बड़ी सफलता के साथ उपयोग की है, जो आप बता रहे हैं। हाल ही में मैंने अपने प्राथमिक लैपटॉप को नए हार्डवेयर में स्थानांतरित कर दिया, जिसमें कुछ फ़ाइलों को एनएएस में स्थानांतरित करना और बाकी को नई मशीन में शामिल करना था।

मैंने इस तरह से इसे किया।

  1. एक नेटवर्क कनेक्शन के साथ शामिल सभी मशीनों को सेट करें ताकि वे एक दूसरे तक पहुंच सकें।

  2. उस मशीन पर जहां आप (इसके बाद स्रोत मशीन कहा जाता है) से फ़ाइलें ले जा रहे हैं, के साथ rsync स्थापित करें apt-get install rsyncऔर गुप्त-सॉस टास्क स्पूलर (वेबसाइट http://vicerveza.homeunix.net/~viric/soft/ts/ )। यदि आप डेबियन पर हैं तो पैकेज का नाम tsहै task-spoolerऔर निष्पादन योग्य का नाम बदला गया tspहै ताकि पैकेज tsसे निष्पादन योग्य नाम के टकराव से बचा जा सके moreutils। वेबसाइट से लिंक किया गया डेबियन पैकेज उबंटू dpkg -i task-spooler_0.7.3-1_amd64.debया इसके साथ पूरी तरह से इंस्टॉल करने योग्य है ।

  3. यह भी सुनिश्चित करें कि सभी मशीनों के साथ SSH स्थापित किया गया है apt-get install openssh-server। स्रोत मशीन पर आपको लक्ष्य मशीनों में पासवर्ड रहित लॉगिन की अनुमति देने के लिए SSH को स्थापित करने की आवश्यकता है। सबसे अधिक उपयोग की जाने वाली विधि सार्वजनिक कुंजी प्रमाणीकरण है ssh-agent(देखें https://www.google.se/search?q=ssh+public+key+authentication के लिए), लेकिन मैं कभी-कभी एक आसान विधि का उपयोग करता हूं जो बस काम करती है पासवर्ड प्रमाणीकरण के साथ। (या तो अपने SSH क्लाइंट विन्यास के लिए निम्न जोड़ें ~/.ssh/configया /etc/ssh/ssh_config):

    Host *
         ControlMaster auto
         ControlPath ~/.ssh/master-%r@%h:%p
    

    फिर स्रोत मशीन पर एक टर्मिनल खोलें, ssh target1सामान्य रूप से प्रमाणित करें, और फिर इस टर्मिनल को खुला छोड़ दें। ध्यान दें कि एक सॉकेट फ़ाइल नाम है ~/.ssh/master-user@target1:22, यह वह फ़ाइल है जो एक प्रमाणित मास्टर सत्र को खुला रखेगा और बाद के पासवर्ड रहित कनेक्शन की अनुमति देगा user(जब तक कि कनेक्शन एक ही लक्ष्य होस्टनाम और पोर्ट का उपयोग करता है)।

    इस बिंदु पर आपको यह सत्यापित करने की आवश्यकता है कि आप लक्ष्य मशीनों के प्रमाणीकरण के लिए संकेत किए बिना लॉगिन कर सकते हैं।

  4. अब ts rsync -ave ssh bigfile user@target1:एक फ़ाइल के लिए या ts rsync -ave ssh bigdir user@target1:एक निर्देशिका के लिए चलाएं । Rsync के साथ यह महत्वपूर्ण है कि निर्देशिका पर एक अनुगामी स्लैश को शामिल न किया जाए ( bigdirतुलना में bigdir/) या rsync यह मान लेगा कि आपका bigdir/*अधिकांश अन्य साधनों के समतुल्य था ।

    टास्क स्पूलर प्रॉम्प्ट वापस कर देगा और आपको उत्तराधिकार में इनमें से कई कमांडों को कतार में खड़ा कर देगा। tsबिना तर्क के साथ रन कतार का निरीक्षण करें ।

टास्क स्पूलर में कई विशेषताएं हैं जैसे कि रन कतार को फिर से व्यवस्थित करना, एक विशिष्ट नौकरी चलाना, यदि कोई अन्य नौकरी सफलतापूर्वक चली, आदि के साथ मदद देखें ts -h। मैं कभी-कभी कमांड आउटपुट का निरीक्षण करता हूं जब वह साथ चल रहा होता है ts -c

ऐसा करने के अन्य तरीके हैं लेकिन आपके उपयोग के मामले में वे सभी कार्य शामिल हैं स्पूलर। मैं फ़ाइल टाइमस्टैम्प को संरक्षित करने के लिए SSH पर rsync का उपयोग करना चुनता हूं, जो कि SMB पर कॉपी नहीं होता।


आपके उत्तर के लिए धन्यवाद, मैं इसके बारे में नहीं जानता था ts, बहुत शक्तिशाली और उपयोग करने में आसान लगता है, सिर्फ जीथूब ऑटोटूलिज़ और विआयनीकृत पर कांटा
एलेक्स

@ एलेक्स मेरे पास आपके कांटे पर एक नज़र थी और विशेष रूप से इस बात में दिलचस्पी थी कि मूल स्रोत को ऑटोटूलिंग और विचलन करने के संबंध में क्या किया गया था, और आपके कमिट्स को देखते हुए यह मूल स्रोत के लिए एक अंतर के रूप में आसानी से उपलब्ध नहीं था। क्या आप नए कमिट्स को आगे बढ़ाने के लिए मजबूर करेंगे, जो कि मूल स्रोत को आयात करता है और 2. आपके परिवर्धन के साथ प्रतिबद्ध है? यह आपके स्रोत को ब्राउज़ करने में किसी की मदद करेगा (अधिक आसानी से) मूल स्रोत पर अपने परिवर्धन पर भरोसा करें। यह उन कुछ पैकेजों में से एक है जिन्हें मैं पीपीए या इसी तरह से स्थापित नहीं करता हूं, इसलिए इसे अपने कांटे के साथ स्वयं बनाना अच्छा होगा।
15

आप जानते हैं कि मुझे अपना चश्मा बदलना है, मैंने आपके उत्तर का हिस्सा मौजूदा task-spooler:-) के बारे में खो दिया है ... वैसे भी, आपकी टिप्पणी में यह एक बहुत अच्छा सुझाव है, मैं बहुत जल्द करूँगा।
एलेक्स

प्रगतिशील कमिट के साथ रिपॉजिटरी को किया, हटाया और फिर से बनाया, केवल कुछ गलतियों को (पुश से पहले और अधिक स्थानीय कमिट को मेटाबोलाइज करना चाहिए)
एलेक्स

4

मुझे इस तरह से सामान भी अक्सर चाहिए। मैंने एक छोटी सी उपयोगिता लिखी जिसे कहा जाता है afterकि एक कमांड निष्पादित करता है जब भी कुछ अन्य प्रक्रिया समाप्त हो जाती है। यह इस तरह दिख रहा है:

#!/usr/bin/perl

my $pid = shift;
die "Usage: $0 <pid> <command...>" unless $pid =~ /^\d+$/ && @ARGV;

print STDERR "Queueing process $$ after process $pid\n";
sleep 1 while -e "/proc/$pid";
exec @ARGV;

आप फिर इसे ऐसे चलाते हैं:

% command1 arg1 arg2 ...  # creates pid=2853
% after 2853 command2 arg1 arg2 ... # creates pid=9564
% after 9564 command3 arg1 arg2 ...

कुछ अन्य दृष्टिकोणों पर इसका बड़ा लाभ यह है कि पहली नौकरी को किसी विशेष तरीके से चलाने की आवश्यकता नहीं है, आप अपनी नई नौकरी के साथ किसी भी प्रक्रिया का पालन कर सकते हैं।


अच्छी स्क्रिप्ट @ken। हालाँकि, मैं आपको समय-समय पर इसकी आवश्यकता होने पर टास्क स्पूलर आज़माने की सलाह दूंगा। मेरा जवाब देखिए।
होल्ब

साफ-सुथरा लगता है, धन्यवाद। टीएस से गायब एक चीज़ टीएस के तहत शुरू नहीं की गई नौकरियों का पालन करने की क्षमता प्रतीत होती है। हालांकि मुझे लगता है कि आप एक नया टीएस काम शुरू कर सकते हैं जिसका उद्देश्य सिर्फ एक मौजूदा प्रक्रिया के खत्म होने का इंतजार करना है।
केन विलियम्स

वास्तव में। यह आपके समाधान का एक उपयोगी पहलू है।
होल्ब

2

कमांड 1 और& कमांड 2

  • "&&" का अर्थ है कि कमांड 2 केवल 0 के रिटर्न कोड के साथ कमांड 1 के खत्म होने के बाद चलता है
  • नोट: ए || इसका मतलब यह है कि कमांड 1 केवल कमांड कोड खत्म होने के बाद चलता है जो कि रिटर्न कोड के अलावा अन्य है

1

आप बस शेल के कमांड लाइन में कमांड जोड़ सकते हैं जो पहले से कमांड चला रहा है।

या तो सावधानी से टाइप करें, या इसे कहीं और टाइप करें, सत्यापित करें, और कट-एंड-पेस्ट करें। यहां तक ​​कि अगर वर्तमान कमांड आउटपुट की पंक्तियां उगल रहा है, तब भी आप कुछ नया टाइप कर सकते हैं, हिट दर्ज कर सकते हैं, और यह तब चलेगा जब सभी कमांड चल रहे हैं या इसे पूरा करने से पहले दर्ज किया गया है।

उदाहरण इस प्रकार है। आप पूरी चीज़ को काट-काट कर चिपका सकते हैं, या बाद की आज्ञाओं को दर्ज कर सकते हैं जबकि 1 चल रहा है (यदि आप वास्तव में तेजी से टाइप करते हैं), या अधिक संभावना है कि दूसरा भाग रहा है।

echo "foo"
sleep 10; echo "bar"
sleep 3
echo "baz"

0

जिस तरह से मैं सोच सकता हूं कि कतार / राज्य को सरल / लॉक / tmp में लॉक-फाइल के साथ बनाए रखना है। जब file1.sh अपने cp कमांड को कर रहा है, तो वह / tmp में लॉक फाइल (या हार्डलिंक) रखेगा। जब यह हो जाए, तो फ़ाइल मिटा दें। हर दूसरी स्क्रिप्ट को आपके द्वारा चुनी गई नामकरण योजना के साथ लॉक फ़ाइलों के लिए / tmp में देखना होगा। स्वाभाविक रूप से यह सभी प्रकार की विफलताओं के अधीन है, लेकिन यह सेट करने के लिए तुच्छ है और पूरी तरह से बैश के भीतर उल्लेखनीय है।


व्यवहार में उपयोग करने के लिए मुश्किल है, क्योंकि यह आवश्यक है कि हर काम जिसे आप चलाना चाहते हैं, उसे लॉक फ़ाइलों को रखने के लिए संशोधित करने की आवश्यकता है, और पता करने की आवश्यकता है (या पैरामीटर के रूप में स्वीकार करें) जो लॉक फ़ाइलों का उपयोग करें। जब भी संभव हो, नौकरी के लिए बाहरी कतार लगाना सबसे अच्छा है।
केन विलियम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.