fork()
системный вызов, который создает новый процесс 1 . Всякий раз, когда вы запускаете команду, вы создаете процесс. Когда вы запускаете конвейер date | od -ab
, вы создаете два процесса. Но обычно вы не получаете приглашение оболочки (или, если применимо, переходите к следующей строке в скрипте) до тех пор, пока созданные вами процессы не завершатся и не исчезнут.
Однако, когда вы запускаете команду в фоновом режиме (например, с помощью command &
), вы можете продолжать делать другие вещи, не дожидаясь завершения процесса, созданного вами. Это может быть очень мощная возможность, но она позволяет легко создавать много процессов. И есть пределы, за которыми вы получите «Ресурс временно недоступен».
Вы уверены, что ваш скрипт мониторинга вызывает проблему (или он просто страдает от симптомов)? Что это за «процесс [который у вас есть], который иногда занимает несколько часов за раз»? Может ли это быть причиной проблемы? Это скомпилированный двоичный исполняемый файл, или это также скрипт? Если это бинарный файл, есть ли у вас исходный код?
Вот некоторые вещи, которые вы можете попытаться изолировать:
- Начните процесс «часов за раз». Подождите час (используйте будильник или песочные часы, если это поможет), а затем запустите сценарий мониторинга. Разве это не очень скоро? Если это так, проблема, вероятно, заключается в процессе «часов за раз». Будет ли он работать в течение часа (это будет второй час выполнения процесса «часы за раз»), а затем произойдет сбой? Если это так, проблема, вероятно, в сценарии мониторинга.
- Измените сон с 5 на 30. Не проходит ли он через час? Если это так, проблема, вероятно, заключается в процессе «часов за раз». Это продлится шесть часов? Если это так, проблема, вероятно, в сценарии мониторинга.
- Посмотрите на ваш скрипт и посмотрите, есть ли какие-либо команды
&
. Есть лиwait
команды? Если процесс «часы за раз» является сценарием, сделайте то же самое для него. Если это компилируется программа, и у вас есть источник, посмотрите через него на звонкиfork()
,vfork()
,spawn()
иsystem()
(иwait()
), и посмотреть, если вы можете выяснить, что происходит. - В крайнем случае, отредактируйте свой вопрос, включив в него все соответствующие детали (включая результаты вышеуказанных тестов), и тогда, возможно, кто-то может дать вам конкретный ответ.
Чтобы ответить на ваш последний вопрос: да, нехватка любого ресурса вредна для системы.
________
1 Или, по крайней мере, fork()
это один из системных вызовов, которые создают новые процессы.
PS Название вашего вопроса предполагает, что вы подозреваете, что ls
это ответственно, но в сообщениях об ошибках этого не говорится. С той же вероятностью ошибка может исходить из sleep
- или, если быть более точным, сообщения об ошибках, вероятно, чередуются: один из ls
, один из sleep
, один из ls
, один из sleep
и т. Д.