如何在bash脚本中静默使用unix kill命令?

时间:2012-02-22 20:23:10

标签: linux bash

我正在尝试检查特定进程是否正在运行,如果是,请尝试将其杀死。

到目前为止,我已经提出了以下建议:

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上以静默方式终止正在运行的进程的最佳方法是什么?

3 个答案:

答案 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 ]。这是检查字符串是否为空的常用习惯。