如果某些内容正在运行,如何检入bash脚本,如果是,则退出

时间:2009-05-29 17:04:36

标签: bash scripting

我有一个每15分钟运行一次的脚本,但有时如果盒子忙,它会挂起,下一个过程将在第一个完成创建雪球效果之前开始。如何在bash脚本中添加几行以在开始之前检查某些内容是否正在运行?

9 个答案:

答案 0 :(得分:13)

如果您知道进程名称,则可以使用pidof -x;如果您知道PID,则可以使用kill -0

示例:

if pidof -x vim > /dev/null
then
    echo "Vim already running"
    exit 1
fi

答案 1 :(得分:5)

为什么不设置锁文件?

这样的东西
  

yourapp.lock

只需在处理完成后将其删除,并在启动之前检查它。

可以使用

完成
if [ -f yourapp.lock ]; then
echo "The process is already launched, please wait..."
fi

答案 2 :(得分:3)

pgrep -f yourscript >/dev/null && exit

答案 3 :(得分:3)

代替pidfiles,只要您的脚本具有唯一可识别的名称,您就可以执行以下操作:

#!/bin/bash
COMMAND=$0
# exit if I am already running
RUNNING=`ps --no-headers -C${COMMAND} | wc -l`
if [ ${RUNNING} -gt 1 ]; then
  echo "Previous ${COMMAND} is still running."
  exit 1
fi
... rest of script ...

答案 4 :(得分:3)

这就是我在我的一个cron工作中的表现

lockfile=~/myproc.lock
minutes=60
if [ -f "$lockfile" ]
then
  filestr=`find $lockfile -mmin +$minutes -print`
  if [ "$filestr" = "" ]; then
    echo "Lockfile is not older than $minutes minutes! Another $0 running. Exiting ..."
    exit 1
  else
    echo "Lockfile is older than $minutes minutes, ignoring it!"
    rm $lockfile
  fi
fi

echo "Creating lockfile $lockfile"
touch $lockfile

并删除脚本末尾的锁文件

echo "Removing lock $lockfile ..."
rm $lockfile

答案 5 :(得分:2)

答案 6 :(得分:2)

我最近有同样的问题,从上面发现kill -0最适合我的情况:

echo "Starting process..."
run-process > $OUTPUT &
pid=$!
echo "Process started pid=$pid"
while true; do
    kill -0 $pid 2> /dev/null || { echo "Process exit detected"; break; }
    sleep 1
done
echo "Done."

答案 7 :(得分:1)

要扩展@bgy所说的内容,安全 atomic 创建锁文件的方法(如果它还不存在),如果不存在则失败,就是创建一个临时文件,然后将其硬链接到标准锁定文件。这可以防止在您测试文件和创建文件之间创建文件的另一个进程。

以下是我的每小时备份脚本中的锁定文件代码:

echo $$ > /tmp/lock.$$
if ! ln /tmp/lock.$$ /tmp/lock ; then 
        echo "previous backup in process"
        rm /tmp/lock.$$
        exit
fi

完成后不要忘记删除锁定文件和临时文件,即使您因错误提前退出也是如此。

答案 8 :(得分:1)

使用此脚本:

FILE="/tmp/my_file"
if [ -f "$FILE" ]; then
   echo "Still running"
   exit
fi
trap EXIT "rm -f $FILE"
touch $FILE

...script here...

此脚本将创建一个文件并在退出时将其删除。