如何使用bash进行文件锁定

时间:2014-09-16 08:24:21

标签: linux bash pid

我有从远程服务器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: - (

3 个答案:

答案 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,我找到了一种更优雅的方式来判断进展是否正在进行。