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

mai*_*ash 5 linux bash shell ksh

我有 Linux 集中服务器 \xe2\x80\x93 Linux 5.X。

\n\n

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

\n\n

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

\n\n

我的问题:

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

Mar*_*coS 6

针对 *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
Run Code Online (Sandbox Code Playgroud)

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


wal*_*orn 3

执行此操作的正常方法是将进程 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
Run Code Online (Sandbox Code Playgroud)

这不是很复杂,但应该能让你走上正确的轨道。