Bash脚本:确保进程已终止而无需等待

时间:2014-12-09 05:42:54

标签: linux bash

以下Bash脚本在Tomcat上调用shutdown,等待120秒,然后终止进程(如果认为有必要)。

问题是用户必须等待120秒,无论进程是否已经终止。在Bash中,如果进程已终止,如何修改脚本以立即退出,或者如果某个时间段已经过去则将其终止?

sh $PROGRAMX_HOME/server/bin/shutdown.sh 2>/dev/null
sleep 120
PROCESS_ID=`ps -ef | grep programx | grep -v grep | awk '{print $2}' `
if [ "x$PROCESS_ID" != "x" ]
then
        kill -6 $PROCESS_ID 2>&1 >/dev/null
fi

2 个答案:

答案 0 :(得分:1)

用于检测进程的相同方法仍然可以运行,以查看它是否

这样的事情应该这样做,记住可能可能是检测程序是否在第一个位置运行的潜在问题(a)

sh $PROGRAMX_HOME/server/bin/shutdown.sh 2>/dev/null

# Get initial PID and set limit.

PROCESS_ID=$(ps -ef | grep '[p]rogramx' | awk '{print $2}')
((LIMIT = 120))

# Loop every second, until process is gone or timer expires.

while [[ "x$PROCESS_ID" != "x" ]] ; do
    sleep 1
    PROCESS_ID=$(ps -ef | grep '[p]rogramx' | awk '{print $2}')
    ((LIMIT = LIMIT - 1))
    if [[ $LIMIT -eq 0 ]] ; then
        PROCESS_ID=""
    fi
done

PROCESS_ID=$(ps -ef | grep '[p]rogramx' | awk '{print $2}')
if [ "x$PROCESS_ID" != "x" ]
then
        kill -6 $PROCESS_ID >/dev/null 2>&1
fi

它基本上是一个循环,运行最多 120秒(大致)但如果过程消失则提前停止,等待大多数在过程实际过程后一秒钟左右退出。


(a)检测进程的一种更好的方法(不试图解析ps的输出)将是使用kill -0而不是实际向进程发送信号,它只返回一个结果,说明进程是否存在。

合并kill -0方法会为您提供如下代码:

# Get process ID up front.

PROCESS_ID=$(ps -ef | grep '[p]rogramx' | awk '{print $2}')

# Only act if it's running.

if kill -0 $PROCESS_ID >/dev/null 2>&1; then
    sh $PROGRAMX_HOME/server/bin/shutdown.sh 2>/dev/null
    ((LIMIT = 120))

    # Loop every second, until process is gone or timer expires.

    while kill -0 $PROCESS_ID >/dev/null 2>&1 && [[ $LIMIT -gt 0 ]] ; do
        sleep 1
        ((LIMIT = LIMIT - 1))
    done

    # Be more forceful if it's still up.

    if kill -0 $PROCESS_ID >/dev/null 2>&1 ; then
        kill -6 $PROCESS_ID >/dev/null 2>&1
    fi
fi

您还会注意到我已将您的2>&1 >/dev/null更改为>/dev/null 2>&1。如果你想丢弃所有消息,这很重要 - 命令行上的顺序会产生微妙的影响。

答案 1 :(得分:1)

您可以使用kill -0检查进程是否仍然存在。

如果进程已经停止,则会立即继续,如果没有,则等待2分钟:

kill -0 $PROCESS_ID &>/dev/null && sleep 120