在bash脚本中,我想做以下事情(在伪代码中):

if [ a process exists with $PID ]; then

    kill $PID 

fi

条件语句的合适表达式是什么?


当前回答

在实现procfs接口的系统上,比如Linux,你可以检查/proc/$PID是否存在:

if test -d /proc/"$PID"/; then
    echo "process exists"
fi

否则可以使用ps程序:

if [ -n "$(ps -p $PID -o pid=)" ]

在后一种形式中,-o pid=是一种输出格式,只显示进程ID列,没有标题。对于非空字符串操作符-n,必须使用引号来给出有效的结果。

其他回答

你有两种方法:

让我们开始寻找一个特定的应用程序在我的笔记本电脑:

[root@pinky:~]# ps fax | grep mozilla
 3358 ?        S      0:00  \_ /bin/sh /usr/lib/firefox-3.5/run-mozilla.sh /usr/lib/firefox-3.5/firefox
16198 pts/2    S+     0:00  \_ grep mozilla

现在所有示例都将查找PID 3358。

第一种方法:为第二列中的PID运行ps aux和grep。在这个例子中,我查找firefox,然后查找它的PID:

[root@pinky:~]# ps aux | awk '{print $2 }' | grep 3358
3358

所以你的代码将是:

if [ ps aux | awk '{print $2 }' | grep -q $PID 2> /dev/null ]; then
    kill $PID 
fi

第二种方法:在/proc/$PID目录中查找。在这个例子中我使用的是exe,但是你也可以使用其他任何东西。

[root@pinky:~]# ls -l /proc/3358/exe 
lrwxrwxrwx. 1 elcuco elcuco 0 2010-06-15 12:33 /proc/3358/exe -> /bin/bash

所以你的代码将是:

if [ -f /proc/$PID/exe ]; then
    kill $PID 
fi

顺便说一句:杀-9 $PID ||有什么不对吗?


编辑:

考虑了几个月后…(大约24…)我在这里给出的最初想法是一个很好的hack,但非常不可移植。虽然它教授了一些Linux的实现细节,但它将无法在Mac、Solaris或*BSD上工作。它甚至可能在未来的Linux内核上失败。请在其他回答中使用“ps”。

要检查进程是否存在,请使用

kill -0 $pid

但就像@unwind说的,如果你想让它在任何情况下终止,那么

kill $pid

否则会出现竞态条件,即进程可能在第一次kill -0之后就消失了。

如果您想忽略kill的文本输出,并根据退出代码执行一些操作,您可以这样做

if ! kill $pid > /dev/null 2>&1; then
    echo "Could not send SIGTERM to process $pid" >&2
fi

在实现procfs接口的系统上,比如Linux,你可以检查/proc/$PID是否存在:

if test -d /proc/"$PID"/; then
    echo "process exists"
fi

否则可以使用ps程序:

if [ -n "$(ps -p $PID -o pid=)" ]

在后一种形式中,-o pid=是一种输出格式,只显示进程ID列,没有标题。对于非空字符串操作符-n,必须使用引号来给出有效的结果。

例如,在GNU/Linux中,你可以使用:

Pid=$(pidof `process_name`)

if [ $Pid > 0 ]; then

   do something
else

   do something
fi 

或者类似的东西

Pin=$(ps -A | grep name | awk 'print $4}')
echo $PIN

它会显示应用程序的名称,只有名称,没有ID。

看起来你想要

wait $PID

当$pid结束时返回。

否则你可以使用

ps -p $PID

检查进程是否仍然活跃(这比kill -0 $pid更有效,因为即使你不拥有pid,它也会工作)。