使用flock实现脚本互斥执行

还是在上午配置实验室服务器rsync的时候,发现如果目标文件非常多的时候,crontab中执行一次rsync的速度会很慢,这样很可能发生“追 尾”。

其实,我们可以用Linux下自带的flock命令在shell中实现互斥执行

flock (util-linux 2.13-pre7)
Usage: flock [-sxun][-w #] fd#
       flock [-sxon][-w #] file [-c] command...
  -s  --shared     Get a shared lock
  -x  --exclusive  Get an exclusive lock
  -u  --unlock     Remove a lock
  -n  --nonblock   Fail rather than wait
  -w  --timeout    Wait for a limited amount of time
  -o  --close      Close file descriptor before running command
  -c  --command    Run a single command string through the shell
  -h  --help       Display this text
  -V  --version    Display version

我们使用-x和-n选项,这样的行为是:对指定的锁文件,如果存在直接失败,如果不存在,则加上锁。

这与我们在shell里面touch是不一样的,因为我们的touch和判断不是原子操作。

因此,最终的脚本就是

flock -xn $LOCK -c "sshpass -p $REMOTE_PASS rsync -avz --delete -e ssh $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR $LOCAL_DIR"

Leave a Reply

Your email address will not be published.