我有从远程服务器rsync dir的任务
rsync -av root@s0.foo.com:/srv/data/ /srv/data/
为了使它定期运行并避免脚本“reEnter”问题,我使用rsync进度的pid创建了一个文件锁“in_progress”,它指示程序是否仍在运行。
lock(){
echo $1 > in_progress
}
使用此函数判断rsync进度是否仍在运行:
is_running(){
pid=$(cat in_progress)
return ps aux | awk '{print $2}' | grep $pid
}
我可以使用此
将pid传递给函数lock
$!
我必须把rsync进度背景放到rsync的pid中,所以我得到了这个
rsync -av root@s0.foo.com:/srv/data/ /srv/data/ &
lock $!
但是当rsync进度完成后,我应该锁定文件
我试过这个
rsync -av root@s0.foo.com:/srv/data/ /srv/data/ && rmLock &
lock $!
...然后看来我得到的pid不是rsync进程的pid: - (
答案 0 :(得分:2)
如果你想防止同时执行,flock是一个很好的工具:
$ flock -n /path/to/lock/file -c "rsync -av root@s0.foo.com:/srv/data/ /srv/data/" &
答案 1 :(得分:0)
( rsync -av root@s0.foo.com:/srv/data/ /srv/data/ && rmLock ) &
另外
[ -d /proc/$pid ] && …
答案 2 :(得分:0)
我只是找到了一种解决方法,使用wait
rsync -av root@s0.foo.com:/srv/data/ /srv/data/ &
pid=$!
lock $pid
wait $pid
rmLock $pid
感谢tijagi,我找到了一种更优雅的方式来判断进展是否正在进行。