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