在shell脚本中查杀后台进程

时间:2012-10-10 08:58:15

标签: shell process busybox

我有一个启动后台进程的脚本。

#!/bin/sh

./process1.sh &
./process2.sh &

我需要使用单独的脚本来终止这些进程。 这是我做的:

#!/bin/sh
# the kill.sh

pid=$(ps | grep './process1.sh' |grep -v grep| awk '{print $1}')
kill -9 $pid

提问时间:

  1. 调用kill.sh时,会停止进程。但是我得到了消息

    “sh:你需要指定杀人”。 那是为什么?

  2. 使用所描述的脚本终止进程后,它不会立即停止。有一段时间我在屏幕上看到输出,就好像进程仍在运行一样。为什么呢?

  3. 什么可以成为杀死进程的替代解决方案?

  4. 值得一提的是我正在使用busybox,我选择的实用程序有限。

2 个答案:

答案 0 :(得分:4)

您可以将进程ID存储在这样的临时文件中:

#!/bin/sh

./process1.sh &
echo $! > /tmp/process1.pid
./process2.sh &
echo $! > /tmp/process2.pid

然后用脚本删除它。 $!返回上次执行的进程的PID。

kill -9 `cat /tmp/process*.pid`
rm /tmp/process*.pid

确保在相应的脚本完成后删除process*.pid个文件。

答案 1 :(得分:1)

因为kill命令失败,因为pid为空。

pid=$(ps | grep './process1.sh' |grep -v grep| awk '{print $1}')

这不会给你你想要的pid。当你在后台启动一个进程时,它在一个新shell中执行,你将看不到'process.sh in your ps`输出。

您可以执行的操作是在启动后台进程时保存PID并将其终止:

./process1.sh &
pid1=$!  # Save the previously started background's PID
./process2.sh &
pid2=$!  # Save the previously started background's PID

echo $pid1 " " $pid2 > /tmp/killfile

然后从此文件中获取PID并将其传递给kill