我们想要构建一个每天晚上运行的脚本(杀死并重新启动Java进程)。为此,我们需要捕获进程号(因为可能有多个Java进程在运行)。下面的命令基本上是我们将用来获取进程号的命令,可能在grep的末尾使用了regexp。除非有更好的建议。

root#ps -e |grep  'java'
18179 pts/0    00:00:43 java

我们想知道如何解析上面的输出并将其输出到一个shell变量中,因此我们可以如下使用kill命令。
kill -9 ${processid}
wait 10

注意1:之所以不能依赖正常的service stop命令,是因为进程有时不想死。而且,我们必须手动使用kill命令。

最佳答案

有两种解决方案。如果您使用的是bash,则shell变量'$!'将包含最后一个分支的子进程的PID。因此,在启动Java程序之后,请执行以下操作:

echo $! > /var/run/my-process.pid

然后,在您的初始化脚本停止Java进程之后:
# Get the pidfile.
pid=$(cat /var/run/my-process.pid)

# Wait ten seconds to stop our process.
for count in $(1 2 3 4 5 6 7 8 9 10); do
    sleep 1
    cat "/proc/$pid/cmdline" 2>/dev/null | grep -q java
    test $? -ne 0 && pid="" && break
done

# If we haven't stopped, kill the process.
if [ ! -z "$pid" ]; then
    echo "Not stopping; terminating with extreme prejudice."
    kill -9 $pid
fi

完成后,请确保删除pidfile。

10-01 22:40
查看更多