1 min read

Linux 脚本引入锁机制

Linux 脚本引入锁机制

背景

有些场景下,你想让脚本在同一时间下不允许重复执行。此时,就需要用到锁的概念了。

方案

flock 工具

flock 是 Linux 自带的文件锁工具,可直接避免重复进程。

#!/usr/bin/env bash

flock -xn /tmp/rsync.lock -c "COMMAND"
if [ $? -ne 0 ]; then
    echo "[ $(basename $0 .sh) ] 已在运行,跳过本次执行!"
    exit 1
fi

参数注解:

  • -x: 独占锁;
  • -n: 非阻塞模式(若锁被占用,立即退出);
  • -c: 指定需要执行的命令。

锁文件

自行创建一个锁文件,执行之前判断锁文件是否存在,不存在执行,反之。

#!/usr/bin/env bash

LOCK_FILE="/tmp/cmd.lock"

# 判断锁文件
if [ ! -f "$LOCK_FILE" ]; then
    
    # 创建锁文件
    touch "$LOCK_FILE"

    # 确保锁文件在脚本退出时被删除
    trap 'rm -f "$LOCK_FILE"' EXIT
    
    # 执行命令
    COMMAND
else
    echo "[ $(basename $0 .sh) ] 已在运行,跳过本次执行!"
    exit 1
fi
该方法有个弊端,如果你提前创建了同名的锁文件,那么脚本就永远都会跳过执行!

查询进程

...

小结

建议使用flock工具来实现。