Shell脚本找到PID和Kill

时间:2015-05-28 18:55:28

标签: linux bash shell unix

我正在尝试编写一个脚本来查找之前运行的另一个脚本的PID。一旦找到PID,它就会发送一个终止信号。我发现PID但是杀死信号没有处理,我得到的回报是不是PID。

这就是我在做什么。

#!/bin/bash   
 PID=`ps -eaf | grep "start.sh" | awk '{print $2}'`
    echo "$PID"    
    if [[ -z "$PID" ]];
     then(
            echo "Start script is not running!"
    )else(
            kill -9 $PID
    )fi

它试图杀死的脚本会启动许多其他脚本,所以我希望杀死start.sh会杀死所有子进程。

任何帮助/想法都会很棒。谢谢

4 个答案:

答案 0 :(得分:1)

当您运行ps -eaf | grep "start.sh" | awk '{print $2}'时,您会在其中创建一个带有start.sh字样的子shell。然后grep将在其自己的进程和start.sh进程中获取,这样您将获得2个PID。这意味着当您尝试同时杀死start.shps -eaf | grep "start.sh" | awk '{print $2}'进程时。 start.sh将会死亡,但另一个将不再存在,因此无法杀死,因此会给您一个错误。

如果您要拆分命令,可能会有更好的运气。

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "start.sh" | awk '{print $2}')

答案 1 :(得分:1)

尝试使用pgrep

PID=$(pgrep yourprocesname)

答案 2 :(得分:0)

这是另一种可能对某人有用的解决方案:

#!/bin/bash  
kill-process-by-name(){  
   processes=$(ps -A)
   kill -9 `echo "$processes" | grep "$1" | cut -f2 -d" "`
}

kill-process-by-name "start.sh"

答案 3 :(得分:0)

您可以使用pidof而不是ps -ef

PID=`pidof start.sh | awk '{print $1}'`
echo "$PID csshst will be stopped"
if [[ -z "$PID" ]]; then
(
        kill -9 $PID
)
fi