我有一个在基于虚拟机的远程Ubuntu服务器上运行Python脚本的cron作业。 该脚本需要几个小时才能运行,而且我注意到内核似乎在脚本完成之前终止脚本,如日志所示:
myscript.py: line 11: 4890 Terminated
在运行时,我已经通过顶端监视了我的脚本的CPU和内存使用情况,并且它永远不会过多。
如何找出脚本被终止的原因以及如何防止提前终止?
您可能会超出默认或/etc/security/limits.conf
设置的某些限制。 你可能想要运行命令ulimit -a
作为一个cronjob。 这应该显示您在cron下获得的限制。
有可能这个工作被一个空闲的terminal监控程序或失控的stream程杀手错误地杀死了。 有很多这样的程序,其中大部分可以被编程为忽略已知的长时间运行的进程。
编辑:默认值有可能超出的限制。 这些是我默认获得的限制:
:~$ ulimit -a | grep -v unlim core file size (blocks, -c) 0 scheduling priority (-e) 0 pending signals (-i) 61167 max locked memory (kbytes, -l) 64 open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 max user processes (-u) 61167
这些open files
和stack size
是我期望最有可能被超过的两个。 可以通过计算/ proc / XXX / fd中的条目来监视打开的文件,其中XXX是脚本的进程ID。 我不知道任何简单的方法来监视堆栈大小。 从增加堆栈大小限制的脚本运行程序可能有助于确定这是否是问题。
我还会检查在程序结束时写入的所有日志,看是否有任何logging。 如果你可以修改程序在退出的时候更加冗长。
如果是内核,你应该在dmesg中看到它的提及。 否则,你必须寻找其他的东西来终止你的脚本(也许是一个太宽泛的killall python
其他地方?)。