我有一个监控应用程序 Zabbix 代理,它允许我运行任意命令/脚本并获取返回值。代理配置了超时,任何超过超时的命令都将被终止。
对于运行的每个命令,它首先通过 alarm(timeout) 设置超时然后 fork agent process在通过 execl("/bin/sh", "sh", "-c", command, NULL)
在新的 shell 中运行命令之前。
我有一个尴尬的场景,我无法将代理配置超时调整为大于 2 秒,但我需要运行的命令将花费 10-30 秒。
所以我想知道是否有人知道我可以指定一个命令,该命令在运行时可以逃避超时并运行直到完成。我正在尝试 nohup
或 setsid
认为它不会继承父级中设置的超时,但由于某种原因它仍然被杀死。
这是我的示例.. 代理期望 1
在超时内返回,所以我在 subshell 中启动长时间运行的命令并立即回显 1
以安抚它。 /opt/scripts/test/long_running.sh
仍然会被杀死。我希望使用 nohup 运行并在子 shell 中运行它可以避免超时。
UserParameter=my.test.cmd,nohup sh -c "(/opt/scripts/test/long_running.sh $1 &); echo 1"
感谢阅读。
fLo
最佳答案
nohup
通常会抑制输出并打印其他内容,因此服务器可能会看到 Redirecting output to nohup.out
而不是预期的 1
.
尝试类似的东西
echo 1; nohup sh -c "/opt/scripts/test/long_running.sh $1" >& /dev/null
关于c - 使用 nohup 或 setsid 逃避 alarm() 进程超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30340089/