0

我正在运行一个脚本,每天下载、构建和检查我正在参与的程序。“检查”部分意味着执行一组测试运行并将结果与​​参考进行比较。

只要程序完成(有或没有错误),一切都很好(我的意思是我可以处理)。但在某些情况下,某些测试运行显然陷入了无限循环,我必须杀死它。这对于应该无人看管的工作来说是相当不方便的。如果在某个时候发生这种情况,测试将不会进一步进行,更糟糕的是,第二天将启动一个新工作,这可能会遇到同样的问题。

手动,我可以识别“卡住”的过程,例如,ps -u username任何在 TIME 列中超过 15 分钟的东西都应该被杀死。请注意,这不仅仅是进程的“年龄”,而是使用的处理时间。我不想终止包装脚本或 ssh 会话。

在尝试编写一些定期运行ps -u username的复杂脚本,解析输出并杀死需要杀死的东西之前,是否有一些更简单或预先准备好的解决方案?

编辑:

从建议线程中的回复中,我已将此行添加到用户的 crontab 中,到目前为止似乎有效:

10,40 * * * * ps -eo uid,pid,time | egrep '^ *`id -u`' | egrep ' ([0-9]+-)?[0-9]{2}:[2-9][0-9]:[0-9]{2}' | awk '{print $2}' | xargs -I{} kill {}

它每半小时运行一次(在 *:10 和 *:40),识别属于用户的进程(id -u在反引号中,因为$UID在破折号中不可用)并且处理时间超过 20 分钟([2-9][0-9]),并杀死它们。

时间解析并不完美,它不会捕获已经运行了几个小时不到 20 分钟的进程,但是因为它每 30 分钟运行一次,所以不应该发生这种情况。

4

0 回答 0