【问题标题】:How to get right PID of a group of background command and kill it?如何获得一组后台命令的正确PID并杀死它?
【发布时间】:2013-06-06 22:13:50
【问题描述】:

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

谢谢各位!

【问题讨论】:

  • 试试()而不是{}
  • 已经尝试过同样的问题

标签: linux bash shell


【解决方案1】:

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(两者之间几乎没有区别;内置的存在允许您在达到进程配额时终止进程) .

【讨论】:

  • 实际上 deploy.sh: line 164: kill: (1498) - Operation not allowed 这会是安全权限问题吗?
  • 你能发布一些更接近你的实际代码的东西吗?这听起来像是您试图杀死另一个用户拥有的进程。
  • @Franko 请编辑您问题中的代码,而不是我的答案 :) 但是,您使用 sudo 运行进程这一事实意味着您必须使用 sudo 运行 kill也是。
【解决方案2】:

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

【讨论】:

  • 似乎合法我现在就这样做。我想在一个脚本中完成它。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-12-29
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多