提出了一个单行方法来从bash命令行超时长时间运行的命令:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Run Code Online (Sandbox Code Playgroud)
但是,给定的"长时间运行"命令可能比超时更早完成.(我们称之为"通常长时间运行但有时快速"的命令,或者称为tlrbsf.)
所以这种漂亮的1-liner方法有几个问题.首先,sleep
它不是有条件的,因此在序列完成所花费的时间上设置了不希望的下限.当tlrbsf命令在2秒内完成时,考虑30s或2m甚至5m的睡眠- 非常不受欢迎.其次,它kill
是无条件的,所以这个序列将试图杀死一个非运行的进程并发出呜呜声.
所以...
有没有办法超时通常长时间运行但有时快("tlrbsf")命令
...对于奖励积分,在前台运行tlrbsf命令,在后台运行任何"睡眠"或额外进程,这样tlrbsf命令的stdin/stdout/stderr 可以被重定向,就像它曾经被重定向一样直接跑吗?
如果是这样,请分享您的代码.如果没有,请解释原因.
我花了一段时间试图破解前面提到的例子,但我正在达到我的bash技能的极限.
除非绝对必要,否则不要使用kill -9!SIGKILL无法被捕获,因此被杀死的程序无法运行任何关闭例程来例如擦除临时文件.首先尝试HUP(1),然后是INT(2),然后是QUIT(3)
我原则上同意SIGKILL
,但其余的对我来说都是新闻.鉴于发送的默认信号kill
是SIGTERM
,我预计它是任意进程正常关闭的最常见信号.此外,我已经看到SIGHUP
用于非终止原因,例如告诉守护程序"重新读取您的配置文件".而且在我看来SIGINT
(你通常用Ctrl-C得到的中断,对吗?)并没有得到应有的广泛支持,或者相当不合适地终止.
鉴于这SIGKILL
是最后的手段 - 您应该向任意进程发送哪些信号以及以何种顺序发送信号,以便尽可能优雅地关闭它?
如果可以,请用支持事实(超出个人偏好或意见)或参考资料证实您的答案.
注意:我对包括考虑bash/Cygwin的最佳实践特别感兴趣.
编辑:到目前为止,似乎没有人提到INT或QUIT,并且有限提及HUP.是否有任何理由将这些包括在有序的过程中?
我正在制作bash脚本供我使用.如何运行命令一段时间,比如20秒并终止命令?我尝试了很多来自互联网的解决方案,但没有任何效果,我也试过超时命令但没有成功.请给我一些解决方案.
提前致谢
更新
例如:我想在10秒后在脚本和终端中运行此命令
some command
Run Code Online (Sandbox Code Playgroud) 我正在摆弄Linux命令"timeout":它只是在给定秒后停止长时间运行的命令.但我想暂停一个命令,而不是一组命令.我可以以两种方式()和{;}对命令进行分组,但是以下都不起作用:
timeout 1 { sleep 2; echo something; }
timeout 1 ( sleep 2; echo something )
Run Code Online (Sandbox Code Playgroud)
我怎么能用分组来做到这一点?
有时我的bash脚本挂起并保持没有明确的理由
所以他们实际上可以永远挂起(脚本进程会运行直到我杀了它)
是否有可能在bash脚本超时机制中组合以便在例如半小时后退出程序?
bash ×5
timeout ×3
command ×2
linux ×2
command-line ×1
job-control ×1
process ×1
settimeout ×1
signals ×1
sigterm ×1
utilities ×1