5

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

#!/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. 什么是杀死进程的替代解决方案?

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

4

2 回答 2

5

您可以将进程 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在相应脚本完成后删除文件。

于 2012-10-10T09:08:50.243 回答
1

因为您的kill命令失败了,因为pid它是空的。

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

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

您可以做的是在启动后台进程并终止它们时保存 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.

于 2012-10-10T09:07:38.807 回答