Ich bin auf einer Ubuntu 10.04 Box und habe einen Server im Hintergrund (myserver &) über ssh gestartet. Es läuft einwandfrei, aber ich brauche eine Möglichkeit, die Standardeinstellungen des Servers zu ermitteln, da die einzige Möglichkeit zur Steuerung des Servers über diese Methode besteht.
Gibt es eine Möglichkeit, die Standardeinstellung eines bereits laufenden Prozesses zu ermitteln, damit ich darauf schreiben kann (und hoffentlich die Standardeinstellung lesen kann)? Wenn ich das jetzt machen würde, würde ich es natürlich mit einem FIFO beginnen, das zu stdin umleitet, aber dafür ist es jetzt leider etwas spät.
Irgendwelche Ideen?
linux
bash
background-process
stdin
Tajmorton
quelle
quelle
Antworten:
Sie können versuchen, in das Verzeichnis / proc pid zu schreiben. Angenommen, die pid Ihrer Daemons ist 2000, versuchen Sie, an / proc / 2000 / fd / 0 zu schreiben
quelle
0
durch2
Satz auf die gleiche Datei, die in der Regel ist ein virtuelles Terminal (so etwas wie/dev/pty/...
). Der Befehl liest dann von FD0
und schreibt an FD1
und2
kommuniziert mit dem virtuellen Terminal (z. B. über SSH oder direkt mit Ihrem Terminalemulator). Wenn ein anderer Prozess auf diese Datei zugreift (z. B. durch/proc
), geschieht genau das Gleiche, dh das Schreiben in diese Datei schreibt in das Terminal und nicht in den Befehl.Sie könnten Ihren Server mit einer Named Pipe (Fifo) als Eingabe starten:
Dies
cat > /tmp/srv-input &
ist wichtig, um zu vermeiden, dass Ihr Server eine EOF empfängt. Bei mindestens einem Prozess muss das FIFO schriftlich geöffnet sein, damit Ihr Server keine EOF erhält. Die PID dieses Befehls wird in der/tmp/srv-input-cat-pid
Datei für den letzten Kill gespeichert.In Ihrem Fall, in dem Sie Ihren Server bereits gestartet haben, müssen Sie einen Debugger verwenden
gdb
, um eine Verbindung zu Ihrem Prozessstdin
herzustellen und ihn an das FIFO umzuleiten:Und dann tun Sie etwas wie unten, um Eingaben an Ihren Server zu senden (in einem anderen Terminalfenster, falls erforderlich):
Um eine EOF an Ihren Server zu senden, müssen Sie den
cat > /tmp/srv-input
Prozess beenden, in dem die PID gespeichert wurde/tmp/srv-input-cat-pid file
.Im Falle von GDB beenden Sie einfach GDB und EOF wird gesendet.
quelle
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? Damittail
funktioniert nicht, fügt dies jedoch hinzu, um den Job zu beenden:cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `Wie oben, aber "Katze" hat bei mir nicht funktioniert. Die Datei wurde EOF und endete nach dem Senden eines Befehls.
Das hat bei mir funktioniert:
quelle