由于Josh Arenberg给出的脚本可能会遇到一些僵局的问题(到目前为止,我没有遇到过,但也没有进行调查),所以我自己编写了一些东西。它应该没有死锁问题。它也适用于任何shell命令,而不仅仅是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秒钟后打印出blubb。