Bir işleme çıktı gönderen bir kabuk komut dosyasını nasıl yaparım


11

Şu anda ekranda bir sunucu konsolu programı çalıştırıyorum çünkü hem okumalı hem de zaman zaman komut göndermem gerekiyor.

Uygulamayı arka planda bir daemon olarak çalıştırmak istiyorum (init ile başlat / durdur).

I could tail -fgünlüğü, ama bu beni sürecine girdi göndermek izin vermez.

Bunu hem okuma hem de giriş gönderebilmem için ayarlamanın bir yolu var mı, ancak yine de arka planda çalışıyor mu?

Ayrıca farklı süreçlerden (örneğin "Dur \ n" komutu gönderebilen bir kabuk komut dosyası) daemon'a girdi göndermek istiyorum.


Bunu okumak için gelen herkese sadece bir yorum - burada cevap harika. Adlandırılmış borular hakkında bilmiyorsanız, en azından onları denemenizi tavsiye ederim. Bunu kullanarak Minecraft'ı bir hizmet olarak çalıştırabilir ve adlandırılmış yöneltmeye yazarak diğer komut dosyalarından konsolla etkileşime girebilirim - böylece sunucuyu durdurmak, kullanıcılara mesaj göndermek vb. anahtar satırları aramak (bir kullanıcıya metin olarak gönderilen sohbet mesajlarını göndermek gibi)
Bill K

Yanıtlar:


9

Bir kanaldan oku, bir dosyaya yaz

Arka plan programının rasgele bir işlemle üretilen girdiyi okumasını istiyorsanız, bu işlemi bir boruya bağlamanız gerekir. Burada keyfi süreç, yankılanan komutlardır ve farklı bir bağlamda çalışacaktır. Bu yüzden adlandırılmış bir boru oluşturun (genellikle unix bağlamlarında fifo olarak adlandırılır).

mkfifo /var/run/daemon.fifo
</var/run/daemon.fifo /path/to/daemond --option >daemon.log

Ve sadece boruya komutlar yazın:

echo 'FORWARD 10' >/var/run/daemon.fifo
echo 'LEFT 72' >/var/run/daemon.fifo

Ancak, bu şekilde çalışma olasılığı düşüktür: Daemon'un standart girdisinde bir dosya sonu gördüğünde çıkma olasılığı yüksektir, bu da boruya yazan ilk işlem sona erer bitmez gerçekleşir. Bu tail -fsorunu önlemek için kullanabilirsiniz .

</var/run/daemon.fifo tail -c +1 -f | {
  echo $$ >/var/run/daemon.pid
  exec /path/to/daemond --option >daemon.log
}

Bazı tailuygulamalarda, arabelleğe alma yoluyla ısırılabilir: tailişlem, bir miktar çıktı verecek kadar bayt birikinceye kadar bekler. Bu POSIX araç kutusunda çözülebilir olduğunu sanmıyorum; bu bir sorunsa, önemsiz bir C veya Perl veya Python programı kullanın. Anlayabildiğim kadarıyla tailGNU coreutils (Linux ve başka yerlerde bulunan) bu konuda güvenlidir.

Daemon'u durdurduğunuzda süreci echo >/var/run/daemon.fifoöldürürsünüz tail.


Ekranın içinden programın başlatılması

Daemon'u doğrudan servis yöneticinizden çağırmak yerine (gerçekten sadece SysV init mi yoksa sarıcı komut dosyaları veya Upstart gibi ek bir şey mi kullanıyorsunuz?)

screen -c daemon.screenrc -L -d -m -S daemon_name /path/to/daemond --option

Arka plan programı servis yöneticisinin bir alt süreci olmayacağından, doğru işleme bir sinyal gönderdiğinizden emin olmanız gerekir. Bunun nasıl yapılacağı tam daemonun nasıl başlatıldığına ve neye göre değişir.

Bu var teknik olarak mümkün bir terminale çalışan bir işlem eklemek için, ama bu bir üretim sistemi için dışarı kesinlikle böylece programı çökmesine edeceğiz riski, var.

Bu -Lseçenek, ekranın penceresinde görünen her şeyi bir dosyaya yazmasını sağlar. Dosya adı yönergeyle daemon.screenrcbirlikte verilir logfile.


Aslında, bir senaryodan onun stdin'e mesaj gönderebilmek istiyorum - belki de sorduğum soru bu. Şu anda sunucuyu bir komut dosyasından çalıştırıyorum ve bir terminalde yazabiliyorum, ancak sadece bir hizmet olarak çalışıyor olması gerektiği gibi görünüyor ...
Bill K

@Bill: Tamam, anladım. Sonra aklıma gelen ilk şey adlandırılmış bir boru.
Gilles 'SO- kötü olmayı bırak'

Sanırım bu tam olarak istediğim şey @Gilles! Yine de daha iyi anlamam gerekiyor. Bunu anlamak için adam sayfalarını sıralamak için biraz zaman harcayacağım - Dürüst olmak gerekirse, çok azını alıyorum (yaptığınız şeylerin çoğunu alıyorum ve bunu nasıl yaptığınızdan neredeyse hiç yok - ve sanırım Benim teorim doğrudan sürece bağlanmak değil, aynı zamanda orijinal konsolun çalışıyor gibi görünmesini sağlamak için o / i deamons o / i'ye katılan başka bir komut dosyası oluşturmaktı. aynı anda başka bir komut dosyasından 'İLERİ 10' yankısını yapmak için.
Bill K

Sanırım çoğunu alıyorum. Eğer yıkarsam, şimdi anlıyorum "mkfifo boru" ve "kuyruk -f boru | komut> çıkış", bunları test ve onlar çalışır. Sanırım sahip olduğunuz diğer şeylerin çoğu, bir satırda çalıştırmak için hilelerdi - kritik bir şey eksik mi?
Bill K

@ Fatura: Ekranın içindeki terminale dışarıdan yazabilirsiniz (ekranın stuffkomutunu kullanarak ). Ancak burada bir terminalin ek yüküne (işleme, ancak en önemlisi bilişsel) ihtiyacınız yoktur, bir boru neredeyse yeterlidir (küçük bir dosya sonu yoksayıcı röle işlemi ile yeterlidir). Bir terminalde <fifo catveya başka <fifo tail -f | catbir terminalde biraz deneme yapmak isteyebilirsiniz echo >fifo; echo >fifo; Bence iyi olacaksın.
Gilles 'SO- kötü olmayı bırak'
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.