【问题标题】:How can you use the unix kill command silently in a bash script?如何在 bash 脚本中静默使用 unix kill 命令?
【发布时间】:2012-02-22 20:23:10
【问题描述】:

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

到目前为止,我想出了以下几点:

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吗? -n 似乎更有可能,if [[ -n $PID ]]
  • 这行得通吗?:kill -s 9 $PID > /dev/null
  • 切线,ITYM ps aux | awk '/[m]yprocessname/{print $2}'。另见partmaps.org/era/unix/award.html

标签: linux bash


【解决方案1】:
[ -z $PID]

如果$PID 为空则为真,反之则不然,因此您的测试被倒置。

如果您的系统上也有 pgrep,您应该使用它。 (或者甚至更好:pkill 并且不要再担心所有的 shell 逻辑。)

【讨论】:

    【解决方案2】:

    答案更简单
    “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"
    

    所有列出的方法都比长管-管-管好

    【讨论】:

    • pkill 但是不等于 killall;前者执行子字符串正则表达式 grep,这可能是......潜在的危险。
    【解决方案3】:

    在您的情况下尝试if [ X$PID != X ]。这是检查字符串是否为空的常用习语。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2015-01-30
      • 2014-03-29
      相关资源
      最近更新 更多