如何确保我的bash脚本尚未运行?

dan*_*anb 13 bash

我有一个bash脚本我想从cron每5分钟运行一次...但是有可能前一次运行的脚本还没有完成......在这种情况下,我希望新的运行只是退出.我不想只依赖/ tmp中的锁文件..我想确保在我尊重锁文件(或其他)之前该进程实际上正在运行...

这是我到目前为止从互联网上窃取的内容......我如何让它变得有点聪明?还是有一种完全不同的方式更好?

if [ -f /tmp/mylockFile ] ; then
  echo 'Script is still running'
else
  echo 1 > /tmp/mylockFile
  /* Do some stuff */
  rm -f /tmp/mylockFile
fi
Run Code Online (Sandbox Code Playgroud)

Dig*_*oss 20

# Use a lockfile containing the pid of the running process
# If script crashes and leaves lockfile around, it will have a different pid so
# will not prevent script running again.
# 
lf=/tmp/pidLockFile
# create empty lock file if none exists
cat /dev/null >> $lf
read lastPID < $lf
# if lastPID is not null and a process with that pid exists , exit
[ ! -z "$lastPID" -a -d /proc/$lastPID ] && exit
echo not running
# save my pid in the lock file
echo $$ > $lf
# sleep just to make testing easier
sleep 5
Run Code Online (Sandbox Code Playgroud)

此脚本中至少有一个竞争条件.不要将它用于生命支持系统,哈哈.但它应该适用于您的示例,因为您的环境不会同时启动两个脚本.有很多方法可以使用更多的原子锁,但它们通常依赖于可选的安装特定的东西,或者在NFS等上以不同的方式工作......


kal*_*ali 9

flock如果您有幸在分发中获取该命令,您可能需要查看该命令的手册页.

NAME
       flock - Manage locks from shell scripts
SYNOPSIS
       flock [-sxon] [-w timeout] lockfile [-c] command...


小智 7

永远不要使用锁文件总是使用锁目录.在您的特定情况下,它不是那么重要,因为脚本的开始是以5分钟的间隔安排的.但是,如果您将此代码重新用于Web服务器cgi脚本,那么您就会敬酒.

if mkdir /tmp/my_lock_dir 2>/dev/null
then
   echo "running now the script"
   sleep 10
   rmdir /tmp/my_lock_dir
fi
Run Code Online (Sandbox Code Playgroud)

如果您有过时的锁,则会出现问题,意味着锁存在但没有关联的进程.你的cron永远不会运行.

为什么要使用目录?因为mkdir是一个原子操作.一次只有一个进程可以创建目录,所有其他进程都会出错.这甚至适用于共享文件系统,甚至可能在不同的操作系统类型之间.