我有一个 cron 作业,在基于 VM 的远程 Ubuntu 服务器上运行 Python 脚本。该脚本需要几个小时才能运行,我注意到内核似乎在脚本完成之前终止了它,如日志所示:
myscript.py: line 11: 4890 Terminated
我在脚本运行时通过 top 监控了脚本的 CPU 和内存使用情况,发现它们从未过量使用。
如何找出我的脚本终止的原因以及如何防止过早终止?
答案1
您可能超出了默认或 中设置的一些限制/etc/security/limits.conf
。您可能希望将该命令ulimit -a
作为 cronjob 运行。这应该会显示您在 cron 下遇到的限制。
作业可能被空闲的终端监控程序或失控进程终止程序错误地终止。有大量此类程序,其中大多数都可以通过编程来忽略已知的长时间运行的进程。
编辑:默认值有可能会超出的限制。这些是我默认获得的限制:
:~$ 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。我不知道有任何简单的方法来监视堆栈大小。从增加堆栈大小限制的脚本运行程序可能有助于确定这是否是问题所在。
我还会检查程序终止时写入的所有日志,看看是否有任何记录。您是否可以修改程序,使其在退出时更加详细。
答案2
如果是内核,您应该会在 dmesg 中看到相关提示。否则,您必须寻找终止脚本的其他原因(也许是killall python
其他地方的原因太广泛了?)。