fork()
ist der Systemaufruf, der einen neuen Prozess erstellt 1 .
Immer wenn Sie einen Befehl ausführen, erstellen Sie einen Prozess.
Wenn Sie eine Pipeline wie ausführen date | od -ab
Sie erstellen zwei Prozesse.
Normalerweise erhalten Sie Ihre Shell-Eingabeaufforderung jedoch nicht zurück
(oder fahren Sie gegebenenfalls mit der nächsten Zeile in einem Skript fort.)
bis die von Ihnen erstellten Prozesse abgebrochen wurden und verschwunden sind.
Wenn Sie jedoch einen Befehl im Hintergrund ausführen
(z. B. mit Befehl &Ampere;
),
Sie können fortfahren, andere Dinge zu tun
ohne auf die Prozesse zu warten, die Sie zum Beenden erstellt haben.
Dies kann eine sehr mächtige Fähigkeit sein,
Aber es macht es einfach, viele Prozesse zu erstellen.
Und es gibt Grenzen
Danach erhalten Sie "Ressource vorübergehend nicht verfügbar".
Sind Sie sicher, dass Ihr Überwachungsskript das Problem verursacht?
(oder leidet es nur an den Symptomen)?
Was ist das
"Prozess [den Sie haben], der manchmal Stunden in Anspruch nimmt"?
Könnte es verursacht das problem?
Handelt es sich um eine kompilierte ausführbare Binärdatei oder handelt es sich auch um 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 einzugrenzen:
- Starten Sie den Prozess "Stunden auf einmal".
Warte eine Stunde (benutze einen Wecker oder eine Sanduhr, wenn das hilft)
und dann Starten Sie das Überwachungsskript.
Scheitert es sehr bald?
In diesem Fall liegt das Problem wahrscheinlich in den "Stunden auf einmal".
Läuft es eine Stunde lang?
(das wäre das zweite Stunde der Ausführung
des "Stunden auf einmal" -Prozesses)
und dann scheitern?
Wenn ja, liegt das Problem wahrscheinlich im Überwachungsskript.
- Ändern Sie den Schlaf von 5 auf 30.
Scheitert es noch nach einer Stunde?
In diesem Fall liegt das Problem wahrscheinlich in den "Stunden auf einmal".
Schafft es, sechs Stunden zu dauern?
Wenn ja, liegt das Problem wahrscheinlich im Überwachungsskript.
- Sehen Sie sich Ihr Skript an und prüfen Sie, ob Befehle vorhanden sind
&
.
Sind da irgendwelche wait
befehle?
Wenn es sich bei dem "Stunden auf einmal" -Prozess um ein Skript handelt, machen Sie dasselbe.
Wenn es sich um ein kompiliertes Programm handelt und Sie die Quelle haben,
Durchsuchen nach Anrufen nach fork()
, vfork()
, spawn()
und system()
(und wait()
),
und sehen Sie nach, ob Sie herausfinden können, was gerade passiert.
- Als letztes, bearbeiten Ihre Frage, um alle relevanten Details einzuschließen
(einschließlich der Ergebnisse der obigen Tests),
und dann kann dir vielleicht jemand eine bestimmte Antwort geben.
So beantworten Sie Ihre letzte Frage:
Ja, es schadet dem System, wenn keine Ressourcen mehr verfügbar sind.
________
1 Oder zumindest, fork()
ist ein der Systemaufrufe
das schafft neue Prozesse.
P.S. Ihr Fragentitel schlägt vor
dass Sie das vermuten ls
ist verantwortlich,
aber die Fehlermeldungen sagen das nicht.
Der Fehler könnte genauso wahrscheinlich von der kommen sleep
-
oder genauer gesagt, die Fehlermeldungen wechseln sich wahrscheinlich ab:
einer von ls
, einer von sleep
, einer von ls
, einer von sleep
, usw.
loop.sh
, also musst du es alleine lösen.