Ausführen eines Piped-Bash-Skripts im Hintergrund

Ausführen eines Piped-Bash-Skripts im Hintergrund

Ich versuche, ein Überwachungsskript zu erstellen, um die Localhost-Kommunikation mit Netcat zu überwachen. Ich habe zwei Skripte erstellt, eines zum Starten der Überwachungsschleife und eines für die Schleife selbst. Sie lauten wie folgt:

start.sh

#!/bin/bash
netcat localhost 1099  | bash loop.sh &

Schleife.sh

#!/bin/bash
while read sInput; do
     ...do something with $sInput
done

Das Ausführen dieser Anwendung ohne Vordergrund funktioniert einwandfrei, aber sobald ich versuche, dieses Skript im Hintergrund auszuführen, wird es sofort gestoppt. Kann mir bitte jemand erklären, warum das passiert und wie ich das Problem beheben kann?

Mein Endziel ist ein Bash-Skript, mit dem ich ein Arch-Linux-Daemon-Skript erstellen kann, damit alles perfekt funktioniert. Ich bin für Ihre Hilfe dankbar.

Antwort1

Klingt, als würde es von der Standardeingabe (stdin) lesen. Versuchen Sie, die -dOption (Nicht versuchen, von stdin zu lesen) hinzuzufügen netcat. Oder leiten Sie auf der Befehlszeile um:

netcat localhost 1099 <&- | bash loop.sh &

Möglicherweise möchten Sie auch sicherstellen nohup, dass es nicht negativ beeinflusst wird, wenn Sie die Shell verlassen, bevor sie stoppt.

Antwort2

Der Netcat-Prozess liest von seiner Standardeingabe. Da er mit dem Terminal verbunden ist, muss die Prozessgruppe, in der sich Netcat befindet (also die Pipeline), im Vordergrund laufen.

Sie müssen am Anfang der Pipeline etwas einfügen, das die vom Server erwartete Eingabe sendet. Bei einem HTTP-Server könnten Sie beispielsweise Folgendes haben:

netcat localhost 1099 <<EOF | … &
GET HTTP/1.0 http://localhost:1099/somewhere
X-Header: wibble

EOF

Wenn der Server keine Eingabe liest, leiten Sie netcatdie Eingabe von um /dev/null.

Antwort3

Habe ein Dienstprogramm entdeckt, das verspricht, Pipes bereitzustellen, ohne dass ein separates neues, daemonisiertes Bash-Skript erforderlich ist. Könnte nützlich sein:https://github.com/flonatel/pipexec

pipexec -- [NETCAT netcat localhost 1099]  [LOOP bash loop.sh] '{NETCAT:1>LOOP:0}'

verwandte Informationen