Saya menggunakan kotak Ubuntu 10,04, dan memulai server di latar belakang (myserver &) lewat ssh. Sudah berjalan dengan baik, tapi saya perlu cara untuk mendapatkan stdin server, karena satu-satunya cara untuk mengendalikan server adalah melalui metode ini.
Apakah ada cara untuk mendapatkan stdin dari proses yang sudah berjalan sehingga saya bisa menulisnya (dan semoga membaca stdout-nya)? Jelas, jika saya akan melakukan ini sekarang, saya akan memulainya dengan FIFO yang mengarahkan kembali ke stdin, tapi sayangnya sudah agak terlambat untuk itu sekarang.
Ada ide?
linux
bash
background-process
stdin
tajmorton
sumber
sumber
Jawaban:
Anda dapat mencoba menulis ke direktori pid / proc itu. Katakanlah pid daemon Anda adalah 2000, coba tulis ke / proc / 2000 / fd / 0
sumber
0
melalui2
set ke file yang sama, yang biasanya adalah terminal virtual (sesuatu seperti/dev/pty/...
). Perintah tersebut kemudian membaca dari FD0
dan menulis ke FD1
dan2
untuk berkomunikasi dengan terminal virtual (misalnya melalui SSH atau langsung dengan emulator terminal Anda). Jika ada proses lain mengakses file itu (misalnya melalui/proc
), hal yang persis sama terjadi, yaitu menulis kepadanya menulis ke terminal dan bukan ke perintah.Anda dapat memulai server Anda dengan pipa bernama (fifo) sebagai inputnya:
The
cat > /tmp/srv-input &
penting untuk menghindari server Anda untuk menerima EOF a. Setidaknya satu proses harus memiliki fifo dibuka secara tertulis sehingga server Anda tidak menerima EOF. PID dari perintah ini disimpan dalam/tmp/srv-input-cat-pid
file untuk pembunuhan terakhir.Dalam kasus Anda di mana Anda sudah memulai server Anda, Anda harus menggunakan debugger seperti
gdb
untuk melampirkan ke proses Anda untuk mengarahkan kembalistdin
ke fifo:Dan kemudian lakukan sesuatu seperti di bawah ini untuk mengirim input ke server Anda (di jendela terminal lain jika perlu):
Untuk mengirim EOF ke server Anda, Anda harus mematikan
cat > /tmp/srv-input
proses PID yang telah disimpan di/tmp/srv-input-cat-pid file
.Dalam kasus GDB, cukup keluar dari GDB dan EOF akan dikirim.
sumber
mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &
? Ini akan menjaga pipa tetap terbuka juga ...tail
tidak bekerja, tetapi menambahkan ini untuk menyelesaikan pekerjaan:cat /tmp/srv-input | myserver; kill -9
cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `Sama seperti di atas, tetapi 'kucing' tidak bekerja untuk saya. File mendapat EOF dan berakhir setelah mengirim satu perintah.
Ini bekerja untuk saya:
sumber