Używam Ubuntu 10.04 i uruchomiłem serwer w tle (mój serwer i) przez ssh. Działa dobrze, ale potrzebuję sposobu, aby uzyskać standardowe wejście serwera, ponieważ jedynym sposobem kontrolowania serwera jest ta metoda.
Czy jest jakiś sposób, aby dostać się do standardu już działającego procesu, abym mógł do niego napisać (i mam nadzieję, że przeczytam jego standard)? Oczywiście, gdybym miał to teraz robić, zacznę od przekierowania FIFO na standardowe wejście, ale niestety jest już na to trochę za późno.
Jakieś pomysły?
linux
bash
background-process
stdin
tajmorton
źródło
źródło
Odpowiedzi:
Możesz spróbować napisać do katalogu / proc pid. Powiedz, że pid demonów wynosi 2000, spróbuj napisać do / proc / 2000 / fd / 0
źródło
0
poprzez2
ustawienie na ten sam plik, którym zwykle jest terminal wirtualny (coś w rodzaju/dev/pty/...
). Polecenie następnie odczytuje z FD0
i zapisuje do FD1
i2
komunikuje się z terminalem wirtualnym (np. Przez SSH lub bezpośrednio z emulatorem terminala). Jeśli jakikolwiek inny proces uzyskuje dostęp do tego pliku (np. Poprzez/proc
), dzieje się dokładnie to samo, tzn. Zapis do niego zapisuje w terminalu, a nie w poleceniu.Możesz uruchomić serwer z nazwanym potokiem (fifo) jako wejściem:
cat > /tmp/srv-input &
Jest ważne, aby uniknąć serwer otrzymać EOF. Co najmniej jeden proces musi mieć otwarte fifo na piśmie, aby Twój serwer nie otrzymał EOF. PID tego polecenia jest zapisywany w/tmp/srv-input-cat-pid
pliku dla późniejszego zabicia.W przypadku, gdy już uruchomiłeś serwer, musisz użyć debuggera, takiego jak
gdb
dołączenie do procesu, aby przekierować gostdin
do fifo:A następnie zrób coś takiego, jak poniżej, aby wysłać dane wejściowe na serwer (w razie potrzeby w innym oknie terminala):
Aby wysłać EOF na serwer, musisz zabić
cat > /tmp/srv-input
proces, w którym zapisano PID/tmp/srv-input-cat-pid file
.W przypadku GDB wystarczy wyjść z GDB, a EOF zostanie wysłany.
źródło
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? Dzięki temu rura będzie również otwarta ...tail
nie działa, ale dołączono to, aby zakończyć zadanie:cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `Tak jak powyżej, ale „kot” nie działał dla mnie. Plik otrzymał EOF i zakończył się po wysłaniu jednego polecenia.
To działało dla mnie:
źródło