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

if [ a process exists with $PID ]; then

    kill $PID 

fi

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


当前回答

ps命令和-p $PID可以做到这一点:

$ ps -p 3531
  PID TTY          TIME CMD
 3531 ?        00:03:07 emacs

其他回答

我认为这是一个糟糕的解决方案,这为比赛条件打开了大门。如果进程在测试和终止调用之间停止了,该怎么办?那么杀戮就会失败。那么,为什么不在所有情况下都尝试kill,并检查它的返回值以了解它是如何运行的呢?

ps命令和-p $PID可以做到这一点:

$ ps -p 3531
  PID TTY          TIME CMD
 3531 ?        00:03:07 emacs

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

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

通过pid:

pgrep [pid] >/dev/null

的名字:

pgrep -u [user] -x [name] >/dev/null

“-x”表示“完全匹配”。

例如,在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。