/ / Hintergrundjobs in Shell-Skripten - Linux, Bash, Terminal

Hintergrundjobs in Shell-Skripten - Linux, Bash, Terminal

Ich habe ein Shell-Skript script.sh mit einem Befehl cmd im Hintergrund innerhalb gestartet, das heißt:

#!/bin/bash
…
cmd &
…

Wenn ich einen Terminalemulator √∂ffne (ich habe xfce4-terminal und gnome-terminal ausprobiert) und laufe script.sh Innerhalb meines Befehls cmd wird effektiv ausgef√ľhrt und wie erwartet im Hintergrund ausgef√ľhrt.

Wenn ich jedoch einen Terminalemulator vom vorherigen (oder zu Beginn meiner Desktopsitzung, die mein eigentlicher Anwendungsfall ist) √∂ffne und mein Skript von ausf√ľhre

xfce4-terminal -H -x script.sh (or gnome-terminal -x script.sh)

der Befehl cmd wird nicht mehr ausgef√ľhrt.

Ich fand, dass ich es durch Putten zwingen kann, ausgef√ľhrt zu werden set -m in meinem Drehbuch, aber ich verstehe nicht, warum es in diesem Fall notwendig (oder sogar ausreichend) ist und nicht in dem vorherigen set -o In meinem Skript erhalte ich in beiden F√§llen die gleiche Ausgabe.

Kann mir jemand erklären, wie ich mit Hintergrundjobs in Shell-Skripten vorgehen soll? Vielen Dank!


EDIT: Eigentlich cmd wird in beiden F√§llen ausgef√ľhrt, aber im zweiten Fall wird es sofort durch die Beendigung von get√∂tet script.sh. Um dies zu verhindern, kann man verwenden nohup, aber es ist nicht genug, und es ist das seltsamste f√ľr mich: man muss auch setzen sleep 1oder so √§hnlich, damit der Prozess ordnungsgem√§√ü im Hintergrund gestartet und von der √ľbergeordneten Shell getrennt werden kann. Andernfalls wird er ebenfalls beendet.

Ich verstehe diesen Unterschied im Verhalten zwischen den beiden Shells nicht wirklich, da beide nicht interaktiv sind, wie in einem vorherigen Kommentar angegeben.

Antworten:

1 f√ľr Antwort ‚ĄĖ 1

Wenn du √∂ffnest xfce4-trminal oder gnome-terminal (oder ein anderes Terminal) Ihre Shell befindet sich im interaktiven Modus. Jedes Skript wird im interaktiven Modus ausgef√ľhrt.

Wenn du läufst script.sh durch

xfce4-terminal -H -x script.sh

oder

gnome-terminal -x script.sh

oder ein anderes Terminal, Ihre Shell befindet sich im nicht interaktiven Modus.

Skripte m√ľssen m√∂glicherweise im interaktiven Modus mit dem ausgef√ľhrt werden -i Option oder mit einem #!/bin/bash -i Header. Beachten Sie, dass dies zu fehlerhaftem Skriptverhalten f√ľhren oder Fehlermeldungen anzeigen kann, auch wenn kein Fehler vorliegt.

Was ist set -m? Es ist √úberwachungsmodus. Hintergrundprozesse werden in einer separaten Prozessgruppe ausgef√ľhrt und nach Abschluss wird eine Zeile mit ihrem Beendigungsstatus gedruckt. Es ist standardm√§√üig f√ľr interaktive Shells aktiviert.

Was ist set -o? Die aktuellen Einstellungen der Optionen werden in einem nicht angegebenen Format in die Standardausgabe geschrieben.

Warum set -o funktioniert?

Die Option -o wurde von der KornShell √ľbernommenauf die Bed√ľrfnisse der Nutzer einzugehen. Zus√§tzlich zu seiner allgemein benutzerfreundlichen Oberfl√§che wird -o ben√∂tigt, um den vi-Befehlszeilenbearbeitungsmodus bereitzustellen, f√ľr den die historische Praxis keinen aus einem Buchstaben bestehenden Optionsnamen liefert. (Obwohl es m√∂glich gewesen w√§re, einen solchen Buchstaben zu erfinden, wurde erkannt, dass andere Bearbeitungsmodi entwickelt werden w√ľrden, und -o bietet reichlich Namensraum f√ľr die Beschreibung solcher Erweiterungen.)

Historische Implementierungen sind inkonsistent indas Format, das f√ľr die Statusmeldung von -o Optionen verwendet wird. Das + o-Format ohne Optionsargument wurde hinzugef√ľgt, um den portablen Zugriff auf die Optionen zu erm√∂glichen, die gespeichert und sp√§ter beispielsweise mit einem Punktskript wiederhergestellt werden k√∂nnen.

Sowieso, set -m wird √ľbrigens bevorzugt.


0 f√ľr Antwort ‚ĄĖ 2

Die Frage wurde am beantwortet Unix Stackexchange (Siehe auch zusätzliche Kommentare unter der Antwort). Es geht darum, wer wann das SIGHUP - Signal an wen sendet. Und eine Alternative zu set -m / set +m um cmd & im script.sh ist trap "" HUP / trap - HUP.