fork()
ist der Systemaufruf, der einen neuen Prozess erstellt 1 . Wenn Sie einen Befehl ausführen, erstellen Sie einen Prozess. Wenn Sie eine Pipeline ausführen date | od -ab
, erstellen Sie zwei Prozesse. Normalerweise erhalten Sie Ihre Shell-Eingabeaufforderung jedoch nicht zurück (oder wechseln Sie ggf. zur nächsten Zeile in einem Skript), bis die von Ihnen erstellten Prozesse beendet und verschwunden sind.
Wenn Sie jedoch einen Befehl im Hintergrund ausführen (z. B. mit command &
), können Sie andere Aufgaben ausführen, ohne auf den Abschluss der erstellten Prozesse zu warten. Dies kann eine sehr leistungsfähige Funktion sein, macht es jedoch einfach, viele Prozesse zu erstellen. Und es gibt Grenzen, bis zu denen "Ressource vorübergehend nicht verfügbar" angezeigt wird.
Sind Sie sicher, dass Ihr Überwachungsskript das Problem verursacht (oder leiden Sie nur an den Symptomen)? Was ist dieser "Prozess [den Sie haben], der manchmal Stunden dauert, bis er abgeschlossen ist"? Könnte es das Problem verursachen? Ist es eine kompilierte binäre ausführbare Datei oder ist es auch ein Skript? Wenn es sich um eine Binärdatei handelt, haben Sie den Quellcode?
Hier sind einige Dinge, die Sie versuchen können, das Problem zu isolieren:
- Starten Sie den Prozess „Stunden zu einer Zeit“. Warten Sie eine Stunde (verwenden Sie einen Wecker oder eine Sanduhr, wenn das hilft) und dann das Überwachungsskript starten. Versagt es sehr bald? Wenn ja, liegt das Problem wahrscheinlich im Stundenbetrieb. Läuft es eine Stunde (dies wäre die zweite Stunde der Ausführung des Prozesses "Stunden zu einer Zeit") und schlägt dann fehl? Wenn ja, liegt das Problem wahrscheinlich im Überwachungsskript.
- Ändern Sie den Schlaf von 5 auf 30. Scheitert er nach einer Stunde immer noch? Wenn ja, liegt das Problem wahrscheinlich im Stundenbetrieb. Schafft es sechs Stunden? Wenn ja, liegt das Problem wahrscheinlich im Überwachungsskript.
- Schauen Sie sich Ihr Skript an und prüfen Sie, ob Befehle vorhanden sind
&
. Gibt es irgendwelchewait
Befehle? Wenn der Prozess „Stunden zu einer Zeit“ ein Skript ist, führen Sie dasselbe aus. Wenn es ein übersetztes Programm ist, und Sie haben die Quelle, blicken durch ihn für Anrufefork()
,vfork()
,spawn()
undsystem()
(undwait()
), und sehen Sie, wenn Sie herausfinden können, was passiert. - Bearbeiten Sie Ihre Frage als letzten Ausweg, um alle relevanten Details (einschließlich der Ergebnisse der obigen Tests) einzuschließen, und dann kann Ihnen vielleicht jemand eine bestimmte Antwort geben.
Um Ihre letzte Frage zu beantworten: Ja, das Auslaufen einer Ressource ist schlecht für das System.
________
1 Oder zumindest fork()
ist eine der Systemaufrufe, die neuen Prozesse erstellen.
PS Der Titel Ihrer Frage weist darauf hin, dass Sie den Verdacht haben, dass dies ls
verantwortlich ist, aber die Fehlermeldungen sagen dies nicht aus. Der Fehler könnte genauso wahrscheinlich aus dem sleep
- oder, um genauer zu sein, die Fehlermeldungen sind wahrscheinlich abwechselnd: eine von ls
, eine von sleep
, eine von ls
, eine von sleep
usw.