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

问题描述 投票:2回答:5

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

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

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

我的问题:

  • 如何避免运行多个进程/脚本实例?
linux bash shell ksh
5个回答
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

这不是很详尽,但是应该使您走上正确的轨道。


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

UPDATE:回答OP注释,我使用trap命令添加处理程序中断和段错误。


1
投票

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

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


0
投票

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


0
投票

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

PIDLOG="/var/scripts/PID.txt" # Temp file
if [ ! -f "$PIDLOG" ]; then
        echo $$ > "$PIDLOG" # Print actual PID into a file
else
    if [ $(ps -ef | awk '{print $2}' | grep -c "^$(cat "$PIDLOG")$") -gt 0 ]; then
        exit # Exit if the PID is active
    else
        echo $$ > "$PIDLOG" # Print actual PID into a file
    fi
fi
© www.soinside.com 2019 - 2024. All rights reserved.