使用 nohup 或 setsid 逃避 alarm() 进程超时?

escape alarm() process timeout with nohup or setsid?

我有一个监控应用程序 Zabbix 代理,它允许我 运行 任意 commands/scripts 并获取 return 值。代理配置了超时,任何超过超时的命令都会被杀死。

对于每个 运行 命令,它首先通过 alarm(timeout) and then forks the agent process 设置超时,然后 运行 通过 execl("/bin/sh", "sh", "-c", command, NULL) 在新的 shell 中设置命令.

我有一个尴尬的场景,我无法将代理配置超时调整为大于 2 秒,但我需要 运行 的命令将需要 10-30 秒。

所以我想知道是否有人知道我可以指定一个命令,当 运行 可以逃避超时和 运行 直到完成。我正在尝试 nohupsetsid 认为它不会继承父级中设置的超时,但由于某种原因它仍然被杀死。

这是我的例子.. 代理期望 1 在它的超时内被 returned 所以我在 subshell 中开始我的长 运行ning 命令并且echo 1 立即安抚它。 /opt/scripts/test/long_running.sh 仍然会被杀死。我希望 运行 nohup 和 subshell 它会逃脱超时。

UserParameter=my.test.cmd,nohup sh -c "(/opt/scripts/test/long_running.sh &); echo 1"

感谢阅读。

fLo

nohup 通常会抑制输出并打印其他内容,因此服务器可能会看到 Redirecting output to nohup.out 而不是预期的 1.

试试

echo 1; nohup sh -c "/opt/scripts/test/long_running.sh " >& /dev/null