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 초 후에 blubb가 인쇄되는 것을 발견했습니다.