2012-02-22 108 views
0

我想检查一个特定的进程是否正在运行,如果是,请尝试并杀死它。如何在bash脚本中静静地使用unix kill命令?

我拿出迄今以下:

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

你确定你想更好的'-z'? '-n'似乎更可能,'如果[[-n $ PID]]''。 – FatalError 2012-02-22 20:26:17

+0

这是行不通的吗?:kill -s 9 $ PID>/dev/null – perreal 2012-02-22 20:39:53

+2

切线方向,ITYM'ps aux | awk'/ [m] yprocessname/{print $ 2}''。另见http://partmaps.org/era/unix/award.html – tripleee 2012-02-22 20:40:49

回答

5
[ -z $PID] 

为真,如果$PID是空的,而不是其他方式,所以你的测试被反转。

如果你的系统上也有这个功能,你应该使用pgrep。 (甚至更好:pkill和停止担心所有外壳的逻辑。)

+0

这工作来自我,谢谢:) – Jimmy 2012-02-23 12:14:40

-1

尝试if [ X$PID != X ]在您的情况。这是检查字符串是否为空的惯用方式。

5

答案是容易
程序“killall”是几乎所有的发行版的一部分。

例子:

killall name_of_process &> /dev/null 
killall -9 name_of_process &> /dev/null 
(($? == 0)) && echo "kill successful"; 

现在有也是 “pkill的” 和 “p纤ep” 例子:

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" 

所有这些列出的方法比长管 - 管 - 管恕我直言

+0

pkill然而不等于killall;前者做一个子字符串正则表达式grep,它可能......潜在地危险。 – 2012-02-23 00:52:08

+0

+1对于killall的负责人,并不知道这一点。 :) – Jimmy 2012-02-23 12:15:55