繁体   English   中英

如何使用bash锁定文件

[英]How to make file lock with bash

我有一个任务要从远程服务器rsync一个目录

rsync -av root@s0.foo.com:/srv/data/ /srv/data/ 

为了使其正常运行并避免脚本“ reEnter”问题,我使用rsync progress的pid创建了一个文件锁“ in_progress”,它指示程序是否仍在运行。

lock(){
    echo $1 > in_progress
}

使用此函数来判断rsync进度是否仍在运行:

is_running(){
   pid=$(cat in_progress)
   return ps aux | awk '{print $2}' | grep $pid
}

我可以用这个来传递给函数lock的PID

$!

我必须放置rsync进度背景来获取rsync的pid,所以我得到了这个

rsync -av root@s0.foo.com:/srv/data/ /srv/data/ & 
lock $!

但是当rsync进度完成后,我应该rm锁定文件
我试过了

rsync -av root@s0.foo.com:/srv/data/ /srv/data/ && rmLock & 
lock $!

...那么看来我得到的pid不是rsync进度的pid :-(

如果要防止同时执行,flock是一个不错的工具:

$ flock -n /path/to/lock/file -c "rsync -av root@s0.foo.com:/srv/data/ /srv/data/" &
( rsync -av root@s0.foo.com:/srv/data/ /srv/data/ && rmLock ) & 

[ -d /proc/$pid ] && …

我只是找到一种解决方法,使用wait

rsync -av root@s0.foo.com:/srv/data/ /srv/data/ &
pid=$!
lock $pid
wait $pid
rmLock $pid

多亏了tijagi,我找到了一种更优雅的方法来判断进度是否正在运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM