如何控制调度程序在Unix / Linux中启动的进程

时间:2014-02-22 09:16:44

标签: linux bash unix process fork

我有一个像这样的调度程序脚本(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的子进程和孙进程正在运行。有什么方法可以检查叉树吗?

  3. 编辑:

    我的系统上没有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在内的进程?

2 个答案:

答案 0 :(得分:0)

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

  1. run_program.sh脚本不会在其任何子/孙之前退出
  2. 孩子/孙子女不会成为会议的领导者。
  3. 如果是这种情况,那么您可以在新会话中运行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变量$$)写入文件,以便轻松检索。

答案 1 :(得分:0)

您可以通过调用Bash builtin $!来获取最近执行的后台进程的进程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