Ausführen von bash-Skript nicht wieder zum terminal bei der Verwendung von et-Zeichen (&), um einen Teilprozess im hintergrund
Habe ich ein script (nennen wir es parent.sh) das macht 2 Anrufe an ein zweites Skript (child.sh), die läuft ein java-Prozess. Die child.sh Skripte im hintergrund laufen, indem Sie ein & am Ende der Zeile parent.sh. Allerdings, wenn ich laufen parent.sh muss ich Strg+C drücken, um wieder in den terminal-Bildschirm. Was ist der Grund dafür? Ist es etwas mit der Tatsache zu tun, dass die child.sh Prozesse laufen unter der parent.sh Prozess. Also die parent.sh nicht sterben, bis die Kinder tun?
parent.sh
#!/bin/bash
child.sh param1a param2a &
child.sh param1b param2b &
exit 0
child.sh
#!/bin/bash
java com.test.Main
echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." user@email.com
Wie Sie sehen können, ich will nicht führen Sie den java-Prozess in den hintergrund, weil ich will, um eine E-mail senden aus, wenn der Prozess stirbt. Mache es wie oben funktioniert von einem funktionalen Standpunkt, aber ich würde gerne wissen, wie ich es bekommen kann, um wieder den Anschluss nach dem ausführen von parent.sh.
- Muss es mit ctrl-c oder funktioniert das drücken der EINGABETASTE erhalten Sie eine Aufforderung zu? Was bedeutet
ps
sagen, läuft an der Stelle, wo Sie mit Strg-c? - Ist das java-Programm erwartet keine Eingabe? Hilft es, wenn Sie es ändern, um
java com.test.Main < /dev/null
? - arco, das java-Programm nimmt die Eingabe, so dass nicht eine option @Etan - es muss Strg C, ps sagt die 2 java-Prozesse laufen und parent.sh
- Hinzufügen eines
> /dev/null
am Ende der Zeile mitmail
.mail
wird ansonsten versuchen, starten Sie den interaktiven Modus. - wenn es als Eingabe nimmt, wie Sie erwarten, dass es im hintergrund selbst? Es muss zwingend ein controlling-terminal verarbeiten.
- Macht die EINGABETASTE drücken auch Ihre Eingabeaufforderung, wenn das passiert, oder ist es nur Strg+c?
- Wie @CharlesDuffy sagt, wenn das Skript nimmt die Eingabe, wie kann es im hintergrund laufen? Wo geht es hin bekommen mit, seine Eingaben aus? Sie sind nicht liefert es alle (und Sie töten es mit Strg-c, ich würde erwarten, dass Sie es zu treffen, zweimal, tatsächlich).
- Die übliche Antwort für diese (wenn Sie Lesen müssen, die Eingabe von dem terminal, bevor die daemonizing, anstatt, dass die Eingabe über die Befehlszeile oder Umgebung) ist, um die ersten, die es Lesen, den input selbst zu daemonize, was bedeutet, schließen Sie alle Ihre Griffe auf dem terminal (ersetzt stdin, stdout und stderr mit Griffen auf
/dev/null
), Aufruf von setsid() eine neue Sitzung zu erstellen, und dabei eine doppelte Gabel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ich am Ende tun war, um zu ändern parent.sh auf den folgenden
Wäre ich nicht gekommen, diese Lösung ohne Ihre Anregungen und Ursachenanalyse des Problems. Danke!
Und entschuldige mich für meine ungenaue Kommentar. (Es gab keinen Eingang, antwortete ich aus dem Gedächtnis und ich erinnerte mich falsch.)
&
mit> /dev/null &
funktioniert auch, wenn Sie nicht brauchen, um zu sammeln die Ausgabe.Den folgenden link aus dem Linux-Dokumentations-Projektschlägt das hinzufügen einer
wait
nach Ihremmail
Befehl inchild.sh
:http://tldp.org/LDP/abs/html/x9644.html
Zusammenfassung der oben genannten Dokument
Wenn Sie ändern
child.sh
zu schauen, wie die folgenden sollten Sie nicht die Erfahrung, dieses ärgernis:Oder wie @SebastianStigler Staaten in einem Kommentar zu Ihrer obigen Frage:
Dadurch wird der mail-Befehl zum schreiben
/dev/null
eher alsstdout
sollte auch aufhören, diese Verärgerung.Hoffe, das hilft
Wurde der Prozess noch in Verbindung mit der controlling-terminal, weil STDOUT muss irgendwo zu gehen. Sie lösten das problem durch umleiten in eine Datei ( > Start.log ).
Wenn Sie nicht daran interessiert, die Ausgabe, verwerfen STDOUT vollständig ( >/dev/null ).
Wenn Sie nicht daran interessiert, Fehler, entweder, entsorgen Sie beide ( &>/dev/null ).
Wenn Sie möchten, dass die Prozesse am laufen zu halten, auch nachdem Sie sich aus Ihrem terminal, verwenden Sie nohup—, die effektiv trennt Sie von dem, was du tust und lässt Sie leise im hintergrund laufen, bis Sie Ihren Rechner neu starten (oder sonstwie zu töten).
nohup child.sh param1a param2a &>/dev/null &