GNU/Linux >> Znalost Linux >  >> Linux

Zápis do standardního procesu na pozadí

Řešení 1:

Můžete spustit server s pojmenovaným kanálem (fifo) jako jeho vstupem:

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

cat > /tmp/srv-input & je důležité zabránit tomu, aby váš server obdržel EOF. Alespoň jeden proces musí mít fifo otevřené písemně, aby váš server neobdržel EOF. PID tohoto příkazu je uložen v /tmp/srv-input-cat-pid soubor pro poslední zabití.

Ve vašem případě, kdy jste již spustili svůj server, musíte použít debugger, například gdb připojit k vašemu procesu a přesměrovat jeho stdin k fifo:

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

A pak proveďte něco jako níže pro odeslání vstupu na váš server (v případě potřeby v jiném okně terminálu):

echo "command" > /tmp/srv-input

Chcete-li poslat EOF na váš server, musíte zabít cat > /tmp/srv-input proces, který PID byl uložen do /tmp/srv-input-cat-pid file .

V případě GDB stačí GDB opustit a EOF bude odesláno.

Řešení 2:

Můžete zkusit zapisovat do jeho adresáře /proc pid. Řekněme, že pid vašich démonů je 2000, zkuste napsat do /proc/2000/fd/0

Řešení 3:

Totéž jako výše, ale 'cat' mi nefungovalo. Soubor dostal EOF a skončil po odeslání jednoho příkazu.

Toto fungovalo pro mě:

#!/bin/bash

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

Linux
  1. Jak upgradovat OpenSUSE 12.2 na 12.3 (počítač a server)

  2. Jak Linux zpracovává více po sobě jdoucích oddělovačů cest (/home////username///soubor)?

  3. Bash =~ Regex A Https://regex101.com/?

  1. UNIX / Linux :Jaká je správná oprávnění adresářů /tmp a /var/tmp

  2. Jak mohu zastavit proces symfony, který poslouchá na http://127.0.0.1:8000

  3. Jaký je rozdíl mezi /tmp a /run?

  1. echo nebo print /dev/stdin /dev/stdout /dev/stderr

  2. Jak změnit výchozí /tmp na /home/user/tmp

  3. Rozdíl a správné použití pro /tmp a /var/tmp