【问题标题】:How to control the process launched by a dispatcher in Unix/Linux如何在 Unix/Linux 中控制调度程序启动的进程
【发布时间】:2014-02-22 09:16:44
【问题描述】:

我有一个这样的调度程序脚本 (dispatcher.sh):

for system in a b c
do
    cd /usr/xyz/$system/
    mkdir -p /usr/xyz/$system/time
    { time `./run_program.sh;wait` ;} > /usr/xyz/$system/time/time.log 2>&1 &
done

我写这个是为了在每个文件夹中启动 run_program.sh 并记录执行时间。每个 run_program.sh 中的任务各不相同,有些会分叉子进程和孙子进程。

  1. 我希望能够停止/杀死每个 run_program.sh 及其派生子进程和孙子进程。

  2. 我也想知道每个 run_program 的子进程和孙进程正在运行。有什么方法可以检查分叉树吗?

编辑:

我的系统上没有 pstree,所以我很难直观地了解父进程和子进程之间的 pid 关系。如果我杀死父进程,子进程会被杀死吗?我目前使用

ps -eo pid,pgid,args | awk '{if($2==PGID){print $1}}' PGID=pid| xargs kill -9

杀死一个父进程的子进程。假设A分叉B,B分叉C(A->B->C),我杀死进程B,C会自动被杀死吗?如何杀死包括A和B在内的进程?

【问题讨论】:

  • 使用pstree查看进程树,-p选项会显示所有的PID。然后你可以用kill <pid>杀死他们。

标签: linux bash unix process fork


【解决方案1】:

如果这两个假设成立,以下将是正确的:

  1. run_program.sh 脚本不会在其任何子/孙之前退出
  2. 子/孙不会成为会话负责人。

如果是这种情况,那么您可以在新会话中运行 run_program.sh,以便它及其所有子/孙子进程具有相同的进程组 ID。

然后您可以使用以下命令杀死脚本及其所有子/孙子:

kill -9 -PID

其中PIDrun_program.sh 脚本本身的进程ID。使用-PID 将信号发送给进程组的所有成员。

您还可以使用以下命令列出子/孙子:

ps -eao pid,pgrp,args | awk '{if($2==PGRP){print $0}}' PGRP=PID

其中PIDrun_program.sh 脚本本身的进程ID。

您可以修改您的 run_program.sh 以将其 PID(shell 变量 $$)写入文件,以便您轻松检索它。

【讨论】:

    【解决方案2】:

    你可以通过调用Bash内置的$!来获取最近执行的后台进程的进程ID。

    然后,你可以kill -9 PID杀死一个进程ID的所有后代。

    您可以将进程 ID 存储在一个数组中,然后在信号中断时执行类似将它们全部终止的操作。

    for system in a b c
    do
        cd /usr/xyz/$system/
        mkdir -p /usr/xyz/$system/time
        { time `./run_program.sh;wait` ;} > /usr/xyz/$system/time/time.log 2>&1 &
        pids+=($!)
    done
    proc_kill () {
        kill -9 ${pids[@]}
    }
    trap proc_kill SIGINT
    

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2017-02-05
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      • 2023-03-23
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多