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!
linux
bash
runtime-error
StackOverflowed
quelle
quelle
loop.sh
, also musst du es alleine lösen.Antworten:
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ührendate | 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:
&
. Sind da irgendwelchewait
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 nachfork()
,vfork()
,spawn()
undsystem()
(undwait()
), und sehen Sie nach, ob Sie herausfinden können, was gerade passiert.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 kommensleep
- oder genauer gesagt, die Fehlermeldungen wechseln sich wahrscheinlich ab: einer vonls
, einer vonsleep
, einer vonls
, einer vonsleep
, usw.quelle