bash - bash Linux单个实例如果运行太长,则终止

  显示原文与译文双语对照的内容
56 1

我使用以下方法在服务器上保留一个脚本的单个实例。我有cronjob要每分钟运行一次。

如何在unix中创建任意脚本

#!/bin/bash
if [[ $# <1 ]]; then
 echo"Name of pid file not given."
 exit
fi
# Get the pid file's name.
PIDFILE=$1
shift
if [[ $# <1 ]]; then
 echo"No command given."
 exit
fi
echo"Checking pid in file $PIDFILE."
#Check to see if process running.
PID=$(cat $PIDFILE 2>/dev/null)
if [[ $? = 0 ]]; then
 ps -p $PID>/dev/null 2>&1
 if [[ $? = 0 ]]; then
 echo"Command $1 already running."
 exit
 fi
fi
# Write our pid to file.
echo $$> $PIDFILE
# Get command.
COMMAND=$1
shift
# Run command
$COMMAND"$*"

现在我发现我的脚本已经挂起了,因此它被卡住了。我想检查一下 $PIDFILE 是否是"旧的",如果是,杀死进程。我知道这是可以能的( 检查文件上的时间戳),但我不知道语法,如果这是一个好主意。另外,当这个脚本运行时,CPU应该非常频繁地使用。如果挂起( 很少,但至少发生了一次),CPU使用率将下降到 0% 。如果我可以以检查这个过程是否真正挂起/不活跃,但是我不知道是否有一个简单的方法。

时间:原作者:0个回答

101 2

若要在标题中回答与你的问题完全不同的问题,请使用 timeout 命令。

如果你的问题是,我不知道它会挂起,除非你给它提供了一个fifo文件的fifo队列。现在,要运行重生,你可以在启动时运行这里脚本一次:

#!/bin/bash
while/bin/true; do
"$@"
 wait
done

这样就可以在另一个问题的代码中找到另一个 Bug:"$*" 将把所有的参数作为单参数单参数传递给脚本;没有引号,它将使用空格分隔参数。"$@" 将分别传递它们并正确处理空白。

呼叫/path/to/script command [argument]...

原作者:
...