[英]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.