我们想要构建一个每晚运行的脚本(杀死并重启java进程)。为此,我们需要捕获进程号(因为可能有多个java进程在运行)。下面的命令基本上是我们用来获取进程号的命令,可能是在grep末尾有一个正则表达式。除非有更好的建议。
root#ps -e |grep 'java'
18179 pts/0 00:00:43 java
我们想知道如何解析上面的输出并将其转换为shell变量,因此我们可以使用kill命令,如下所示。
kill -9 ${processid}
wait 10
注1:我们不能依赖正常服务停止命令的原因是因为进程有时不想死。我们必须手动使用kill命令。
答案 0 :(得分:4)
有几种方法可以解决这个问题。如果你正在使用bash,那么shell变量'$!'将包含最后一个分叉子进程的PID。因此,在启动Java程序之后,执行以下操作:
echo $! > /var/run/my-process.pid
然后,在init脚本停止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
确保在完成后删除pid文件。
答案 1 :(得分:3)
ps aux | grep java | awk '{print $1}' | xargs kill -9
以下是解释:
ps aux
为您提供了所有流程的列表
grep java
为您提供名称和命令行参数包含字符串“java”的所有进程
awk '{print $1}'
通过空格将grep命令的输出解析为列,并仅重新打印第一列
xargs kill -9
将awk命令的每个结果作为参数传递给kill -9命令
答案 2 :(得分:2)
我意识到这是旧的,但是:
pidof java | xargs kill
答案 3 :(得分:1)
您可以使用反引号和cut(或awk,如果愿意)轻松地将PID或PID列表转换为变量,以仅检索PID字段:
[user@host ~]$ ps -e | grep java | cut -d' ' -f1
12812
12870
13008
13042
13060
请注意,在上面的示例中,我有多个Java进程在运行,因此有多个值。如果将其保存为如下变量:
JAVA_PROCS=`ps -e | grep java | cut -d' ' -f1`
如果需要,您可以遍历过程以杀死它们:
for proc in $JAVA_PROCS; do
kill -9 $proc;
done
当然,如果你只检索一个进程,那么就没有必要进行迭代,你只需运行它:
kill -9 $JAVA_PROCS
答案 4 :(得分:1)
如果你按照你的建议行事,你最终可能会捕获grep并杀死它(因为你的grep命令包含你要搜索的java字符串)。您可以通过排除grep(使用另一个grep!)来解决这个问题:
pid=`ps -e | fgrep java | fgrep -v grep | awk '{print $1}'`
# check pid has a value
# kill $pid
您可能也喜欢ps -e -opid,args
。
如果您的系统拥有pgrep(1)
或pkill(1)
,则更好的选择是使用pkill -9 java
或{{1}}。没有管道,seds,awks,cut,xargs:
{{1}}
答案 5 :(得分:0)
ps -e | grep java | cut -f1 -d' ' | xargs kill -9
在变量上存储PID:
export JAVAPID=`ps -e | grep 'java' | cut -f1 -d' '`
检查它是否有效:
echo $JAVAPID
答案 6 :(得分:0)
我使用这样的东西:
kill $(ps -A | grep java | cut -b 1-5)