Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash脚本:确保进程已终止,而没有不必要的等待_Linux_Bash - Fatal编程技术网

Linux Bash脚本:确保进程已终止,而没有不必要的等待

Linux Bash脚本:确保进程已终止,而没有不必要的等待,linux,bash,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

下面的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

您用于检测进程是否仍在运行的相同方法应可用于查看进程是否仍在运行

类似这样的方法应该可以做到这一点,记住这种检测程序是否正在运行的方法可能存在潜在问题(a):

它基本上是一个循环,运行时间长达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
。如果您想丢弃所有消息,这一点很重要-命令行上的顺序会产生微妙的影响。

您可以使用
kill-0
检查进程是否仍处于活动状态

如果进程已停止,此操作将立即继续,如果尚未停止,则等待2分钟:

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

这将检测到进程已经退出的情况,但是,如果退出需要五秒钟,那么您仍将等待整整两分钟。不过,使用kill-0是个好主意。谢谢。我马上试试看。这个Posix兼容吗?@jamie:假设你指的是
kill-0
,是的。看,我试过剧本了。进程正常退出后,即使进程不存在,它仍会尝试终止该进程。kill:(15279)-没有这样的process@jamie,这是
kill-0
,它并不是试图实际终止进程。我会更新脚本来解决这个问题。我只是在寻找一种等待进程退出的方法。非常感谢。
kill -0 $PROCESS_ID &>/dev/null && sleep 120