【问题标题】:Linux Single Instance Kill if running too longLinux Single Instance Kill 如果运行时间过长
【发布时间】:2012-05-02 15:40:07
【问题描述】:

我正在使用以下内容来保持在我的服务器上运行的单个脚本实例。我有一个 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 是否“旧”,如果是,则终止该进程。我知道这是可能的(检查文件上的时间戳),但我不知道语法,或者这是否是个好主意。此外,当此脚本运行时,CPU 应该会被大量使用。如果它挂起(很少见,但到目前为止至少发生过一次),CPU 使用率下降到 0%。如果我可以检查该进程是否真的挂起/未激活,那就太好了,但我不知道是否有一种简单的方法可以做到这一点(而且我不想在它被杀死的地方出现很多误报,但它是运行良好)。

【问题讨论】:

    标签: linux bash daemon


    【解决方案1】:

    要回答标题中看起来与您的问题完全不同的问题,请使用timeout

    现在,对于你的问题,我看不出它会挂在哪里,除非你给它一个 pid 文件的 fifo 队列。现在,要运行和重生,您只需在启动时运行此脚本一次:

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

    这会在您从另一个问题得到的代码中带来另一个错误:"$*" 会将所有参数作为 single 参数传递给脚本;如果没有引号,它将用空格分割参数。 "$@" 将单独传递它们并正确处理空白。

    致电/path/to/script command [argument]...

    【讨论】:

    • 谢谢,我真的不太了解 bash 脚本(例如 "$*""$@"),现在我明白了为什么我一开始运行命令时会出现奇怪的错误。超时看起来像我想要的。
    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 2020-04-16
    • 2018-04-07
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多