Verwendung von netcat / cat in einem Hintergrund-Shell-Skript (Wie vermeidet man Stopped (tty input)?)

7

Zusammenfassung: Wie führe ich eine interaktive Aufgabe im Hintergrund aus?

Details: Ich versuche, dieses einfache Skript unter Ascheshell (Busybox) als Hintergrundaufgabe auszuführen.

  

myscript.sh & amp;

Das Skript stoppt jedoch sofort ...

  

[1] + Gestoppt (tty Eingabe) myscript.sh

Der Inhalt von myscript.sh ... (nur der relevante Teil, außer dass ich SIGINT, SIGHUP etc. einfange)

%Vor%

Von einfachen Kommandozeilen-Tests habe ich herausgefunden, dass Bot Cat und Netcat versuchen, von tty zu lesen. Beachten Sie, dass diese Netcat-Version kein -e hat, um tty zu unterdrücken.

Was kann jetzt getan werden, um zu vermeiden, dass myscript gestoppt wird?

Dinge, die ich so ohne Erfolg versucht habe:

1) netcat / cat ... & lt; / dev / tty (oder die Ausgabe von tty )

2) Ausführen des Blocks, der cat und netcat enthält, in einer Subshell mit (). Dies kann aber dann funktionieren, wie PID von Katze zu ergreifen?

Über euch Experten ...

Das Problem besteht immer noch. Ein einfacher Test für Sie alle zu versuchen:

1) Führen Sie in einem Terminal netcat -l -p 11111 (ohne & amp;)

aus

2) In einem anderen Terminal läuft netcat localhost 11111 & amp; (Dies sollte nach einiger Zeit mit der Meldung Stopped (TTY-Eingabe)) aufhören

Wie vermeide ich das?

    
LovelyVirus 12.08.2011, 15:22
quelle

5 Antworten

9

Sie wollen wahrscheinlich netcat's "-d" option , was besagt, dass es nicht von STDIN lesen soll.

    
darkuncle 19.07.2012 16:39
quelle
6

Ich kann bestätigen, dass -d Netcat dabei hilft, im Hintergrund zu laufen.

Ich sah das gleiche Problem mit:

%Vor%

Jedes Mal, wenn ich jobs abgefragt habe, würde die Pipe-Eingabe stoppen.

Das Ändern des Befehls in den folgenden wurde behoben:

%Vor%     
SlightNihilism 19.06.2013 06:04
quelle
4

Sind Sie sicher, dass Sie Ihr Skript wie gehabt gegeben haben oder haben Sie nur ein grobes Faksimile eingegeben, um die allgemeine Idee zu illustrieren? Das Skript in Ihrer Frage hat viele Fehler, die verhindern sollten, dass es jemals richtig ausgeführt wird, was mich wundern lässt.

  1. Die Leerzeichen um = in catpid=$! machen die Zeile nicht zu einer gültigen Variablenzuweisung. Wenn das in Ihrem ursprünglichen Skript war, bin ich überrascht, dass Sie keine Fehler bekommen haben.

  2. Die Zeile kill catpid sollte fehlschlagen, weil das Literalwort catpid keine gültige Job-ID ist. Wahrscheinlich möchtest du kill "$catpid" .

Wie für Ihre eigentliche Frage:

  • cat sollte von /dev/charfile gelesen werden und nicht von stdin oder anderswo. Sind Sie sicher, dass versucht wurde, eine Eingabe zu lesen?

  • Haben Sie versucht, die Eingabe von netcat wie netcat < /dev/null umzuleiten, wenn Sie netcat nicht benötigen, um etwas zu lesen?

jw013 12.08.2011 16:16
quelle
1

Ich muss ein Netcat verwenden, das nicht die Option -d hat.

"echo -n | netcat ... & amp;" scheint eine wirksame Problemumgehung zu sein: d. h. Schließen Sie die Standardeingabe in netcat sofort, wenn Sie sie nicht verwenden müssen.

    
J Ashley 19.11.2013 10:33
quelle
0

Da es noch nicht wirklich beantwortet wurde, wenn die Option Busybox und -d nicht verfügbar ist, behält der folgende Befehl netcat "am Leben", wenn er an den Hintergrund gesendet wird:

%Vor%

netcat < /dev/null und echo -n | netcat funktionierten nicht für mich.

    
leblop 24.02.2016 08:51
quelle

Tags und Links