একাধিক ব্যাশ স্ক্রিপ্ট কল করা এবং সেগুলি ক্রমানুসারে নয়, সমান্তরালে চালানো


19

ধরুন যে, আমি তিন (আরও OR) ব্যাশ স্ক্রিপ্ট আছে: script1.sh, script2.sh, এবং script3.sh। আমি এই তিনটি স্ক্রিপ্টকে কল করতে এবং এগুলিকে সমান্তরালে চালাতে চাই । এটি করার একটি উপায় হ'ল নিম্নলিখিত আদেশগুলি কার্যকর করা:

nohup bash script1.sh &
nohup bash script2.sh &
nohup bash script3.sh &

(সাধারণভাবে, স্ক্রিপ্টগুলি শেষ হতে বেশ কয়েক ঘন্টা বা দিন সময় নিতে পারে, তাই আমি ব্যবহার করতে চাই nohupযাতে তারা আমার কনসোলটি বন্ধ হয়ে গেলেও চলতে থাকে))

তবে, একক কলের সাথে সমান্তরালে এই তিনটি কমান্ড কার্যকর করার কোনও উপায় আছে কি?

আমি এমন কিছু ভাবছিলাম

nohup bash script{1..3}.sh &

কিন্তু এই চালানো হচ্ছে script1.sh, script2.shএবং script3.shক্রমানুসারে সমান্তরাল না।


2
"একক কল" এর অর্থ কী?
jw013

1
ব্যবহারের ক্ষেত্রে কী? আপনার কি এক মিলিয়ন স্ক্রিপ্ট শুরু করার আছে?
l0b0

@ jw013 আমার অর্থ, একক শর্ট লাইন কমান্ডের মতো কিছু। যদি আমার কাছে 100 টি স্ক্রিপ্ট শুরু হয় তবে আমি 100 টি বিভিন্ন সময় টাইপ না করে কিছু ছোট (যেমন nohup bash script{1..100}.sh &বা for i in {1..100}; do nohup bash script{1..100} &; done) টাইপ করতে সক্ষম হতে চাই nohup bash script*.sh &
অ্যান্ড্রু

1
যদি স্ক্রিপ্টগুলির দরকারী আউটপুট থাকে: কনসোল সমস্যা সমাধানের জন্য আপনি এগুলি screenখুব (বা tmux) এর মধ্যেই শুরু করতে পারেন তবে আউটপুট (এবং ইনপুট) অ্যাক্সেস রাখতে পারেন।
হাউক লেগেইজ

1
এমন কোনও কিছুই নেই যা আপনাকে একই লাইনে 3 টি কমান্ড টাইপ করতে বাধা দেয়। nohup ... & nohup ... & nohup ... &। এর পরিবর্তে যদি আপনি বোঝাতে চান যে আপনি প্রতিটি স্ক্রিপ্টের নাম পৃথকভাবে টাইপ না করে সমস্ত স্ক্রিপ্ট চালাতে চান, একটি সাধারণ লুপ এটি করবে।
jw013

উত্তর:



14

আরও ভাল উপায় হ'ল জিএনইউ প্যারালাল ব্যবহার করা । জিএনইউ সমান্তরাল সহজ এবং এটির সাহায্যে আমরা কাজের উপর আরও নিয়ন্ত্রণের সাথে সমান্তরালভাবে চলার জন্য কাজ করার সংখ্যাটি নিয়ন্ত্রণ করতে পারি।

নীচের কমান্ডে, script{1..3}.shপ্রসারিত হয় bashএবং সমান্তরালে আর্গুমেন্ট হিসাবে প্রেরণ করা হয়। এখানে -j0ইঙ্গিত দেয় যে যতটা সম্ভব চাকরী চালানো উচিত। ডিফল্টরূপে parallelএকটি সিপিইউ কোরের জন্য একটি কাজ চালায়।

$ parallel -j0 bash :::: <(ls script{1..3}.sh)

এবং আপনি ব্যবহার করার চেষ্টা করতে পারেন

$ parallel -j0 bash ::: script{1..3}.sh

দ্বিতীয় পদ্ধতিটি কার্যকর করার সময় যদি আপনি কোনও ত্রুটি বার্তা পান তবে তার অর্থ হ'ল --tollefবিকল্পটি সেট করা আছে /etc/parallel/configএবং এটি মুছতে হবে এবং প্রতিটি জিনিস ঠিকঠাক কাজ করবে।

আরও সমৃদ্ধ বিকল্পের জন্য আপনি GNU Parallelsম্যান পৃষ্ঠাটি এখানে পড়তে পারেন ।

এবং যদি আপনি কোনও রিমোট মেশিন থেকে কাজ চালাচ্ছেন তবে আরও ভাল ব্যবহার করুন screenযাতে নেটওয়ার্কের সমস্যার কারণে সেশনটি বন্ধ না হয়। nohupনিয়ে আসছে যেমন ব্যাশ সাম্প্রতিক সংস্করণ হিসেবে প্রয়োজন হয় না huponexitযেমন offএবং এই পাঠানো পিতা বা মাতা শেল প্রতিরোধ করবে HUPতার প্রস্থান সময় তার শিশুদের সংকেত। যদি এটি আনসেট না হয় তবে এটি দিয়ে করুন

$ shopt -u huponexit  

আপনি যদি bashশেল হিসাবে ব্যবহার করতে যাচ্ছেন parallel -j0 bash :::: <(ls script{1..3}.sh)তবে কমে যেতে পারে parallel -j0 bash :::: script{1..3}.sh?
iruvar

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

এর .. সে ক্ষেত্রে কেন হবে না parallel -j0 bash ::: script{1..3}.sh?
ইরুভার

এটা bash ::: script{1..3}.shপাস করা হচ্ছে parallel, না ::: script{1..3}.sh। তাই এই প্রথম প্রসারিত করা উচিত parallel bash ::: script1.sh script2.sh script3.shশেল এবং তারপর parallelএর আমন্ত্রণ bash script1.sh, bash script2.sh, bash script3.sh। আমি চেষ্টা করেছিলাম
Ivar

1
না আমি বিভ্রান্ত নই, আমি কেবল এটুকু বলছি যে ওপি'র সমস্যাটি আরও ভাল সমাধান করা parallel -j0 bash ::: script{1..3}.sh- এটি ::::পদ্ধতির চেয়ে ভাল কারণ এটি প্রক্রিয়া প্রতিস্থাপনের প্রয়োজনীয়তা এড়ায়। এছাড়াও ls আউটপুট
পার্সিংয়ের সমস্যাগুলি পড়ে যায়

9

আমরা xargsসমান্তরালে একাধিক স্ক্রিপ্ট চালাতেও ব্যবহার করতে পারি ।

$ ls script{1..5}.sh|xargs -n 1 -P 0 bash

এখানে প্রতিটি স্ক্রিপ্ট পৃথকভাবে যুক্তি হিসাবে bash এ পাস করা হয়। -P 0ইঙ্গিত দেয় যে সমান্তরাল প্রক্রিয়া সংখ্যা যতটা সম্ভব হতে পারে। এটি আরও নিরাপদ যে ব্যাশ ডিফল্ট ব্যবহার করা job control feature (&)


5

একটি একক লাইন সমাধান:

$ nohup bash script1.sh & nohup bash script2.sh & nohup bash script3.sh &

কম আকর্ষণীয়ভাবে, কেবল একটি র‍্যাপার স্ক্রিপ্ট ব্যবহার করুন:

$ cat script.sh
#!/usr/bin/env bash
script1.sh &
script2.sh &
script3.sh &
$ nohup script.sh &

বা তাদের উপর লুপ:

for script in dir/*.sh
do
    nohup bash "$script" &
done

2

আপনি যদি নিজেকে কিছু টাইপ করার প্রচেষ্টা বাঁচানোর চেষ্টা করছেন

eval "nohup bash "script{1..3}.sh" &"

বা দ্বিতীয় চিন্তা, সম্ভবত না


1

এই সরঞ্জামটি চেকআউট করুন: https://github.com/wagoodman/bashful

বলুন আপনার mytasks.yamlসাথে আছে

tasks:
    - name: A title for some tasks
      parallel-tasks:
        - cmd: ./script1.sh
        - cmd: ./script2.sh -x an-arg
        - cmd: ./script3.sh -y some-other-arg

এবং আপনি এটির মতো চালান:

nohup bashful run mytasks.yaml

আপনার স্ক্রিপ্টগুলি উল্লম্ব অগ্রগতির বারের সাথে সমান্তরালভাবে চালিত হবে (+ আপনি যদি এটি আগে চালিয়ে থাকেন এবং সময়টি নির্মাতামূলক হয়)। আপনি এখানে প্রদত্ত 3 এর চেয়ে বেশি চালানো শুরু করলে আপনি সমান্তরালভাবে কতগুলি কাজ চালাতে চান তা টুইট করতে পারেন:

config:
    max-parallel-commands: 6
tasks:
    ...

দাবি অস্বীকার: আমি লেখক।


0

আমি স্রেফ লিখেছি এমন একটি আরও সহজ ইউটিলিটি প্রস্তাব করছি। এটি বর্তমানে সমান বলা হয়, তবে শীঘ্রই পার্ল বা pll নামকরণ করা হবে, এখনও সিদ্ধান্ত নেয়নি।

https://github.com/k-bx/par

এপিআই এত সহজ:

par "script1.sh" "script2.sh" "script3.sh"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.