У меня есть процесс, который иногда занимает несколько часов за раз, и вместо запуска ls, чтобы увидеть, удаляется ли связанный файл, чтобы отметить завершение задачи, у меня есть скрипт, который просто запускает ls foldernames снова и снова с 5 второй сон между ними.

Это работает для своей цели (не спрашивайте, почему у меня нет лучшей системы уведомлений, это было только временное решение adhoc). Однако, если сценарий выполняется в течение длительного периода времени (час?), Вместо вывода содержимого каталога он отображает следующую ошибку:

./loop.sh: fork: retry: Resource temporarily unavailable
./loop.sh: fork: retry: Resource temporarily unavailable
./loop.sh: fork: retry: Resource temporarily unavailable

Почему это происходит? Был ли скрипт на сервере?

Спасибо!

1 ответ1

1

fork() - системный вызов, который создает новый процесс 1.  Всякий раз, когда вы запускаете команду, вы создаете процесс.  Когда вы запускаете конвейер, как date | od -ab , вы создаете два процесса.  Но обычно вы не получаете приглашение оболочки (или, если применимо, переходите к следующей строке в скрипте) до тех пор, пока созданные вами процессы не завершатся и не исчезнут.

Однако, когда вы запускаете команду в фоновом режиме (например, с помощью command &), вы можете продолжать делать другие вещи, не дожидаясь завершения процесса, созданного вами.  Это может быть очень мощная возможность, но она позволяет легко создавать много процессов.  И есть пределы, за которыми вы получите «Ресурс временно недоступен».

Вы уверены, что ваш скрипт мониторинга вызывает проблему (или он просто страдает от симптомов)?  Что это за «процесс [который у вас есть], который иногда занимает несколько часов за раз»?  Может ли это быть причиной проблемы?  Это скомпилированный двоичный исполняемый файл, или это также скрипт?  Если это бинарный файл, есть ли у вас исходный код?

Вот некоторые вещи, которые вы можете попытаться изолировать:

  • Начните процесс «часов за раз».  Подождите час (используйте будильник или песочные часы, если это поможет), а затем запустите сценарий мониторинга.  Разве это не очень скоро?  Если это так, проблема, вероятно, заключается в процессе «часов за раз».  Будет ли он работать в течение часа (это будет второй час выполнения процесса «часы за раз»), а затем произойдет сбой?  Если это так, проблема, вероятно, в сценарии мониторинга.
  • Измените сон с 5 на 30.  Это все еще терпит неудачу после одного часа?  Если это так, проблема, вероятно, заключается в процессе «часов за раз».  Это продлится шесть часов?  Если это так, проблема, вероятно, в сценарии мониторинга.
  • Посмотрите на ваш скрипт и посмотрите, есть ли в командах & .  Есть ли команды wait ?  Если процесс «часы за раз» является сценарием, сделайте то же самое для него.  Если это скомпилированная программа, и у вас есть исходный код, просмотрите его для вызовов fork() , vfork() , spawn() и system()wait()), и посмотрите, сможете ли вы выяснить, что происходит.
  • В крайнем случае, отредактируйте свой вопрос, включив в него все соответствующие детали (включая результаты вышеуказанных тестов), и тогда, возможно, кто-то может дать вам конкретный ответ.

Чтобы ответить на ваш последний вопрос: да, нехватка любого ресурса вредна для системы.
________
1 Или, по крайней мере, fork() - это один из системных вызовов, которые создают новые процессы.


PS Название вашего вопроса предполагает, что вы подозреваете, что ls ответственен, но сообщения об ошибках не говорят об этом.  С той же вероятностью ошибка может исходить из sleep или, если быть более точным, сообщения об ошибках, вероятно, чередуются: одно из ls , одно из sleep , одно из ls , одно из sleep и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .