在bash脚本中,我想做以下事情(在伪代码中):
if [ a process exists with $PID ]; then
kill $PID
fi
条件语句的合适表达式是什么?
在bash脚本中,我想做以下事情(在伪代码中):
if [ a process exists with $PID ]; then
kill $PID
fi
条件语句的合适表达式是什么?
当前回答
通过pid:
pgrep [pid] >/dev/null
的名字:
pgrep -u [user] -x [name] >/dev/null
“-x”表示“完全匹配”。
其他回答
我认为这是一个糟糕的解决方案,这为比赛条件打开了大门。如果进程在测试和终止调用之间停止了,该怎么办?那么杀戮就会失败。那么,为什么不在所有情况下都尝试kill,并检查它的返回值以了解它是如何运行的呢?
ps命令和-p $PID可以做到这一点:
$ ps -p 3531
PID TTY TIME CMD
3531 ? 00:03:07 emacs
最好的方法是:
if ps -p $PID > /dev/null
then
echo "$PID is running"
# Do something knowing the pid exists, i.e. the process with $PID is running
fi
kill -0 $PID的问题是,即使进程正在运行,并且您没有权限杀死它,退出码也将是非零。例如:
kill -0 $known_running_pid
and
kill -0 $non_running_pid
有一个非零的退出码,这些退出码对于普通用户来说是难以区分的,但其中一个假设正在运行,而另一个则没有。
部分相关的,由AnrDaemon提供的附加信息:init进程(PID 1)肯定在所有Linux机器上运行,但不是所有POSIX系统都是Linux。PID 1不保证存在:
kill -0 1
-bash: kill: (1) - No such process …
讨论
如果测试主体是“杀死”,那么讨论杀死和竞争条件的答案是完全正确的。我来寻找一般的“如何在bash中测试PID的存在”。
/proc方法很有趣,但在某种意义上破坏了ps命令抽象的精神,也就是说,你不需要在/proc中查找,因为如果Linus决定调用其他的exe文件怎么办?
要检查进程是否存在,请使用
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,必须使用引号来给出有效的结果。