代码之家  ›  专栏  ›  技术社区  ›  Dan

使Linux“wait”命令等待所有子进程

  •  7
  • Dan  · 技术社区  · 16 年前

    wait不是等待所有子进程停止。这是我的剧本:

    #!/bin/bash
    
    titlename=`echo "$@"|sed 's/\..\{3\}$//'`
    screen -X title "$titlename"
    
    /usr/lib/process.bash -verbose $@
    
    wait
    
    bash -c "mail.bash $@"
    screen -X title "$titlename.Done"
    

    我没有机会 /usr/lib/process.bash ,但它是一个经常更改的脚本,所以我想引用它…但在剧本里:

    #!/bin/ksh
    #lots of random stuff
    /usr/lib/runall $path $auto $params > /dev/null 2>&1&
    

    我的问题是 鲁纳尔 创建日志文件…和 邮差 是想把那个日志文件寄给我,但等待不是等待 鲁纳尔 要完成,它似乎只在等待 巴什 完成。有没有,没有 巴什 或尝试保持我自己的最新版本 巴什 ,使等待正确等待 鲁纳尔 完成?(日志文件会覆盖上一次运行,因此我不能只检查日志文件的存在,因为那里总是有一个日志文件)

    谢谢, 丹

    4 回复  |  直到 16 年前
        1
  •  8
  •   ephemient    16 年前
    (
        . /usr/lib/process.bash -verbose $@
        wait
    )
    

    而不是让操作系统启动 process.bash ,这将创建子shell,并在中运行所有命令 巴什 就好像它们被输入了我们的shell脚本,并在该子shell中等待。

    有一些警告,但如果你没有做任何不寻常的事情,它应该是有效的。

        2
  •  4
  •   Ignacio Vazquez-Abrams    16 年前

    wait 只等待直接的孩子;如果有孩子生自己的孩子,它不会等待他们。

        3
  •  2
  •   John Kugelman Michael Hodel    16 年前

    主要问题是因为 process.bash 已经退出 runall 进程将被孤立并归 init (PID 1)。如果你看流程列表 逃跑 从中间进程开始,将不再与您的进程有任何可见的连接 巴什 脚本退出。无法使用 ps --ppid 或者任何类似的搜索这个“孙子”的过程,一旦它是孤儿。

    你可以 wait 在特定的PID上。你知道的PID 鲁纳尔 过程?如果只有一个这样的进程,您可以尝试这个过程,它将等待所有运行 逃跑 S:

    wait `pidof runall`
    
        4
  •  1
  •   Debugger    16 年前

    您可以恢复您要等待的进程的PID

    然后将这个PID作为参数传递给命令wait