Durchlaufen und Ausführen von ls in einem Bash-Skript, Ressource vorübergehend nicht verfügbar?

0

Ich habe einen Prozess, der manchmal Stunden in Anspruch nimmt, und anstatt ls auszuführen, um zu sehen, ob eine zugeordnete Datei gelöscht wird, um den Abschluss der Aufgabe zu markieren, habe ich ein Skript, das einfach ausgeführt wird ls foldernames immer wieder mit einem 5 Sekunden Schlaf dazwischen.

Es funktioniert für seinen Zweck (fragen Sie nicht, warum ich kein besseres Benachrichtigungssystem habe, dies war nur eine temporäre Ad-hoc-Lösung). Wenn das Skript jedoch über einen längeren Zeitraum (eine Stunde?) Ausgeführt wird, wird anstelle der Ausgabe des Verzeichnisinhalts 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? Hatte das Skript negative Auswirkungen auf den Server?

Vielen Dank!

StackOverflowed
quelle
Du bist der einzige, der den Inhalt kennt loop.sh, also musst du es alleine lösen.
Ipor Sircer
Ich möchte das Skript nicht debuggen (entschuldige, wenn ich den Anschein habe, dass ich es habe). Ich habe mich gefragt, was konsequent zu einem vorübergehend nicht verfügbaren Fehler bei einer Ressource führen würde / könnte.
StackOverflowed
Eigentlich Sie wahrscheinlich sind Bitten Sie uns, das Skript zu debuggen, da es anscheinend eine begrenzte Ressource in Anspruch nimmt, während es ausgeführt wird, und schließlich ... ausgeht. Es könnte etwas anderes auf dem Server sein, aber da Sie angeben, dass es passiert, nachdem das Skript eine Weile ausgeführt wurde, wette ich auf das Skript. Aber welche Ressource und warum frisst sie es auf? Das kann nur durch einen Blick auf das Skript beantwortet werden. Wenn Sie nach "fork: retry: Resource temporary notavailable" greifen, erhalten Sie so viele Informationen wie möglich, basierend auf Ihren Angaben.
Gordon Davisson

Antworten:

1

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 -abSie 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.

G-Man
quelle