我正在运行一个脚本,每天下载,构建和检查我正在贡献的程序。 “检查”部分意味着执行一系列测试运行并将结果与参考值进行比较。
只要程序结束(有或没有错误),一切都OK(我的意思是我可以处理)。但是在某些情况下,一些测试运行显然停留在无限循环中,我必须杀死它。这对于应该无人看管的工作来说非常不方便。如果在某些时候发生这种情况,测试将不再进一步发展,更糟糕的是,第二天将启动一项新工作,这可能会遇到同样的问题。
手动,我可以识别“卡住”过程,例如,使用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分钟运行一次不应该发生。