Mam niestandardowego demona zarządzanego przez upstart na moim serwerze Ubuntu. Działa idealnie, z wyjątkiem tego, że muszę przechwycić (zalogować) dane wyjściowe demona. Strona oficjalna strofy mówi, że mogę używać console logged
, aby to zrobić, ale co to plik dziennika?
Przeczytałem również, że nieconsole logged
jest to już ważna zwrotka . Obecnie używam 0.3.9 (Hardy), ale za kilka miesięcy zaktualizuję do 0.6.x (Lucid). Jeśli console logged
w rzeczywistości nie będzie działać z późniejszymi wersjami, czego użyć zamiast tego?
Odpowiedzi:
Ten fragment kodu potokuje dane wyjściowe usługi do programu rejestrującego, jednocześnie umożliwiając wykonanie procesu usługi (zastępując w ten sposób proces powłoki), aby upstart nie pomylił się. Dba również o to, aby proces rejestrowania był ponownie wyświetlany dla init, więc nie jest to potomek twojej usługi i pozwala uniknąć pozostawiania cruft w systemie plików, nawet jeśli trzeba tymczasowo utworzyć fifo.
Oto jak to działa:
mkfifo /tmp/myservice-log-fifo
po prostu tworzy specjalny plik fifo (aka o nazwie potok). Wpiszman 7 fifo
więcej informacji.( logger ... </tmp/myservice-log-fifo & )
rozpoczyna odczyt rejestratora z fifo, w tle. Pareny powodują, że proces rejestrujący zostaje ponownie rozpoznany jako init, a nie pozostaje potomkiem bieżącego procesu powłoki.exec >/tmp/myservice-log-fifo
przekierowuje standardowe wyjście powłoki do fifo. Teraz mamy otwarty deskryptor pliku dla tego fifo i tak naprawdę nie potrzebujemy już wpisu systemu plików ...rm /tmp/myservice-log-fifo
więc go usuniemy.exec myservice 2>/dev/null
po prostu uruchamia usługę w zwykły sposób. Stdout już jedzie do FIFO, a to się nie zmieni, gdy nowy program się uruchomi.AKTUALIZACJA:
set -e
nie jest potrzebna, ponieważ Upstart domyślnie uruchamia skrypty z tą opcją (patrz http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh )źródło
set -e
?set -e
Wywołuje skrypt natychmiast opuścić jeśli komenda nie powiedzie się. Bez tej linii skrypt kontynuowałby uruchamianie kolejnych poleceń bezużytecznie (i prawdopodobnie niebezpiecznie).exec 2>&1
powyżejrm
linii i usuń ją2>/dev/null
z ostatniej linii.W przypadku najnowszych wersji Ubuntu (12.04+) po prostu użyj
A wyjście demona (STDOUT & STDERR) zostanie dołączone do
/var/log/upstart/<service>.log
http://upstart.ubuntu.com/cookbook/#console-log
źródło
Jeśli korzystasz z
console output
pokoju , a następnie rurę wyjściową do skryptulogger
(interfejs poleceń powłoki do syslog (moduł dziennika System 3)), a następnie, że praca będzie.Na przykład
zaloguje się do
/var/log/messages
Na przykład
zaloguje się
/var/log/messages
i otaguje każdą wiadomośćmy-script
logger --help
dla opcji użycia rejestratora.(Jestem na Amazon Linux AMI, który jest oparty na Centos 5.x; YMMV)
źródło
logger
, a nie w procesie, którym faktycznie chcesz zarządzać.Nie udało mi się
mkfifo
podstępem pracować zadowalająco; Wygląda na to, że nie przechwycił stderr, a próby przekierowania spowodowały, że Upstart zwolnił za kaucją bez błędów.Ma również niefortunny efekt uboczny, sprawiając, że
logger
proces zostaje zawieszony jako dzieckoinit
, więc informacja o tym, kto „jest właścicielem” programu rejestrującego, zostaje utracona, a każdy, kto nie jest świadomy tego,mkfifo
może założyć, że jest to ryzykowny proces, który można zabić.Zamiast tego otrzymałem następujące rozwiązanie, które rozwiązuje wszystkie te problemy. Powoduje,
logger
że staje się procesem potomnym, zachowując usługę jako proces root. Niestety wymaga wykonaniabash
, ale po prostu wygląda na brudne.Wykorzystuje sztuczkę, która przekierowuje stdout i stderr do polecenia. Ponieważ wykonujemy usługę wewnątrz
bash
polecenia, ma to efekt uboczny polegający na zastąpieniu powłoki i magicznym uczynieniu basha procesem potomnym usługi, jak pokazanops aufxw
:Z jakiegoś powodu powyższe polecenie musi być spakowane w
bash -c
. Zakładam, że dzieje się tak, ponieważ Upstart udaje, że uruchamia twój skrypt przez Bash, ale tak naprawdę nie jest. Jeśli ktoś może zasugerować sposób na uniknięcie dodatkowej powłoki bash, byłoby to niesamowite.źródło
exec bash -l << EOF
.To brzydkie, ale jak dotąd najlepsze, jakie znalazłem
exec / path / to / server >> /tmp/upstart.log 2> & 1
źródło
Możesz także przekierować dane wyjściowe do syslog, np
Jednak potok może spowodować, że upstart pomyli PID procesu rejestrowania z PID demona.
źródło
expect fork
lubexpect daemon
zwrotkę. Albo możeszcat
umieścić plik pid w komunikacie dziennika inaczej, tak myślę.Inną alternatywą jest użycie trójnika, takiego jak:
aby uzyskać zarówno plik początkowy, jak i dane wyjściowe syslog
źródło