我正在寻找一种工具,使任务在指定的时间内(以秒为单位)保持活动状态(必要时重新启动),然后将其终止并停止。例如:keep_for 3600 rsync foo bar:faz
应该尝试同步目录(如果 fe 断开连接,则重新启动 rsync),但明确终止 rsync 并在一小时后停止重新生成它。
我尝试为此编写一个 shell 脚本,但编写起来却出奇地困难,有很多极端情况(例如子进程未被终止,或者 shell 转义问题)。所以... 也许已经有一个工具可以实现这个功能?
答案1
如果您的系统有暴发户,您可以创建一个事件你的脚本/命令的文件和这个可能做你想做的事(如果现在不行,那么可能在将来的版本中使用计划功能)。
以下是手册页中的一些信息events(5)
:
手动启动:
start on <event>
描述在什么条件下启动此作业。如果没有此部分,则只能使用 initctl(8) 命令手动启动该作业。重生:
respawn
这将为作业设置守护进程、服务和重生标志。重生标志表示进程在结束时将重新启动重生限制:
重生限制 [count [timeout]]
此项配置重生限制。重生限制仅在作业设置了重生标志时适用;设置限制不会自动设置重生能力。如果在 timeout 秒间隔内进程重生次数超过 count 次,作业将自动停止,而不会重新启动。限制默认为 5 秒内 10 次。
看入门。
答案2
我会将任务分开,并将它们保存在同一个脚本中(我认为这是一个 C 程序,但它应该可以作为脚本来执行)。
我会先使用后台子进程计时器在超时时发送信号。信号处理程序会彻底关闭所有内容并退出。
然后启动一个循环,每当它退出时没有成功(零)状态时,就重新生成所需的命令。
尝试在一个循环中跟踪超时和命令将变得过于复杂。
答案3
这个问题是从实施的角度提出的。我建议你根据要实现的目标重新构思这个问题,这样可能会得到一个更明显(和优雅)的解决方案。