Arkaplan işlemi stdin için yazma


25

Bir Ubuntu 10.04 kutusuyum ve ssh üzerinden arka planda (myserver &) bir sunucu başlattım. İyi çalışıyor, ancak sunucuyu denetlemenin tek yolu bu yöntemde olduğu için sunucunun stdinine erişmenin bir yoluna ihtiyacım var.

Halen devam etmekte olan bir sürecin başını çekmenin bir yolu var, böylece ona yazabilirim (ve inşallah stdout'unu okuyabilirim)? Açıkçası, bunu şimdi yapacak olsaydım, bunu stdin'e yönlendiren bir FIFO ile başlatırdım, ama ne yazık ki şimdi bunun için biraz geç.

Herhangi bir fikir?


Onu tekrar ön plana çıkaramaz mısın? ('işler' mevcut arkaplan işlemlerinizi listeleyecek, 'fg $ X' işi yeniden ön plana çıkaracak, ctrl + b işi duraklatacak ve sizi kabuğunuza döndürecek, 'bg' duraklatılmış işlemine devam edecek arka plan)
symcbean

Yanıtlar:


10

/ Proc pid dizinine yazmayı deneyebilirsiniz. Daemonların yardımının 2000 olduğunu söyleyin, / proc / 2000 / fd / 0 yazmayı deneyin


Teşekkürler ... Bunu gönderdikten hemen sonra buldum (tipik bir gün sonra). Bu iş gibi görünüyor (aslında programa veri göndermek kadar). Ne yazık ki, program komutları kabul etmiyor. Sunucuyu yerel bilgisayarımda çalıştırarak test ettim ve tabii ki, verilerin göründüğünü gördüm, ancak program komutları tanımıyor. Sunucu terminalinde el ile enter tuşuna basmam gerekiyor, sonra tanınmayan bir komut veriyor. Belki biraz garip gariplik?
Sıkıştım

1
echo -e "bir şey \ n"> / proc / 2000 / fd / 0'a ne dersiniz?
katriel

Aslında bu alway olarak sworking değildir / proc / <pid> / fd / 0 puan için / dev / pts <bir sayı> en azından bazı sistemlerde ...
bk138

Serverfault.com/questions/178457/… için ilk cevap , bu yaklaşımın işe yaramadığını belirtir.
barrycarter

2
Bu aslında işe yaramıyor. Kabuğunuz normalde (hiçbir boru veya yönlendirme kullanılmadığında), dosya tanımlayıcıları 0ile 2aynı dosyaya ayarlanmış bir komut başlatır , bu normalde sanal bir terminaldir (buna benzer /dev/pty/...). Komut sonra okur FD gelen 0ve yazar FD 1ve 2(örneğin terminal emülatörü ile SSH üzerinden veya doğrudan) sanal terminali ile iletişim kurmak için. Başka herhangi bir işlem bu dosyaya erişirse (örneğin, üzerinden /proc), aynı şey olur, yani ona yazmak , terminale yazar ve komuta yazmaz.
Feuermurmel

29

Sunucunuzu giriş olarak adlandırılmış bir kanalla (fifo) başlatabilirsiniz:

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

cat > /tmp/srv-input &Bir EOF almak üzere sunucuyu önlemek önemlidir. Sunucunuz bir EOF alamaması için en az bir işlemin yazılı olarak açık olması gerekir. Bu komutun PID'si, /tmp/srv-input-cat-pidson öldürme için dosyaya kaydedilir .

Zaten sunucu başladıktan sizin durumda, böyle bir hata ayıklayıcı kullanmak zorunda gdbit'i yönlendirmek için işleme ekleme stdinfıfo'ya:

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

Ardından sunucunuza giriş göndermek için feryat gibi bir şey yapın (gerekirse başka bir terminal penceresinde):

echo "command" > /tmp/srv-input

Sunucunuza bir EOF göndermek için, PID'nin cat > /tmp/srv-inputkaydedilmiş olduğu işlemi sonlandırmanız gerekir /tmp/srv-input-cat-pid file.

GDB durumunda, sadece GDB'den çıkın ve EOF gönderilecektir.


1
bu, / proc / 2000 / fd / 0 olarak @ katriel'inkinden çok daha taşınabilir bir yaklaşımdır.
Önce 9

"Cat> / tmp / srv-input &" ile ilgili numara bana bazı baş ağrıları verdi. Teşekkür ederim!
Önce 9

Ne hakkında mkfifo /tmp/srv-input; tail -f /tmp/srv-input | myserver &? Bu, boruyu da açık tutacak ...
bk138 16.03.2015

@ bk138: kuyruğun çalışması gerektiği için bana bakıyor, ancak kesin olarak bilmenin tek bir yolu var: test.
jfg956

tailişe yaramaz, ancak işi bitirmek için bunu ekledi: cat /tmp/srv-input | myserver; kill -9 cat / tmp / srv-input-cat-pid` && rm / tmp / srv-input-cat * `
Thiago Macedo

4

Yukarıdakiyle aynı, ancak 'kedi' benim için işe yaramadı. Dosya EOF aldı ve bir komut gönderdikten sonra sona erdi.

Bu benim için çalıştı:

#!/bin/bash

mkfifo /tmp/srv-input
tail -f /tmp/srv-input | myserver &
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.