Einen Prozess vom Bash-Skript zum Hintergrund zwingen

570
Niksac

Ich versuche, ein bash-Skript zu erstellen, das unter anderem sunwait startet:

/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand & 

Sunwait ist eine Binärdatei, die auf astronomische Ereignisse wartet, bevor sie einen bestimmten Befehl ausführt. Ich habe das kaufmännische Und-Zeichen am Ende verwendet, um es in den Hintergrund zu senden, damit mein Skript andere Dinge tun kann, aber dies funktioniert nicht und ich weiß nicht warum.

Wenn Sie den Befehl direkt auf der Shell ausführen, wird sunwait auch nicht in den Hintergrund gesendet. Ich habe es auch ohne Erfolg versucht.

Ich bin auf Ubuntu 14.04 Server LTS. Warum funktioniert es nicht?

0

2 Antworten auf die Frage

1
Kamil Maciorowski

Sunwait ist eine Binärdatei, die auf astronomische Ereignisse wartet, bevor sie einen bestimmten Befehl ausführt.

Nachdem ich Ihre Syntax untersucht habe, denke ich, dass diese Interpretation falsch ist. In Ihrem Beispiel sunwaitwird nichts ausgeführt, tatsächlich wird kein Befehl gegeben. Ich kenne mich nicht aus sunwait, aber die schnelle Forschung hat mir gezeigt, dass es nur auf astronomische Ereignisse wartet und dann endet.

In Ihrem Fall geht es so:

  • Die Shell liest die Zeile, trifft auf ein Semikolon ;und führt alles bis zu diesem Punkt aus - das ist die sunwaitBefehlszeile.
  • Die Schale wartet, sunwaitbis sie fertig ist.
  • Schließlich sunwaitendet die Shell mycommandund führt sie aufgrund eines Et-Zeichens im Hintergrund aus &.

Daher ist die direkte Antwort auf Ihre Frage am häufigsten: Sie arbeitet nicht (funktioniert nicht, was Sie wollen), weil sie funktioniert (was Sie befehlen).

Fix:

  1. Entweder { /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand; } &

  2. oder /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E && mycommand &

In der ersten Zeile erscheinen die beiden Befehle so {}, &als wäre es ein einzelner Befehl, sodass alles in den Hintergrund geht. Einfach und oft gut genug. Der zweite Fall ist etwas anders: mycommandWird nur dann ausgeführt, wenn er sunwaitohne Fehler beendet wird (es sunwaitsei denn, er ist schlecht codiert). Es ist das Verhalten, das Sie eigentlich erwartet haben, nicht wahr? Persönlich finde ich den zweiten Fix eleganter. Stellen Sie sich vor, Sie machten einen Tippfehler mycommandund erkannten nach einiger Zeit, dass es sich um eine tickende Bombe handelt. Beim Töten sunwaitwird die Bombe im ersten Szenario ausgelöst, im zweiten entschärft.

Danke für die ausführliche Erklärung und für die Besprechung der möglichen Korrekturen !! Ich fühle mich jetzt ziemlich dumm und arbeitet wie ein Zauber :) Niksac vor 9 Jahren 0
1
Thomas Guyot-Sionnest

Ihre Zeile enthält zwei Befehle, die durch ein Semikolon ( ;) getrennt sind. Sie müssen entweder beide Befehle in den Hintergrund senden:

/root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E & mycommand & 

Wenn Sie möchten, dass die Befehle nacheinander ausgeführt werden, führen Sie sie sowohl in einer Subshell als auch im Hintergrund aus:

( /root/bin/sunwait sun up -0:00:00 54.453158N 11.013071E; mycommand ) & 

Ich glaube, das letztere Beispiel ist das, was Sie erreichen wollen, da das erste jetzt beide Befehle startet und sie im Hintergrund unterstützt.