Цикл и выполнение ls в bash-скрипте, Resource временно недоступен?

417
StackOverflowed

У меня есть процесс, который иногда занимает несколько часов за раз, и вместо запуска 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 

Почему это происходит? Сценарий имел какие-либо негативные последствия на сервере?

Спасибо!

0
Вы единственный, кто знает содержание `loop.sh`, поэтому вы должны решить его самостоятельно. Ipor Sircer 7 лет назад 0
Я не прошу отладить сценарий (извините, если я появился), мне было интересно, что может / может постоянно приводить к ошибке временно недоступного ресурса. StackOverflowed 7 лет назад 0
На самом деле, вы, вероятно, * просите * отладить сценарий, так как он, по-видимому, поглощает какие-то ограниченные ресурсы по мере его запуска и в конечном итоге ... иссякает. Это может быть что-то еще на сервере, но, поскольку вы указываете, что это происходит после того, как скрипт некоторое время работал, я ставлю на сценарий. Но какой ресурс и почему он его съедает? На это можно ответить только взглянув на сценарий. Выражение «fork: retry: Resource временно недоступен» даст вам как можно больше информации, основываясь на том, что вы нам сообщили. Gordon Davisson 7 лет назад 0

1 ответ на вопрос

1
G-Man

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

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

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

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

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

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


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

Похожие вопросы