Frage Schreiben in stdin des Hintergrundprozesses


Ich bin auf einer Ubuntu 10.04 Box, und startete einen Server im Hintergrund (myserver &) über ssh. Es ist gut gelaufen, aber ich brauche einen Weg, um auf die Server-Standardeingabe zu kommen, da der Server durch diese Methode nur kontrolliert werden kann.

Gibt es einen Weg, um auf den Stand eines bereits laufenden Prozesses zu kommen, damit ich ihm schreiben kann (und hoffentlich seinen Standout lese)? Offensichtlich, wenn ich das jetzt machen würde, würde ich es mit einem FIFO starten, der auf stdin umleitet, aber leider ist es ein bisschen zu spät dafür.

Irgendwelche Ideen?


24
2017-10-08 09:22


Ursprung


Könntest du es nicht einfach in den Vordergrund bringen? ('jobs' listet Ihren aktuellen Hintergrundprozess auf, 'fg $ X' bringt den Job zurück in den Vordergrund, ctrl + b hält den Job an und bringt Sie zurück in Ihre Shell, während 'bg' den pausierten Prozess in der Hintergrund) - symcbean


Antworten:


Sie könnten versuchen, in sein / proc pid-Verzeichnis zu schreiben. Sagen Sie, die PID Ihrer Daemons ist 2000, versuchen Sie, nach / proc / 2000 / fd / 0 zu schreiben


10
2017-10-08 09:33



Danke ... Ich fand das direkt nachdem ich dies gepostet habe (nach einem Tag des Suchens - typisch). Das scheint zu funktionieren (soweit Daten tatsächlich an das Programm gesendet werden). Leider akzeptiert das Programm die Befehle nicht. Ich habe es getestet, den Server auf meinem lokalen Computer ausgeführt, und tatsächlich, ich sehe die Daten angezeigt, aber das Programm erkennt die Befehle nicht. Ich muss auf dem Server-Terminal manuell eingeben, und dann sagt es nur unerkannten Befehl. Vielleicht etwas Java-Seltsamkeit? Ich stecke fest... - tajmorton
Wie wäre es mit echo -e "etwas \ n"> / proc / 2000 / fd / 0? - katriel
Eigentlich funktioniert das nicht immer als / proc / <pid> / fd / 0 Punkte auf / dev / pts <einige Zahlen> auf mindestens einigen Systemen ... - bk138
Die erste Antwort auf serverfault.com/questions/178457/ ... stellt fest, dass dieser Ansatz tatsächlich nicht funktioniert. - barrycarter
Das funktioniert nicht wirklich. Ihre Shell startet normalerweise (wenn keine Pipes oder Umleitungen verwendet werden) einen Befehl mit Dateideskriptoren 0 durch 2 auf die gleiche Datei, die normalerweise ein virtuelles Terminal ist (etwas wie /dev/pty/...). Der Befehl dann liest von FD 0und schreibt zu FD 1und 2 um mit dem virtuellen Terminal zu kommunizieren (z. B. über SSH oder direkt mit Ihrem Terminal-Emulator). Wenn ein anderer Prozess auf diese Datei zugreift (z. B. durch /proc), genau dasselbe passiert, d.h. Schreiben dazu schreibt das Terminal und nicht das Kommando. - Feuermurmel


Sie könnten Ihren Server mit einer Named Pipe (Fifo) als Eingabe starten:

mkfifo /tmp/srv-input
cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid
cat /tmp/srv-input | myserver &

Das cat > /tmp/srv-input & Es ist wichtig, dass Ihr Server keine EOF empfängt. Bei mindestens einem Prozess muss der Fifo schriftlich geöffnet sein, damit Ihr Server kein EOF erhält. Die PID dieses Befehls wird in der. Gespeichert /tmp/srv-input-cat-pid Datei für letzteres töten.

In Ihrem Fall, wo Sie Ihren Server bereits gestartet haben, müssen Sie einen Debugger wie gdb an Ihren Prozess anhängen, um ihn umzuleiten stdin zum Fifo:

gdb -p PID
call close(0)
call open(0, "/tmp/srv-input", 0600)

Und dann tun Sie etwas wie unten, um Eingaben an Ihren Server zu senden (in einem anderen Terminal-Fenster, falls nötig):

echo "command" > /tmp/srv-input

Um eine EOF an Ihren Server zu senden, müssen Sie die cat > /tmp/srv-input Prozess welche PID in der gespeichert wurde /tmp/srv-input-cat-pid file.

Im Falle von GDB, nur beenden GDB und EOF wird gesendet.


25
2017-08-03 13:06



Dies ist ein viel portablerer Ansatz als der von @katriel, da / proc / 2000 / fd / 0 nicht auf allen Systemen steht. - Prior99
Der Trick mit dem "cat> / tmp / srv-input &" hat mir Kopfschmerzen erspart. Vielen Dank! - Prior99
Wie wäre es mit mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver & ? Das hält auch die Pfeife offen ... - bk138
@ bk138: es sieht für mich so aus, als ob der Schwanz funktionieren sollte, aber es gibt nur einen Weg, es genau zu wissen: Test. - jfg956
tail funktioniert nicht, aber angehängt, um den Job zu beenden: cat /tmp/srv-input | myserver; kill -9 cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * ` - Thiago Macedo


Das gleiche wie oben, aber "Katze" hat nicht für mich funktioniert. Die Datei erhielt EOF und wurde nach dem Senden eines Befehls beendet.

Das hat für mich funktioniert:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &

2
2017-11-16 13:27