Josh Arenberg tarafından verilen senaryoda bazı kilitlenme sorunları olabileceğinden (şimdiye kadar deneyimlemediğim, ancak araştırmadım), kendi başıma bir şey yazdım. Kilitlenme problemleri olmamalıdır. Ayrıca sadece cp için değil, herhangi bir kabuk komutu için çalışır.
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
Her biri öncekini bekleyen bir süreç zinciri oluşturur. Zincirin ortasındaki bir işlem beklerken çökerse (olası değil ancak imkansız değil), zincir kırılır ve her iki parça paralel olarak çalışır. İşlemlerden biri öldürülürse aynı şey olur.
Bunun gibi kullanım:
q $COMMAND $ARGS
ya da
q $COMMAND $ARGS; $ANOTHER_COMMAND $MORE_ARGS
Örneğin yazarak test edin
q sleep 10 &
q echo blubb &
ve 10 saniye sonra blubb basıldığını bulmak.