我已经编写了一个程序,假设要运行很长时间并将进度输出到stdout
,但是,在某些情况下它会开始挂起,最简单的事情就是重新启动它
我的问题是:有没有办法做一些只有在特定秒数内没有输出才能杀死进程的东西?
我已经开始考虑它了,唯一想到的就是这样:
./application > output.log &
tail -f output.log
然后创建脚本,查看output.log
上次修改的日期和时间并重新启动整个过程。
但它看起来非常乏味,如果现有命令,我会讨厌这一切。
答案 0 :(得分:3)
据我所知,没有一个标准实用程序可以做到这一点,但单线程的良好开端是:
timeout=10; if [ -z "`find output.log -newermt @$[$(date +%s)-${timeout}]`" ]; then killall -TERM application; fi
至少,这将避免编写更复杂脚本的繁琐部分。
一些提示:
find
实用程序将output.log文件的上次修改日期与时间参考进行比较。date
实用程序返回,作为自EPOCH(1970-01-01 UTC)以来的当前时间(+%s
)。bash
$ []操作减去$ timeout值(示例中为10秒)find
未返回任何输出,则文件未更改超过10秒。这将在if
条件中触发true,并执行killall
命令。您还可以使用以下方式设置alias
alias kill_application='timeout=10; if [ -z "`find output.log -newermt @$[$(date +%s)-${timeout}]`" ]; then killall -TERM application; fi';
然后只需发出命令kill_application
如果您想在没有人为干预的情况下自动重启应用程序,您可以安装crontab
条目以便每分钟运行一次,并在killall
之后发出应用程序重启命令(也许您也可以想要将-TERM更改为-KILL,以防应用程序对可处理信号无响应。)
答案 1 :(得分:2)
inotifywait
可以在这里提供帮助,它可以有效地等待文件的更改。可以检查退出状态以确定事件(modify
)是否在指定的时间间隔内发生。
$ inotifywait -e modify -t 10 output.log
Setting up watches.
Watches established.
$ echo $?
2
男人的一些相关信息:
OPTIONS
-e <event>, --event <event>
Listen for specific event(s) only.
-t <seconds>, --timeout <seconds>
Exit if an appropriate event has not occurred within <seconds> seconds.
EXIT STATUS
2 The -t option was used and an event did not occur in the specified interval of time.
EVENTS
modify A watched file or a file within a watched directory was written to.