Оскільки в сценарії, наданому Джошем Аренбергом, можуть виникнути певні проблеми із завмерливістю (яких я до цього не відчував, але також не досліджував), я щось написав самостійно. Він не повинен мати проблем з тупиком. Він також працює для будь-якої команди оболонки, не тільки 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 секунд друкується пляма.