如何在shell变量中捕获系统调用的结果?

时间:2009-04-03 16:50:29

标签: java linux shell scripting

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

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

我们想知道如何解析上面的输出并将其转换为shell变量,因此我们可以使用kill命令,如下所示。

kill -9 ${processid}
wait 10

注1:我们不能依赖正常服务停止命令的原因是因为进程有时不想死。我们必须手动使用kill命令。

7 个答案:

答案 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)