以下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
答案 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