Ls in einem Bash-Skript leiten und ausführen, Ressource vorübergehend nicht verfügbar?

497
StackOverflowed

Ich habe einen Prozess, der manchmal Stunden dauert, um abzuschließen, und anstatt ls auszuführen, um zu sehen, ob eine zugehörige Datei gelöscht wird, um den Abschluss der Aufgabe zu markieren, habe ich ein Skript, das einfach ls foldernamesimmer wieder mit einem 5 Sekunden langen Ruhezustand läuft zwischen.

Es funktioniert für seinen Zweck (fragen Sie nicht, warum ich kein besseres Benachrichtigungssystem habe, dies war nur eine Ad-hoc-Lösung auf Zeit). Wenn das Skript jedoch über einen längeren Zeitraum (eine Stunde?) Ausgeführt wird, wird anstelle der Verzeichnisinhalte der folgende Fehler angezeigt:

./loop.sh: fork: retry: Resource temporarily unavailable ./loop.sh: fork: retry: Resource temporarily unavailable ./loop.sh: fork: retry: Resource temporarily unavailable 

Warum passiert das? Hat das Skript negative Auswirkungen auf den Server gehabt?

Vielen Dank!

0
Du bist der einzige, der den Inhalt von `loop.sh` kennt, also musst du ihn alleine lösen. Ipor Sircer vor 7 Jahren 0
Ich frage nicht, das Skript zu debuggen (sorry, wenn ich aufgetaucht bin), ich habe mich gefragt, was ständig zu einem zeitweilig nicht verfügbaren Resource-Fehler führen könnte / könnte. StackOverflowed vor 7 Jahren 0
Tatsächlich bitten Sie wahrscheinlich * uns * darum, das Skript zu debuggen, da es anscheinend eine begrenzte Ressource aufnimmt, während es läuft, und schließlich ... es ausgeht. Es könnte sich um etwas anderes auf dem Server handeln. Da Sie jedoch darauf hinweisen, dass das Skript eine Zeit lang ausgeführt wurde, setze ich auf das Skript. Aber welche Ressource und warum frisst es es auf? Das kann man nur durch einen Blick auf das Skript beantworten. Wenn Sie nach "Fork: retry: Ressource vorübergehend nicht verfügbar" suchen, erhalten Sie so viele Informationen wie möglich, je nachdem, was Sie uns gesagt haben. Gordon Davisson vor 7 Jahren 0

1 Antwort auf die Frage

1
G-Man

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 irgendwelche waitBefehle? 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 Anrufe fork(), vfork(), spawn()und system()(und wait()), 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 lsverantwortlich 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 sleepusw.