GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Schreiben in stdin des Hintergrundprozesses

Lösung 1:

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 &

Der cat > /tmp/srv-input & ist wichtig, um zu vermeiden, dass Ihr Server ein EOF empfängt. Mindestens ein Prozess muss das Fifo schriftlich geöffnet haben, damit Ihr Server kein EOF erhält. Die PID dieses Befehls wird in /tmp/srv-input-cat-pid gespeichert Datei für letzteren Kill.

In Ihrem Fall, in dem Sie Ihren Server bereits gestartet haben, müssen Sie einen Debugger wie gdb verwenden an Ihren Prozess anzuhängen, um dessen stdin umzuleiten zum fifo:

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

Und tun Sie dann so etwas wie unten, um Eingaben an Ihren Server zu senden (falls erforderlich in einem anderen Terminalfenster):

echo "command" > /tmp/srv-input

Um ein EOF an Ihren Server zu senden, müssen Sie cat > /tmp/srv-input beenden verarbeiten, welche PID im /tmp/srv-input-cat-pid file gespeichert wurde .

Im Fall von GDB beenden Sie einfach GDB und EOF wird gesendet.

Lösung 2:

Sie könnten versuchen, in das PID-Verzeichnis /proc zu schreiben. Angenommen, die PID Ihres Daemons ist 2000, versuchen Sie, nach /proc/2000/fd/0

zu schreiben

Lösung 3:

Dasselbe wie oben, aber 'cat' hat bei mir nicht funktioniert. Die Datei wurde EOF und endete nach dem Senden eines Befehls.

Das hat bei mir funktioniert:

#!/bin/bash

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

Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

  3. So bereinigt systemd-tmpfiles /tmp/ oder /var/tmp (Ersatz von tmpwatch) in CentOS / RHEL 7

  4. So deaktivieren Sie das automatische Löschen der Dateien in den Verzeichnissen /tmp und /var/tmp in CentOS / RHEL 5,6

  5. Wie bringe ich meinen Golang-Webserver dazu, im Hintergrund zu laufen?

So aktualisieren Sie OpenSUSE 12.2 auf 12.3 (Desktop &Server)

Linux-tmp-Verzeichnis:Alles, was Sie wissen müssen

Wie kann ich einen Symfony-Prozess stoppen, der auf http://127.0.0.1:8000 lauscht

Wann sollte ich /dev/shm/ verwenden und wann sollte ich /tmp/?

Wie starte ich einen Linux-Hintergrundprozess automatisch neu, wenn er fehlschlägt?

Sollten Websites gemäß der empfohlenen Verwendung in /var/ oder /usr/ leben?