我们想要构建一个每天晚上运行的脚本(杀死并重新启动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。