(বাশ) স্ক্রিপ্ট এ, স্ক্রিপ্ট বি এর জন্য অপেক্ষা করুন, তবে এটির শিশু প্রক্রিয়া নয়


9

সুতরাং আমার স্ক্রিপ্টএ রয়েছে যা এটি করে:

ssh server1 -- scriptB &
ssh server2 -- scriptB &
ssh server3 -- scriptB &
wait
otherstuffhappens

স্ক্রিপ্টবি করে:

rsync -av /important/stuff/. remoteserver:/remote/dir/.
rsync -av /not/so/important/stuff/. remoteserver:/remote/dir/. &
exit

আমার কাঙ্ক্ষিত ফলাফল স্ক্রিপ্টএ এগিয়ে যাওয়ার আগে স্ক্রিপ্টবি এর সমস্ত দৃষ্টান্ত শেষ হওয়ার অপেক্ষা করবে, যা বর্তমানে এটি করে, তবে এটি অতীব গুরুত্বপূর্ণ স্টাফের ব্যাকগ্রাউন্ড আরএসএনসিএসের জন্যও অপেক্ষা করে। এগুলি বৃহত্তর ফাইল যা আমি অপেক্ষা করতে চাই না।

আমি নোহুপ, অস্বীকার এবং & এর মধ্যে পার্থক্যটি পড়েছি এবং বিভিন্ন সমন্বয় চেষ্টা করেছি, তবে আমি যে ফলাফলটি সন্ধান করছি তা পাচ্ছি না।

এই মুহুর্তে আমি বেশ স্টাম্পড। কোন সাহায্য প্রশংসা হবে!

উত্তর:


15

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

সুতরাং, এর চারপাশে কাজ করার জন্য, ব্যাকগ্রাউন্ড rsyncকমান্ডের আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করুন বা /dev/nullআপনি যদি এটি যত্ন না করেন তবে। আপনার স্টেডারকেও পুনর্নির্দেশ করা উচিত, কারণ এসএসডি যদি সংশ্লিষ্ট পাইপটির জন্য অপেক্ষা না করে, sshdপ্রস্থান করার পরে , পাইপটি ভেঙে যায় তাই rsyncস্টাডারে লেখার চেষ্টা করলে হত্যা করা হবে।

তাই:

rsync ... > /dev/null 2>&1 &

তুলনা করা:

$ time ssh localhost 'sleep 2 &'
ssh localhost 'sleep 2 &'  0.05s user 0.00s system 2% cpu 2.365 total
$ time ssh localhost 'sleep 2 > /dev/null &'
ssh localhost 'sleep 2 > /dev/null &'  0.04s user 0.00s system 12% cpu 0.349 total

এবং:

$ ssh localhost '(sleep 1; ls /x; echo "$?" > out) > /dev/null &'; sleep 2; cat out
141  # ls by killed with SIGPIPE upon writing the error message
$ ssh localhost '(sleep 1; ls /x; echo "$?" > out) > /dev/null 2>&1 &'; sleep 2; cat out
2    # ls exited normally after writing the error on /dev/null instead
     # of a broken pipe

4

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

নির্দিষ্ট পটভূমির কাজগুলিকে বিশেষভাবে উপেক্ষা করার জন্য আপনি পিআইডি ক্যাপচার করতে পারেন ( $!এটি সর্বশেষ পটভূমির কাজ পিআইডি) এবং wait $pidকেবলমাত্র সেই কাজ শেষ হওয়ার জন্য অপেক্ষা করতে পারেন।


3

-fপতাকা sshসংশোধন করা হয়েছে সমস্যা। পরীক্ষিত:

#!/bin/sh -e
echo $$_script__begin
( echo sleeping; sleep 2; echo slept )&
echo $$_script__end

আমি যখন এটি চালাচ্ছি ssh localhost ./script, এটি প্রদর্শিত না হওয়া পর্যন্ত অপেক্ষা sleptকরে। সঙ্গে -fপতাকা, এটা এ প্রস্থান করে echo $$_script__endএবং sleptপরে পটভূমিতে দেখায় পর sshকমান্ড ফিরে এসেছে।


2

এটি ওপেনএসএসএইচ সার্ভারের একটি পরিচিত সমস্যা, এটি আপস্ট্রিম বাগজিলা # 2071 তে বর্ণিত এবং আলোচিত । বাগটিতে ওপেনএসএসএইচ পাশের বেশিরভাগ কাজের প্রস্তাব রয়েছে, তবে স্ক্রিপ্টের জন্যও।

আপনি যদি স্ক্রিপ্টগুলির আউটপুটটির জন্য অপেক্ষা করতে চান তবে আপনার খুব waitআগে একটি যুক্ত করা উচিত ।exitscriptB

আপনি যদি আউটপুট সম্পর্কে চিন্তা না করেন তবে কিছু প্রকরণ nohupএবং আইও পুনঃনির্দেশের ব্যবহার করুন /dev/null, যা সমস্যাটি একইভাবে সমাধান করবে।


1

আপনি এটি চেষ্টা করতে পারেন। $!ডিফল্ট শেল পরিবর্তনশীল যা সর্বাধিক সম্পাদিত ব্যাকগ্রাউন্ড পাইপলাইন / প্রক্রিয়াটির প্রসেস আইডি ধারণ করে।

command1 &
lpid1=$!

command2 &
lpid2=$!

command3 &
lpid=$!

wait $lpid1  # waits for only the process with PID lpid1  to complete. 

exportপরিবর্তনশীল ইত্যাদি ব্যবহার করে আপনার স্ক্রিপ্ট অনুযায়ী এটি ব্যবহার করা দরকার


1

খ এর নিজস্ব ব্যাকগ্রাউন্ড প্রক্রিয়াগুলির জন্য অপেক্ষা করা দরকার:

rsync -av /important/stuff/. remoteserver:/remote/dir/.
rsync -av /not/so/important/stuff/. remoteserver:/remote/dir/. &
wait
exit

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