Слишком много заданий Cron дают мне "bash: fork: Ресурс временно недоступен" - PullRequest
0 голосов
/ 07 января 2012

Сегодня я заметил, что после того, как некоторые хроны не работают должным образом, я получаю следующую строку ошибки в файлах журнала:

/bin/sh: fork: Resource temporarily unavailable

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

Затем я запускаю:

top -u

и действительно есть тонны процессов sh и curl, которых, я думаю, быть не должно.

Большинство процессов - это простые обращения к локальным php файлам, выполняющим некоторые задачи обслуживания БД.

Все процессы выполняются на моей локальной машине, поэтому у меня есть полный доступ ко всему. Если бы я знал, как, я бы изменил лимит, но я не могу найти какую-либо информацию, связанную с этой проблемой, конкретно на Mac OS X Lion.

Кроме того, я не уверен, почему процессы не исчезают после их выполнения.

Есть ли способ убить процесс после его выполнения?

Любая подсказка в правильном направлении будет высоко ценится! Спасибо

1 Ответ

1 голос
/ 07 января 2012

Единственная разумная вещь, которую вы можете сделать, это использовать lockfiles, чтобы гарантировать, что для каждого конкретного cronjob работает только один экземпляр.Самый простой способ сделать это - использовать файлы блокировки из cron-скриптов.(«кооперативная блокировка»):

  • При запуске задание (cron) проверяет, существует ли файл блокировки
  • , если файл блокировки существует, задание выполняет kill -0 <pid> вкл.другой процесс (# 1)
  • если код ошибки при уничтожении равен нулю, процесс фактически существует и имеет тот же идентификатор пользователя.Новая работа должна выйти.(# 2)
  • , если код ошибки при уничтожении не равен нулю, либо процесс больше не существует (хорошо), либо принадлежит другому (не связанному) процессу для другого идентификатора пользователя
  • , еслипроцесс не существует, новое задание можно продолжить, создав файл блокировки и записав в него свой pid (# 3)
  • Теперь фактическая полезная нагрузка может быть выполнена
  • наконец, файл блокировки может бытьудалено.

# 1: kill -0 не работает;он проверяет только действительность pid

# 2: существует небольшая вероятность того, что pid относится к несвязанному процессу для нашего pid.Мы можем уточнить поиск, проверив вывод ps и проверив, действительно ли pid относится к более старому экземпляру нашего задания cron.

# 3: это не гонка без гонок, а для запуска cronjobраз в минуту это, вероятно, достаточно хорошо.

...