好的,就像在这个线程中,How to get PID of background process?,我知道如何获取后台进程的PID。然而,我需要做的不只是一个操作。
{
sleep 300;
echo "Still running after 5 min, killing process manualy.";
COMMAND COMMAND COMMAND
echo "Shutdown complete"
}&
PID_CHECK_STOP=$!
some stuff...
kill -9 $PID_CHECK_STOP
但它不起作用。看起来我要么PID不好要么就是杀不掉它。我尝试运行ps | grep睡眠,它给出的pid总是紧挨着我在PID_CHECK_STOP中得到的pid。有没有办法让它工作呢?我能不能用另一种方式包装这些命令,这样我就可以在需要的时候把它们全部杀死?
伙计们!
发布于 2013-06-06 21:31:40
kill -9
在它可以做任何其他事情之前杀死该进程,包括向其子进程发出退出的信号。使用更温和的信号(kill
本身发送一个术语就足够了)。不过,您确实需要让进程通过trap
命令向其子进程发出信号,使其显式退出(如果有的话)。
我假设sleep
是实际命令的占位符。然而,sleep
是棘手的,因为它忽略任何信号,直到它返回(即,它是不可中断的)。要使您的示例工作,请将sleep
本身放在后台,并立即在其上使用wait
。当您终止“外部”后台进程时,它将中断wait
调用,这将允许sleep
也被终止。
{
trap 'kill $(jobs -p)' EXIT
sleep 300 & wait
echo "Still running after 5 min, killing process manualy.";
COMMAND COMMAND COMMAND
echo "Shutdown complete"
}&
PID_CHECK_STOP=$!
some stuff...
kill $PID_CHECK_STOP
更新:COMMAND COMMAND COMMAND
包含一个通过sudo
运行的命令。要杀死该进程,还必须通过sudo
运行kill
。请记住,这样做将运行外部kill
程序,而不是内置的shell (两者之间没有什么区别;内置的内核允许您在达到进程配额时终止进程)。
发布于 2013-06-06 21:20:04
您可以使用包含这些命令的另一个脚本并终止该脚本。如果你正在为代码块动态生成代码,只需写出一个脚本,执行它,并在完成后杀死它。
发布于 2013-06-06 21:21:04
语句周围的{ ... }
将启动一个新的shell,然后您将获得它的PID。块中的sleep
和其他命令获得单独的PID。
为了说明这一点,请在ps afux | less
中查找您的进程-父shell进程(在sleep
之上)具有您刚刚获得的PID。
https://stackoverflow.com/questions/16963133
复制相似问题