创建锁文件shell

时间:2015-07-13 10:01:10

标签: bash unix

我正在创建一个在我的脚本运行时创建的锁定文件夹,我还将文件移动到子文件夹中进行处理。当脚本结束时,调用TRAP,删除锁定文件夹和内容,所有这些都正常工作。前几天我们遇到了一个问题,当有人从其中一个服务器上取下电源,所以我的TRAP从未被调用过,所以当重新启动时,锁定文件夹仍然存在,这意味着我的脚本无法重新启动,直到他们手动除去。检查脚本是否已在运行的最佳方法是什么?我目前采用这种方法使用进程ID':

if ! mkdir $LOCK_DIR 2>/dev/null; then  # Try to create the lock dir. This should pass successfully first run.
    # If the lock dir exists
    pid=$(cat $LOCK_DIR/pid.txt)
    if [[ $(ps -ef | awk '{print $2}' | grep $pid | grep -v grep | wc -l) == 1 ]]; then 
        echo "Script is already running" 
        exit 1
    else
        echo "It looks like the previous script was killed. Restarting process." 
        # Do some cleanup here before removing dir and re-starting process. 

    fi
fi

# Create a file in the lock dir containing the pid. Echo the current process id into the file. 
touch $LOCK_DIR/pid.txt
echo $$ > $LOCK_DIR/pid.txt

# Rest of script below

2 个答案:

答案 0 :(得分:1)

检查/ proc /和cmdline是一个很好的调用 - 尤其是当您只是检查没有进程ID的进程时,如果进程实际上是您的脚本,则不会。

您仍然可以使用ps命令执行此操作 - 这将提供某种形式的平台不可知论。

COMMAND=$(ps -o comm= -p $pid)
if [[ $COMMAND == my_process ]]
then
    .....

请注意ps的命令行参数将其限制为仅在没有标题的情况下命令。

答案 1 :(得分:0)

现在很多系统都将tmpfs用于像/ tmp这样的目录。因此,重新启动后将始终清除这些目录。

如果使用您的pid文件,请注意您可以轻松查看该命令 在/proc/$pid/cmdline/proc/$pid/exe中的该pid下运行。