Shell脚本以及如何避免在Linux机器上同时运行相同的脚本

时间:2014-11-24 09:13:52

标签: linux bash shell ksh

我有Linux集中服务器 - Linux 5.X。

在某些情况下,在我的Linux服务器上, get_hosts.ksh 脚本可以从其他一些不同的主机运行。

例如 get_hosts.ksh 可以在我的Linux机器上同时运行三次或更多次。

我的问题:

  • 如何避免运行多个进程/脚本实例?

5 个答案:

答案 0 :(得分:2)

执行此操作的常规方法是将进程ID写入文件。脚本执行的第一件事是检查文件是否存在,读取pid,检查是否存在具有该pid的进程,以及对于额外的偏执点,如果该进程实际运行脚本。如果是,则退出脚本。

这是一个简单的例子。有问题的过程是二进制文件,此脚本确保二进制文件只运行一次。这不是您所需要的,但您应该能够适应这一点:

RUNNING=0
PIDFILE=$PATH_TO/var/run/example.pid
if [ -f $PIDFILE ]
then
  PID=`cat $PIDFILE`
  ps -eo pid | grep $PID >/dev/null 2>&1
  if [ $? -eq 0 ]
  then
      RUNNING=1
  fi
fi
if [ $RUNNING -ne 1 ]
then
    run_binary
    PID=$!
    echo $PID > $PIDFILE
fi

这不是很精细,但应该让你走上正轨。

答案 1 :(得分:2)

* nix系统上的问题的常见解决方案是检查锁定文件是否存在 通常锁文件包含当前进程PID 这是一个示例ksh脚本:

#!/bin/ksh

pid="/var/run/get_hosts.pid"
trap "rm -f $pid" SIGSEGV
trap "rm -f $pid" SIGINT

if [ -e $pid ]; then
    exit # pid file exists, another instance is running, so now we politely exit
else
    echo $$ > $pid # pid file doesn't exit, create one and go on
fi

# your normal workflow here...

rm -f $pid # remove pid file just before exiting
exit

更新:回答OP评论,我使用trap命令添加处理程序中断和段错误。

答案 2 :(得分:1)

您可以使用pid文件来跟踪进程的运行时间。在脚本的顶部,检查是否存在pid文件,如果它不存在,则创建它并运行脚本,否则返回。

可以在此answer to a similar question中看到一些示例代码。

答案 3 :(得分:0)

您可以考虑使用(可选)lockfile(1)命令(由Debian上的procmail包提供)。

答案 4 :(得分:0)

我有很多脚本,并使用下面的代码来防止多次/模拟运行:

PID="/var/scripts/PID.txt" # Temp file
if [ ! -f "$PID" ]; then
    echo $$ > "$PID" # Print actual PID into a file
else
    ps -p $(cat "$PID") > /dev/null && exit || echo $$ > "$PID"
fi