我使用以下内容来保持在我的服务器上运行的脚本的单个实例。我每分钟都有一个cronjob来运行它。
How do I daemonize an arbitrary script in 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
是否是#34;旧的&#34;如果是这样,就杀了这个过程。我知道这是可能的(检查文件的时间戳),但我不知道语法或者这是否是个好主意。此外,当此脚本运行时,CPU应该被大量使用。如果它挂起(很少见,但到目前为止至少发生过一次),CPU使用率下降到0%。如果我可以检查过程是否真的挂起/不活动会很好,但我不知道是否有一种简单的方法可以做到这一点(而且我不想要有很多误报在哪里被杀死但是它运行正常。)
答案 0 :(得分:2)
要回答标题中与问题完全不同的问题,请使用timeout
。
现在,对于你的问题,我看不到它可以挂起的地方,除非你为pid文件提供了一个fifo队列。现在,要运行并重新生成,您可以在启动时运行此脚本一次:
#!/bin/bash
while /bin/true; do
"$@"
wait
done
这会在另一个问题的代码中出现另一个错误:"$*"
会将所有参数作为单个参数传递给脚本;没有引号它会用白色空格分割参数。 "$@"
会单独传递它们并正确处理空白区域。
使用/path/to/script command [argument]...
致电。