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 mit mail. 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.

InformationsquelleAutor theGuardian | 2015-02-02
Schreibe einen Kommentar