我已经看过监视程序,无论是在脚本中,使用'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脚本只是睡了几秒钟然后退出。
观察到的几个问题:
......无论如何,这根本不起作用。我不得不说我对这个话题知之甚少。 有人可以建议或提供一些有用的例子吗? 有这样的脚本吗?
如何在bash中使用wait呢?
由于
答案 0 :(得分:7)
我可以尝试回答你的一些问题但不是全部基于我的问题 知道。
行set -o monitor
(或等效地,set -m
)启用作业
control,默认情况下仅对交互式shell启用。这似乎
要求发送SIGCHLD。但是,工作控制更多
一个交互式功能,并不真正意味着在shell脚本中使用
(另见this question)。
另请注意,这可能不是您打算做的
因为一旦启用了作业控制,SIGCHLD将被发送到每个
存在的外部命令(例如,每次运行ls
或grep
或
任何东西,SIGCHLD都会在该命令完成时触发你的陷阱
将运行)。
我怀疑SIGCHLD陷阱只出现一次运行的原因 因为你的陷阱处理程序包含一个前景无限循环,所以你的 脚本卡在陷阱处理程序中。似乎没有意义 到那个循环,所以你可以简单地删除它。
脚本对SIGINT的“免疫力”似乎是启用的效果
工作控制(监控部分)。我的预感是打开了工作控制,
运行脚本的bash子实例不再终止
本身是为了响应SIGINT,而是将SIGINT传递给
它的前景子进程。在您的脚本中,^C
即SIGINT
就像其他编程语言中的continue
语句一样
因为SIGINT只会杀死当前正在运行的sleep 60
,
然后while循环将立即运行一个新的sleep 60
。
当我尝试运行你的脚本然后杀死它(从另一个 终端),我最后得到的是两个流浪睡眠过程。
后台那个脚本也为我杀了我的shell,不过 行为不是非常一致(有时会发生 立即,其他时间根本没有)。它似乎在键入任何其他键 比输入导致EOF以某种方式发送。即使在终端之后 退出脚本继续在后台运行。我不知道 这是怎么回事。
更具体地说明你想要完成的事情会有所帮助。如果 你只想要一个命令在你的生命周期中连续运行 脚本,您可以在后台运行无限循环,如
while true; do
some-command
echo some-command finished
echo restarting some-command ...
done &
请注意&
之后的done
。
对于其他任务,wait
可能比使用作业控制更好
在shell脚本中。同样,这取决于你究竟在尝试什么
要做。