web-dev-qa-db-fra.com

Ecrire à stdin du processus d'arrière-plan

Je suis sur une boîte Ubuntu 10.04 et j'ai démarré un serveur en arrière-plan (myserver &) sur ssh. Cela fonctionne bien, mais j'ai besoin d'un moyen pour accéder au stdin du serveur, car la seule façon de contrôler le serveur est par cette méthode.

Existe-t-il un moyen d'accéder à la stdin d'un processus déjà en cours pour que je puisse y écrire (et, espérons-le, lire sa sortie standard)? Évidemment, si j'allais faire ça maintenant, je commencerais avec une FIFO redirection vers stdin, mais malheureusement c'est un peu tard pour ça maintenant.

Des idées?

27
tajmorton

Vous pouvez essayer d'écrire dans son répertoire pid/proc. Supposons que le pid de vos démons soit 2000, essayez d'écrire dans/proc/2000/fd/0

10
katriel

Vous pouvez démarrer votre serveur avec un canal nommé (fifo) comme entrée:

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

Le cat > /tmp/srv-input & est important pour éviter que votre serveur ne reçoive un EOF. Au moins un processus doit avoir le fifo ouvert par écrit afin que votre serveur ne reçoive pas d'EOF. Le PID de cette commande est enregistré dans le /tmp/srv-input-cat-pid fichier pour ce dernier kill.

Dans le cas où vous avez déjà démarré votre serveur, vous devez utiliser un débogueur tel que gdb à attacher à votre processus pour rediriger son stdin vers le fifo:

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

Et puis faites quelque chose comme ci-dessous pour envoyer des entrées à votre serveur (dans une autre fenêtre de terminal si nécessaire):

echo "command" > /tmp/srv-input

Pour envoyer un EOF à votre serveur, vous devez tuer le cat > /tmp/srv-input processus dont le PID a été enregistré dans le /tmp/srv-input-cat-pid file.

Dans le cas de GDB, quittez simplement GDB et EOF sera envoyé.

29
jfg956

Comme ci-dessus, mais "chat" ne fonctionnait pas pour moi. Le fichier a obtenu EOF et s'est terminé après l'envoi d'une commande.

Cela a fonctionné pour moi:

#!/bin/bash

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