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;)
aus2) 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?
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%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.
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.
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?
Tags und Links shell background input netcat tty