我试图检查一个特定的进程是否正在运行,如果是,请尝试并杀死它。
到目前为止,我已经提出了以下内容:
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上运行的进程?
[ -z $PID]
如果$PID
是空的而不是相反,所以你的测试是颠倒的。
你应该使用pgrep
如果你的系统上也有。 (甚至更好:停止并停止对所有shell逻辑的担心。)
答案很简单
“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"
所有列出的方法都比长管道管道优越
尝试在您的情况下if [ X$PID != X ]
。 这是检查字符串是否为空的惯用方法。