mkfifo
Hile tatmin edici çalışmak için alamadım ; stderr'i yakalamak gibi görünmüyordu ve yönlendirme denemeleri Upstart'ın hatasız bir şekilde kurtarılmasına neden oldu.
Aynı zamanda logger
sürecin bir çocuk olarak takılmasının talihsiz bir yan etkisi vardır init
, bu nedenle kaydedicinin "kime sahip olduğu" hakkındaki bilgiler kaybedilir ve kudretten haberi olmayan biri mkfifo
bunun öldürülebilecek sarkan bir süreç olduğunu varsayabilir.
Bunun yerine, tüm bu sorunları çözen aşağıdaki çözüme ulaştım. Bu neden logger
kök süreç olarak hizmet korurken, bir çocuk süreç haline. Ne yazık ki, yürütülmesi gerekiyor bash
, ama sadece kirli görünüyor .
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Bu stdout ve stderr komutlarını bir komuta yönlendiren bir numara kullanır. Hizmeti bash
komutun içinde yürüttüğümüz için , kabuğun değiştirilmesi ve sihirli bir şekilde bash'ın aşağıdaki gibi gösterildiği gibi hizmetin bir alt süreci haline gelmesinin yan etkisi vardır ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
Nedense Yukarıdaki komut bir sarılmış olması gerekir bash -c
. Bunun, Upstart'ın sadece betiğinizi Bash üzerinden çalıştırıyormuş gibi davrandığı içindir, ancak aslında değildir. Herhangi biri ekstra bash kabuğundan kaçınmanın bir yolunu önerebilirse, bu harika olurdu.