1

好的,就像在这个线程中一样,如何获取后台进程的 PID?,我知道如何获取后台进程的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 sleep 和它给出的 pid 总是紧挨着我在 PID_CHECK_STOP 中得到的那个。有没有办法让它工作?我可以用另一种方式包装这些命令,以便在需要时将它们全部杀死吗?

谢谢各位!

4

3 回答 3

2

kill -9在进程可以做任何其他事情之前终止进程,包括向其子进程发出退出信号。使用更温和的信号(kill单独发送一个 TERM 就足够了)。但是,您确实需要让进程通过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. 要杀死该进程,kill还必须通过sudo. 请记住,这样做将运行外部kill程序,而不是内置的 shell(两者之间几乎没有区别;内置的存在允许您在达到进程配额时终止进程)。

于 2013-06-06T13:31:39.857 回答
1

您可以拥有另一个包含这些命令的脚本并终止该脚本。如果您正在为块动态生成代码,只需编写一个脚本,执行它并在完成后终止。

于 2013-06-06T13:20:03.893 回答
0

语句周围{ ... }会启动一个新的 shell,然后你会得到它的PID。sleep和块中的其他命令获得单独的 PID。

为了说明,在中查找您的进程ps afux | less- 父 shell 进程(在 上方sleep)具有您刚刚获得的 PID。

于 2013-06-06T13:21:03.860 回答