Убить процесс, который загружает весь процессор
Таким образом, в ImageMagick есть команда "convert", которую я использую для своей (Linux) веб-платформы, чтобы справиться с изменением размера изображения и тому подобным.
Иногда эта команда "зависает", то есть начинает использовать ресурсы машины, пока вся машина не станет недоступной. Когда это происходит, вход в систему может занять несколько минут.
Итак, я ищу одно из двух решений:
После использования этой команды - есть ли способ определить, сколько максимальных ресурсов она может использовать?
Могу ли я запустить скрипт cron, который идентифицирует эти "зависшие" процессы и уничтожить их? Т.е. фильтровать по времени ЦП или использованию ЦП и убивать при превышении определенного порога.
Я бы, вероятно, предпочел бы решение № 2, поскольку решение № 1 все еще может привести к нескольким таким процессам, каждый из которых ограничен и застрял, и вместе они по-прежнему будут поглощать мои ресурсы.
Я не могу определить, когда и почему это происходит, система работает медленно и зависает до тех пор, пока я не "преобразую killall", тогда все хорошо. Эта команда выполняется тысячи раз в час, поэтому, если я не буду каким-либо образом регистрировать каждое использование, я не могу сказать, какое из них застряло, к сожалению.
Так что, по сути, сценарий оболочки, который идентифицирует, убивает и регистрирует, когда конвертируется, застревает.
Есть идеи?
2 ответа
После использования этой команды - есть ли способ определить, сколько максимальных ресурсов она может использовать?
Непосредственно перед вызовом команды convert вы можете установить ограничение ресурсов на максимальное время процессора, которое может использовать процесс, convert
затем будет убит автоматически после превышения лимита.
Это будет работать в зависимости от того, как вы вызываете команду изначально. exec
может быть ненужным.
#!/bin/sh
ulimit -St 60
exec /usr/bin/convert $*
## if exec not present this gets executed after.
ulimit -St unlimited
Я создал скрипт, который убивает некоторые процессы, перечисленные в массиве, если загрузка ЦП превышает XX% в течение YY секунд или убивает процессы, которые работают более ZZ секунд.
Вы можете установить XX, YY, ZZ в верхней части файла.
Вы можете использовать ps или top для проверки процессов.
Также есть режим пробного запуска, чтобы проверить, но не убить.
В конце сценарий отправляет электронное письмо, если некоторые процессы были убиты.
Вот мой репозиторий на Github: https://github.com/padosoft/kill-process
Вот несколько скриншотов: Пример вывода