bash使用陷阱SIGCHLD重启子进程?

时间:2011-07-20 22:43:03

标签: bash child-process bash-trap sigchld

我已经看过监视程序,无论是在脚本中,使用'ps'或'服务状态(在Linux上)'定期检查进程状态,还是在C / C ++中分析并等待进程......

我想知道是否可以使用带陷阱的bash并在收到SIGCLD时重新启动子进程?

我已经在RedHat Linux上测试了一个基本套件,但有以下想法(当然它没有用......)

#!/bin/bash
set -o monitor # can someone explain this? discussion on Internet say this is needed
trap startProcess SIGCHLD
startProcess() { 
  /path/to/another/bash/script.sh & # the one to restart
  while [ 1 ]
  do
    sleep 60
  done
}
startProcess

启动bash脚本只是睡了几秒钟然后退出。

观察到的几个问题:

  • 当shell在前台启动时,SIGCHLD只会被处理一次。陷阱复位信号处理如signal()?
  • 脚本及其子代似乎对SIGINT免疫,这意味着它们无法被^ C阻止
  • 既然无法关闭,我关闭了终端。该脚本似乎是HUP,许多僵尸儿童离开了。
  • 在后台运行时,脚本导致终端死亡

......无论如何,这根本不起作用。我不得不说我对这个话题知之甚少。 有人可以建议或提供一些有用的例子吗? 有这样的脚本吗?

如何在bash中使用wait呢?

由于

1 个答案:

答案 0 :(得分:7)

我可以尝试回答你的一些问题但不是全部基于我的问题 知道。

  1. set -o monitor(或等效地,set -m)启用作业 control,默认情况下仅对交互式shell启用。这似乎 要求发送SIGCHLD。但是,工作控制更多 一个交互式功能,并不真正意味着在shell脚本中使用 (另见this question)。

    另请注意,这可能不是您打算做的 因为一旦启用了作业控制,SIGCHLD将被发送到每个 存在的外部命令(例如,每次运行lsgrep或 任何东西,SIGCHLD都会在该命令完成时触发你的陷阱 将运行)。

  2. 我怀疑SIGCHLD陷阱只出现一次运行的原因 因为你的陷阱处理程序包含一个前景无限循环,所以你的 脚本卡在陷阱处理程序中。似乎没有意义 到那个循环,所以你可以简单地删除它。

  3. 脚本对SIGINT的“免疫力”似乎是启用的效果 工作控制(监控部分)。我的预感是打开了工作控制, 运行脚本的bash子实例不再终止 本身是为了响应SIGINT,而是将SIGINT传递给 它的前景子进程。在您的脚本中,^C即SIGINT 就像其他编程语言中的continue语句一样 因为SIGINT只会杀死当前正在运行的sleep 60, 然后while循环将立即运行一个新的sleep 60

  4. 当我尝试运行你的脚本然后杀死它(从另一个 终端),我最后得到的是两个流浪睡眠过程。

  5. 后台那个脚本也为我杀了我的shell,不过 行为不是非常一致(有时会发生 立即,其他时间根本没有)。它似乎在键入任何其他键 比输入导致EOF以某种方式发送。即使在终端之后 退出脚本继续在后台运行。我不知道 这是怎么回事。

  6. 更具体地说明你想要完成的事情会有所帮助。如果 你只想要一个命令在你的生命周期中连续运行 脚本,您可以在后台运行无限循环,如

    while true; do
        some-command
        echo some-command finished
        echo restarting some-command ...
    done &
    

    请注意&之后的done

    对于其他任务,wait可能比使用作业控制更好 在shell脚本中。同样,这取决于你究竟在尝试什么 要做。