Como o script fornecido por Josh Arenberg pode ter alguns problemas de impasse (que eu não experimentei até agora, mas também não investiguei), escrevi algo sozinho. Não deve ter problemas de conflito. Também funciona para qualquer comando shell, não apenas para o 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
Ele cria uma cadeia de processos, cada um aguardando o anterior. Se um processo no meio da cadeia travar enquanto aguarda (improvável, mas não impossível), a corrente é interrompida e as duas partes são executadas em paralelo. O mesmo acontece se um dos processos for morto.
Uso como este:
q $COMMAND $ARGS
ou mesmo
q $COMMAND $ARGS; $ANOTHER_COMMAND $MORE_ARGS
Teste, por exemplo, digitando
q sleep 10 &
q echo blubb &
e descobrindo que após 10 segundos o blubb é impresso.