在bash脚本中,我想做以下事情(在伪代码中):
if [ a process exists with $PID ]; then
kill $PID
fi
条件语句的合适表达式是什么?
在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,必须使用引号来给出有效的结果。
其他回答
我认为这是一个糟糕的解决方案,这为比赛条件打开了大门。如果进程在测试和终止调用之间停止了,该怎么办?那么杀戮就会失败。那么,为什么不在所有情况下都尝试kill,并检查它的返回值以了解它是如何运行的呢?
例如,在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。
在这里,我将PID存储在一个名为. PID的文件中(这有点像/run/…),只在尚未执行的情况下执行脚本。
#!/bin/bash
if [ -f .pid ]; then
read pid < .pid
echo $pid
ps -p $pid > /dev/null
r=$?
if [ $r -eq 0 ]; then
echo "$pid is currently running, not executing $0 twice, exiting now..."
exit 1
fi
fi
echo $$ > .pid
# do things here
rm .pid
注意:这里有一个竞态条件,因为它不会检查pid是如何被调用的。如果系统重新启动,.pid存在,但被不同的应用程序使用,这可能会导致“不可预见的后果”。
要检查进程是否存在,请使用
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
看起来你想要
wait $PID
当$pid结束时返回。
否则你可以使用
ps -p $PID
检查进程是否仍然活跃(这比kill -0 $pid更有效,因为即使你不拥有pid,它也会工作)。