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 -f
sorunu ö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ı tail
uygulamalarda, arabelleğe alma yoluyla ısırılabilir: tail
iş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 tail
GNU 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 -L
seçenek, ekranın penceresinde görünen her şeyi bir dosyaya yazmasını sağlar. Dosya adı yönergeyle daemon.screenrc
birlikte verilir logfile
.