我正在尝试检查特定进程是否正在运行,如果是,请尝试将其杀死。
到目前为止,我已经提出了以下建议:
PID=$(ps aux | grep myprocessname | grep -v grep | awk '{print $2}')
if [ -z $PID];
then
echo Still running on PID $PID, attempting to kill..
kill -9 $PID > /dev/null
fi
但是当我运行它时,我得到以下输出:
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
在unix上以静默方式终止正在运行的进程的最佳方法是什么?
答案 0 :(得分:6)
[ -z $PID]
如果$PID
为空,则为真,而不是相反,因此您的测试会被反转。
如果您的系统上也有pgrep
,那么您应该使用{{1}}。 (或者甚至更好:pkill
并且不再担心所有shell逻辑。)
答案 1 :(得分:5)
答案更容易了 程序“killall”几乎是任何发行版的一部分。
示例:
killall name_of_process &> /dev/null
killall -9 name_of_process &> /dev/null
(( $? == 0)) && echo "kill successful";
现在还有“pkill”和“pgrep” 例如:
pkill -9 bash &> /dev/null
(( $? == 0)) && echo "kill successful";
示例:
for pid in $(pgrep bash); do
kill -9 $pid &> /dev/null
(( $? == 0)) && echo "kill of $pid successful" || echo "kill of $pid failed";
done
最后你在你的例子中使用了“ps”,这里有一个更好的方法来使用它而不需要“grep”“grep -v”和“awk”:
PIDS="$(ps -a -C myprocessname -o pid= )"
while read pid; do
kill -9 $pid &> /dev/null
((!$?)) && echo -n "killed $pid,";
done <<< "$p"
所有列出的方法都比长管道管道更好
答案 2 :(得分:-1)
在您的情况下尝试if [ X$PID != X ]
。这是检查字符串是否为空的常用习惯。