যেহেতু জোশ আরেনবার্গের দেওয়া স্ক্রিপ্টটিতে কিছু অচলাবস্থার সমস্যা থাকতে পারে (যা আমি এখনও অভিজ্ঞতা করি নি, তবে তদন্তও করি নি), তাই আমি নিজেই কিছু লিখেছিলাম। এটির অচল সমস্যা হওয়া উচিত নয়। এটি কেবল সিপি নয়, কোনও শেল কমান্ডের জন্যও কাজ করে।
Contents of ~/bin/q
#!/bin/bash
#this waits for any PIDs to finish
anywait(){
for pid in "$@"; do
while kill -0 "$pid" 2&>1 >/dev/null; do
sleep 0.5
done
done
}
PIDFILE=~/.q.pid
#open PIDFILE and aquire lock
exec 9>>$PIDFILE
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }
#read previous instances PID from PIDFILE and write own PID to PIDFILE
OLDPID=$(<$PIDFILE)
echo $$>$PIDFILE
#release lock
flock -u 9
#wait for OLDPID
anywait $OLDPID
#do stuff
"$@"
#afterwards: cleanup (if pidfile still contains own PID, truncate it)
flock -w2 9 || { echo "ERROR: flock() failed." >&2; exit 1; }
if [ $(<$PIDFILE) == $$ ]; then
truncate -s0 $PIDFILE
fi
flock -u 9
এটি প্রক্রিয়াগুলির একটি শৃঙ্খল তৈরি করে, প্রতিটি পূর্ববর্তীটির জন্য অপেক্ষা করে। যদি অপেক্ষা করার সময় শৃঙ্খলার মাঝখানে কোনও প্রক্রিয়া ক্র্যাশ হয়ে যায় (সম্ভাব্য তবে অসম্ভব নয়) তবে চেইনটি নষ্ট হয়ে যায় এবং উভয় অংশ সমান্তরালে চলতে থাকে। প্রক্রিয়াগুলির মধ্যে একটি মারা গেলে একই ঘটে happens
এর মতো ব্যবহার:
q $COMMAND $ARGS
অথবা এমনকি
q $COMMAND $ARGS; $ANOTHER_COMMAND $MORE_ARGS
পরীক্ষা যেমন টাইপ করে
q sleep 10 &
q echo blubb &
এবং 10 সেকেন্ড পরে ব্লাব মুদ্রণ করা হবে তা সন্ধান করুন।