У меня есть задание cron, запускающее сценарий Python на удаленном сервере Ubuntu на основе виртуальной машины. На выполнение сценария уходит пара часов, и я заметил, что ядро, похоже, завершает сценарий до его завершения, как показывает журнал:
myscript.py: line 11: 4890 Terminated
Я отслеживал использование ЦП и памяти моего скрипта через top, пока он работает, и никогда не становится чрезмерным.
Как мне узнать, почему мой скрипт прерывается и как предотвратить преждевременное завершение?
Возможно, вы превышаете некоторые ограничения, установленные по умолчанию или в /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 - это идентификатор процесса вашего скрипта. Я не знаю простого способа отслеживать размер стека. Запуск программы из сценария, увеличивающего предел размера стека, может помочь определить, является ли это проблемой.
Я бы также проверил все журналы, записанные во время завершения программы, чтобы увидеть, есть ли что-нибудь в журнале. Если вы можете изменить программу, чтобы она была более подробной при выходе.
Если это ядро, вы должны увидеть упоминание о нем в dmesg. В противном случае вам придется искать что-то еще, что завершает ваш скрипт (возможно, слишком широкий killall python
где-нибудь еще?).