crontab, экземпляр, проблемы с памятью+спам

crontab, экземпляр, проблемы с памятью+спам

У меня есть cronjob, который запускает php5 wp-cron.php каждую минуту для обновления моего сайта.

Однако что-то произошло, и у меня было более 30 экземпляров этого (31 отмечен в этом дампе ps aux). Он съел мою оперативную память, заставил еще один экземпляр завершить работу из-за нехватки памяти и не дал мне возможности подключиться к ящику по ssh.

Я не могу понять, почему экземпляры жили >30 минут, обычно это занимает несколько секунд. В тот день, когда это произошло, у меня не было запланированных заданий (хотя, может быть, кэш wp использовал его? но у меня никогда не было проблем раньше)

Что я могу сделать, чтобы cronjob не спамил и не уничтожал мою память? Есть ли способ сказать не запускать, если экземпляр активен? и если экземпляр активен более 5 минут, убить его?

Есть ли способ защитить себя от чего-то подобного?

решение1

Я думаю, первое, что вам нужно сделать, это заинтриговать виновника, который мог вызвать 31 экземпляр этой работы. Обычно это может быть ваша программа, зависшая в какой-то момент, вам следует отладить и исправить эту проблему, если вы не хотите, чтобы ваш веб-сайт успешно обновлялся.

На вопрос «Есть ли способ сказать «не запускай», если экземпляр жив?» да, есть несколько способов, один из них — просто проверить, pgrep yourprogramnameсуществует ли уже экземпляр. Если да, то можно вызвать функцию, pkill -x yourprogramnameчтобы убить их всех.

решение2

Для предотвращения запуска нескольких копий используйте flock (Linux), lockf (FreeBSD), shlock (поставляется с некоторыми системами, менее надежно). Это не ограничит время выполнения, но гарантирует, что будет запущен только один процесс. Затем, если он зависнет, вы сможете проанализировать его состояние на лету.

Вы можете ограничить время ЦП порожденного процесса с помощью встроенной функции оболочки ulimit.

Чтобы ограничить время стены, вы можете написать скрипт, который ждет завершения процесса и убивает его по истечении времени ожидания. Это проще в Python/Perl/и т. д., но shell также позволяет это (используя ловушку и/или фоновых потомков).

Иногда полезно указать фиксированное время между вызовами (т.е. от конца предыдущего до начала следующего) вместо запуска вызовов, как это делает cron. Обычные виды cron не позволяют этого, вам следует запустить специальный скрипт.

Связанный контент