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 afin que je puisse y écrire (et, espérons-le, lire sa sortie standard)? Évidemment, si j'allais faire ça maintenant, je commencerais par une redirection FIFO vers stdin, mais malheureusement c'est un peu tard pour ça maintenant.
Des idées?
linux
bash
background-process
stdin
tajmorton
la source
la source
Réponses:
Vous pouvez essayer d'écrire dans son répertoire pid / proc. Supposons que le pid de votre démon soit 2000, essayez d'écrire dans / proc / 2000 / fd / 0
la source
0
via2
le même fichier, qui est normalement un terminal virtuel (quelque chose comme/dev/pty/...
). La commande lit alors depuis FD0
et écrit dans FD1
et2
pour communiquer avec le terminal virtuel (par exemple via SSH ou directement avec votre émulateur de terminal). Si un autre processus accède à ce fichier (par exemple via/proc
), exactement la même chose se produit, c'est- à- dire que l' écriture sur celui-ci écrit sur le terminal et non sur la commande.Vous pouvez démarrer votre serveur avec un canal nommé (fifo) comme entrée:
Il
cat > /tmp/srv-input &
est important d'é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
pour le joindre à votre processus pour le redirigerstdin
vers le fifo: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):
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, il suffit de quitter GDB et EOF sera envoyé.
la source
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? Cela gardera le tuyau ouvert aussi ...tail
ne fonctionne pas, mais a ajouté ceci pour terminer le travail:cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `Comme ci-dessus, mais «chat» ne fonctionnait pas pour moi. Le fichier a obtenu l'EOF et s'est terminé après l'envoi d'une commande.
Cela a fonctionné pour moi:
la source