কিভাবে একটি কাতারে কমান্ড চালানো হয়


42

আমার বিভিন্ন ফোল্ডারে বিভিন্ন ফাইলের অনুলিপি করার দরকার আছে। আমি আমার সমস্ত অনুলিপি কমান্ডগুলিকে ব্যাশ স্ক্রিপ্টে যুক্ত করতে পারি এবং তারপরে এটি চালাতে পারি, তবে আমি যদি সেই অনুলিপি "কাতারে" আরও কমান্ড যুক্ত করতে চাই তবে এটি শেষ না হওয়া পর্যন্ত আমাকে অপেক্ষা করতে হবে।

কি কি উপায় আছে যে আমি কাতার হিসাবে কমান্ডগুলি চালাতে পারি এবং জিনিসগুলি চলতে চলাকালীন সেই সারিতে আরও কমান্ড যুক্ত করতে পারি?

অন্যভাবে ব্যাখ্যা করা হয়েছে, আমি একটি দীর্ঘ চলমান কার্য শুরু করতে চাই। এটি চলমান অবস্থায় আমি অন্য একটি শুরু করতে চাই যা প্রথমটি সম্পন্ন না হওয়া পর্যন্ত শুরু হয় না। এবং তারপরে আরও একটি যোগ করুন এর পরে এবং আরও কিছু। এটি কি কোনওভাবে সম্ভব?


3
আমি আপনাকে পরামর্শ দিতে পারি যে আপনি এমন একটি উত্তর গ্রহণ করুন যা আপনার সমস্যার সমাধান করে। দেখে মনে হচ্ছে তাদের মধ্যে কয়েকটি রয়েছে যা আপনার পক্ষে কাজ করবে।
হলম্ব

2
হ্যাঁ আপনি করতে পারেন, এবং আমি চেয়েছিলেন। সমস্যা হ'ল আমি যখন ম্যাক্স ব্যবহার করে এমন একটি সংস্থায় কাজ করেছি তখন আমি এটি জিজ্ঞাসা করেছি। আমি এখন আর সেখানে কাজ করছি না, আমার নিজেরও কোনও ম্যাক নেই তাই এগুলির কোনও পরীক্ষার আমার কাছে উপায় নেই। আমি যখন এটি আসলে কাজ করে তা পরীক্ষা করতে অক্ষম হয়েছি তখন উত্তর হিসাবে চিহ্নিত করার সাথে স্বাচ্ছন্দ্য বোধ করবেন না, তাই আপাতত আমি আশাবাদী যে লোকেরা তাদের উত্তরগুলি ভালভাবে কাজ করেছে বলে তাদের ভোট দিয়েছিল যাতে "উত্তর" সেভাবে প্রকাশিত হতে পারে পরিবর্তে.
Svish

উত্তর:


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 এ চেষ্টা করেছি আমি কেবল একটি সাধারণ "স্লিপ এক্স" দিয়ে পরীক্ষা করেছি। এটি চালানোর জন্য কী কী তা আমি নিশ্চিত নই তবে আমি ধরে নিই এটি একটি সাবশেল শুরু করে এবং সেই সাবশেলের ফলাফলটির জন্য অপেক্ষা করা উচিত (একটি ঘুমের কল সঙ্গে সঙ্গে ফিরে আসে না) return
wd

পাশাপাশি সারির নামগুলি, 'এখন'
কোনওটি

@ উইন্ড ওয়েড ওহ, এটি nowনা -t now, দুঃখিত। আমি লক্ষ্য করিনি যে আমার নমুনা কোডটিতে এটি ভুল ছিল।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

23

পরিশেষে &আপনার আদেশ শেষে পটভূমি কাছে পাঠাবেন এবং তারপর waitপরবর্তী চালানোর আগে এটিতে। উদাহরণ স্বরূপ:

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

2
হ্যাঁ! এই সিনট্যাক্সটি দুর্দান্ত যখন আপনি কিছু লাথি মেরেছিলেন এবং তারপরে কোনও কিউ সারিবদ্ধ করার জন্য
স্ট্যাকওভারফ্লোটির দিকে তাকান

2
এর মধ্যে আপনি যদি সেই কোনও আদেশের বিষয়ে আপনার মতামত পরিবর্তন করেন তবে এ্যাওসফোর্টটি বাতিল করতে কী করা যেতে পারে wait? এটি আমার সমস্ত হত্যাকান্ডের জন্য অভেদ্য মনে হয়।
কেন উইলিয়ামস

1
আপনি শুধু কমান্ড হত্যা। waitকেবল কাজ স্টপ পর্যন্ত পূর্ববর্তী বেশী শেষ।
গার্ট সান্দারবি

এই সঙ্গে কাজ করবে nohup?
মাইকেল

11

ব্র্যাড এবং মানকফের উভয় সমাধানই ভাল পরামর্শ। এগুলির উভয়ের সংমিশ্রণের মতো আর একটি হ'ল আপনার সারিটি প্রয়োগ করতে GNU স্ক্রিন ব্যবহার করা । এর ব্যাকগ্রাউন্ডে চালানো সক্ষম হওয়ার সুবিধা রয়েছে, আপনি যখনই এটি পরীক্ষা করে দেখতে পারেন এবং নতুন কমান্ড সন্ধানের পরে পূর্ববর্তী কমান্ডগুলি প্রস্থান করার পরে কার্যকর করার জন্য এগুলি বাফারে পেস্ট করে।

প্রথম রান:

$ screen -d -m -S queue

(প্রসঙ্গক্রমে, এখন কিছু সন্ত্রস্ত সাথে খেলতে একটি ভাল সময়। screenrc ফাইল )

এটি আপনার নামের সারিটির জন্য একটি পটভূমি স্ক্রিন সেশন উত্থাপন করবে।

এখন, আপনি যতটা কমান্ড পছন্দ পছন্দ করুন:

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"

নোট করুন যে আমার লাইনের উপরের "^ এম" হ'ল একটি এমবেডড নিউলাইন পাওয়ার একটি উপায় যা স্ক্রিনটি এটি আপনার বিদ্যমান ব্যাশ শেলের মধ্যে স্টাফ করার পরে ব্যাখ্যা করা হবে। এই ক্রমটি পেতে "CTL-V" ব্যবহার করুন।

এটি স্বয়ংক্রিয় করতে কমান্ড সারি করার জন্য কয়েকটি সাধারণ শেল-স্ক্রিপ্ট তৈরি করা বেশ সহজ হবে। তারপরে, আপনি যখনই আপনার পটভূমির সারির স্থিতি পরীক্ষা করতে চান, আপনি এর মাধ্যমে পুনরায় সংযুক্ত করুন:

screen -S queue -r

প্রযুক্তিগতভাবে, আপনার এমনকি আপনার স্ক্রিন সেশনটির নামকরণ করার প্রয়োজন নেই এবং এটি দুর্দান্ত কাজ করবে, তবে একবার আপনি এটির দিকে নজর রাখার পরে, আপনি যে কোনও উপায়ে সর্বদা চলমান রেখে যেতে চাইবেন। ;-)

অবশ্যই, যদি আপনি এটি করেন তবে এটির আর একটি ভাল উপায় হ'ল বর্তমান উইন্ডোগুলির একটির "কাত" নামকরণ এবং ব্যবহার:

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

এটি চলমান স্ক্রিন সেশনে মূলত কমান্ডটি "টাইপ করুন" বলে মনে হচ্ছে, যাতে প্রথম কমান্ড শেষ হওয়ার পরে শেলটি আবার নিয়ন্ত্রণ লাভ করে, এই কমান্ডটি শুরু হবে। অন্য কথায়, এটি @ ম্যানকফের সমাধানের সমতুল্য, তবে টাইপিংয়ের জন্য একটি ফ্যানসিয়ার সরঞ্জাম ব্যবহার করে।
কেন উইলিয়ামস

খুব সুন্দর - মূল পার্থক্য হ'ল স্ক্রিন সমাধান আরও ভাল অটোমেশন সমর্থন করে। আপনি হাতের কাছে কিছু স্টাফ করতে পারেন, স্ক্রিপ্টগুলি সহ অন্যান্য জিনিস, সমস্ত কিছুই একটি সাধারণ ইন্টারফেস সহ।
জর্দান

@ জর্দান খুব ভাল, এটি আমার পক্ষে কাজ করে। তবে এক্স-এর পরে "স্টাফ" কী?
কনস্টান্টিন

@Konstantin gnu.org/software/screen/manual/html_node/Paste.html#Paste ; (- কাপড় যেন আপনি এটি টাইপ করা যাই হোক না কেন টার্মিনাল মধ্যে অনুসরণ করে ডিআর টি এল)
জর্ডন

@ জর্দান ওহ, আমি এখন দেখছি। এটি একটি আদেশ। আমি ভেবেছিলাম এটি একটি নির্বিচারে স্ট্রিং।
কনস্টান্টিন

8

একটি ইউটিলিটি রয়েছে যা আপনি বর্ণনা করছেন ঠিক সেই ক্ষেত্রে ব্যবহারের ক্ষেত্রে আমি খুব সাফল্যের সাথে ব্যবহার করেছি। সম্প্রতি আমি আমার প্রাথমিক ল্যাপটপটিকে নতুন হার্ডওয়্যারে স্থানান্তরিত করেছি, যার মধ্যে কিছু ফাইলকে একটি এনএএস এবং বাকি অংশগুলি নতুন মেশিনে সরিয়ে নেওয়া জড়িত।

এইভাবে আমি এটি করেছি।

  1. একটি নেটওয়ার্ক সংযোগের সাথে জড়িত সমস্ত মেশিনগুলি সেট আপ করুন যাতে তারা একে অপরের কাছে পৌঁছতে পারে।

  2. যে মেশিন থেকে আপনি ফাইলগুলি সরিয়ে নিয়ে যাচ্ছেন (এরপরে সোর্স মেশিন নামে পরিচিত), তার সাথে আরএসইএনসি ইনস্টল করুন 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. এছাড়াও নিশ্চিত হয়ে নিন যে সমস্ত মেশিনে এসএসএইচ ইনস্টল করা আছে apt-get install openssh-server। টার্গেট মেশিনে পাসওয়ার্ডহীন লগইন করার জন্য উত্স মেশিনে আপনাকে এসএসএইচ স্থাপন করতে হবে। যে পদ্ধতিটি সবচেয়ে বেশি ব্যবহার করা হবে তা হ'ল পাবলিক-কী প্রমাণীকরণ ssh-agent( এটির উদাহরণগুলির জন্য https://www.google.se/search?q=ssh+public+key+authentication দেখুন ) তবে আমি মাঝে মাঝে একটি সহজ পদ্ধতি ব্যবহার করি যা ঠিক কাজ করে পাশাপাশি পাসওয়ার্ড প্রমাণীকরণ। আপনার এসএসএইচ ক্লায়েন্ট কনফিগারেশনে নিম্নলিখিতগুলি যুক্ত করুন (হয় ~/.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:ডিরেক্টরিতে চালান run আরএসআইএনসি দিয়ে ডিরেক্টরিতে ( bigdirতুলনা করা bigdir/) কোনও ট্রিলিং স্ল্যাশ অন্তর্ভুক্ত না করা গুরুত্বপূর্ণ বা আরএসসিএনসি ধরে নেবে যে আপনি bigdir/*অন্যান্য সরঞ্জামগুলির সমতুল্য বোঝাচ্ছেন ।

    টাস্ক স্পুলার প্রম্পটটি ফিরিয়ে দেবে এবং পর পর আপনাকে অনেকগুলি কমান্ড সারি করতে দেয়। tsতর্ক ছাড়াই রান রানটি পরীক্ষা করুন ।

টাস্ক স্পুলারের অনেক বৈশিষ্ট্য রয়েছে যেমন রান কাতাকে পুনরায় সাজানো, নির্দিষ্ট কাজটি চালানো হয় যদি অন্য কোনও কাজ সফলভাবে চালিত হয় ইত্যাদি ইত্যাদি সাহায্য দেখুন ts -h। কমান্ড আউটপুটটি চলার সাথে সাথে আমি কখনও কখনও তদন্ত করি ts -c

এটি করার অন্যান্য পদ্ধতি রয়েছে তবে আপনার ব্যবহারের ক্ষেত্রে এটির মধ্যে রয়েছে টাস্ক স্পুলার। আমি টাইমস্ট্যাম্পগুলি ফাইলের টাইমস্ট্যাম্পগুলি সংরক্ষণের জন্য এসএসএইচের মাধ্যমে আরএসসিএনসি ব্যবহার করতে পছন্দ করি, যা এসএমবি-র অনুলিপি না করে।


আপনার উত্তর আমি সম্পর্কে জানেন না করার জন্য আপনাকে ধন্যবাদ ts, খুব শক্তিশালী এবং সহজ ব্যবহার বলে মনে হচ্ছে, শুধু GitHub উপর forked autotoolized এবং debianized।
অ্যালেক্স

@ অ্যালেক্স আমি আপনার কাঁটাচামড়ার দিকে নজর রেখেছিলাম এবং মূল উত্সটি অটোটুলিং এবং ডিবিয়ানাইজিংয়ের ক্ষেত্রে কী করা হয়েছিল তাতে বিশেষভাবে আগ্রহী ছিলাম এবং আপনার প্রতিশ্রুতিগুলি দেখে এটি মূল উত্সের চেয়ে পৃথক হিসাবে সহজেই উপলভ্য ছিল না। আপনি কি পদক্ষেপে 1 টি নতুন পদক্ষেপের দিকে চাপ দিচ্ছেন? কি মূল উত্স আমদানি করে এবং 2 আপনার সংযোজন দিয়ে প্রতিশ্রুতিবদ্ধ? এটি আপনার উত্সটি ব্রাউজ করা কাউকে (আরও সহজে) মূল উত্সটিতে আপনার সংযোজনকে বিশ্বাস করতে সহায়তা করবে। আমি পিপিএ বা অনুরূপ কিছু ইনস্টল করি না এমন এটি কয়েকটি প্যাকেজ যার মধ্যে এটি নিজের কাঁটা দিয়ে নিজেই তৈরি করা ভাল।
হলম্ব

আপনি জানেন যে আমি আমার চশমা পরিবর্তন করেছি, আমি বিদ্যমান 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 ...

কিছু অন্যান্য পদ্ধতির উপর এটির বড় সুবিধাটি হ'ল প্রথম কাজটি কোনও বিশেষ উপায়ে চালানোর দরকার নেই, আপনি নিজের নতুন কাজ দিয়ে যে কোনও প্রক্রিয়া অনুসরণ করতে পারেন।


সুন্দর স্ক্রিপ্ট যদিও আমি আপনাকে সময়ে সময়ে এটি প্রয়োজন বলে মনে হয় তাই টাস্ক স্পুলার চেষ্টা করার পরামর্শ দেব। আমার উত্তর দেখুন।
হলম্ব

সুদর্শন দেখতে, ধন্যবাদ। টিএস থেকে হারিয়ে যাওয়া একটি জিনিস টিএসএসের আওতায় শুরু করা হয়নি এমন চাকরিগুলি অনুসরণ করার ক্ষমতা বলে মনে হচ্ছে। যদিও আমার ধারণা আপনি একটি নতুন টিএস কাজ শুরু করতে পারেন যার উদ্দেশ্য কেবল একটি বিদ্যমান প্রক্রিয়া শেষ হওয়ার জন্য অপেক্ষা করা।
কেন উইলিয়ামস

প্রকৃতপক্ষে. এটি আপনার সমাধানের একটি কার্যকর দিক।
হলম্ব

2

কমান্ড 1 এবং & কমান্ড 2

  • "এবং&" এর অর্থ হ'ল কমান্ড 2 কেবল 0 এর রিটার্ন কোড সহ কমান্ড 1 শেষ হওয়ার পরে চলে
  • দ্রষ্টব্য: একটি || এর অর্থ হ'ল কমান্ড 2 কেবল 0 ব্যতীত কোনও রিটার্ন কোড দিয়ে কমান্ড 1 শেষ হওয়ার পরে চলে

1

আপনি কেবল শেলটির কমান্ড লাইনে কমান্ড যুক্ত করতে পারেন যা ইতিমধ্যে একটি কমান্ড চালাচ্ছে।

হয় সাবধানে টাইপ করুন, বা এটি অন্য কোথাও টাইপ করুন, যাচাই করুন, এবং কাট-পেস্ট করুন। এমনকি যদি বর্তমান কমান্ড আউটপুটটির লাইনগুলি স্পেল করে চলেছে, আপনি এখনও নতুন কিছু টাইপ করতে পারেন, এন্টার টিপুন এবং এটি সমস্ত চলার আগে কমান্ড চলমান বা প্রবেশ করার পরে এটি চলবে।

উদাহরণ অনুসরণ। আপনি পুরো জিনিসটি কেটে-পেস্ট করতে পারবেন বা 1 তম চলমান অবস্থায় পরবর্তী কমান্ডগুলি সন্নিবেশ করতে পারবেন (যদি আপনি সত্যিই খুব দ্রুত টাইপ করেন), বা সম্ভবত 2 য়টি চলমান অবস্থায় .:

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

0

আমি যে হ্যাকিয়েস্ট উপায়টি ভাবতে পারি তা হ'ল / টিএমপি-তে সহজ লক-ফাইল সহ "সারি" সারিটি বজায় রাখা। যখন file1.sh তার সিপি কমান্ডগুলি করছে, এটি / টিএমপি-তে একটি লক ফাইল (বা হার্ডলিঙ্ক) রাখবে। এটি হয়ে গেলে, ফাইলটি মুছুন। আপনার চয়ন করা নামকরণ স্কিমের সাথে লক ফাইলগুলির জন্য প্রতিটি অন্যান্য স্ক্রিপ্টকে / টিএমপি সন্ধান করতে হবে। স্বাভাবিকভাবেই এটি সমস্ত ধরণের ব্যর্থতার সাপেক্ষে, তবে এটি সেট আপ করা তুচ্ছ এবং ব্যাশের মধ্যে সম্পূর্ণরূপে করণীয়।


কঠিন, অনুশীলন ব্যবহার করার জন্য যেহেতু এটি প্রয়োজন যে প্রত্যেক কাজ আপনি চাহিদা চালাতে চান লক ফাইল রাখার পরিবর্তন করা, এবং চাহিদা জানতে (অথবা পরামিতি হিসেবে গ্রহণ) যা ব্যবহার করার জন্য ফাইল লক। যখনই সম্ভব, কাজের বাইরে সারি সারি রাখা ভাল best
কেন উইলিয়ামস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.