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