เนื่องจากสคริปต์ที่ Josh Arenberg มอบให้อาจมีปัญหาเกี่ยวกับการหยุดชะงัก (ซึ่งฉันยังไม่เคยสัมผัสมาก่อน ไม่ควรมีปัญหาการหยุดชะงัก นอกจากนี้ยังใช้งานได้กับคำสั่งเชลล์ใด ๆ ไม่ใช่แค่ cp
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
มันสร้างห่วงโซ่ของกระบวนการแต่ละรอก่อนหน้านี้ หากกระบวนการที่อยู่ตรงกลางของโซ่หยุดทำงานขณะรอ (ไม่น่าจะเป็นไปไม่ได้ แต่เป็นไปไม่ได้) โซ่นั้นจะแตกและทั้งสองส่วนจะทำงานแบบขนาน สิ่งเดียวกันนี้จะเกิดขึ้นหากกระบวนการใดกระบวนการหนึ่งถูกฆ่า
การใช้งานเช่นนี้:
q $COMMAND $ARGS
หรือแม้กระทั่ง
q $COMMAND $ARGS; $ANOTHER_COMMAND $MORE_ARGS
ทดสอบเช่นโดยการพิมพ์
q sleep 10 &
q echo blubb &
และพบว่าหลังจากผ่านไป 10 วินาทีจะถูกพิมพ์ออกมา