Моим текущим фаворитом является Zabbix. Существует также Nagios и возможно немногие другие. Но если бы это - всего один сервис, я, вероятно, записал бы сценарий жемчуга для контроля его и журнал к sqlite.
Это является ужасным, но до сих пор лучшим, я нашел
должностное лицо/path/to/server>> /tmp/upstart.log 2> &1
Этот фрагмент будет передавать вывод вашей службы по конвейеру. в регистратор, при этом позволяя выполнять сервисный процесс (таким образом заменяя процесс оболочки) чтобы выскочка не запуталась. Это также делает убедитесь, что процесс регистратора переименован в init, поэтому это не ребенок вашей службы, и он избегает оставляя мусор сидящим в файловой системе, даже хотя для этого необходимо временно создать файл fifo.
script
mkfifo /tmp/myservice-log-fifo
( logger -t myservice </tmp/myservice-log-fifo & )
exec >/tmp/myservice-log-fifo
rm /tmp/myservice-log-fifo
exec myservice 2>/dev/null
end script
Вот как это работает:
mkfifo / tmp / myservice-log-fifo
просто создает специальный файл fifo
(он же именованный канал). Для получения дополнительной информации введите man 7 fifo
. (logger ... tmp / myservice-log-fifo &)
запускает чтение регистратора из fifo в фоновом режиме. Крестики заставляют процесс логгера быть измененным на init, а не оставаться дочерним по отношению к текущему процессу оболочки. exec> / tmp / myservice-log-fifo
перенаправляет стандартный вывод текущей оболочки на fifo. Теперь у нас есть открытый файловый дескриптор для этого fifo, и нам больше не нужна запись файловой системы ... rm / tmp / myservice-log-fifo
, поэтому мы удалим его. ] exec myservice 2> / dev / null
просто запускает службу обычным способом. Stdout уже переходит на fifo, и это не изменится при запуске новой программы. ОБНОВЛЕНИЕ:
Если вы используете консольный вывод ,
, а затем направьте вывод вашего скрипта в регистратор
(командный интерфейс оболочки к модулю системного журнала syslog (3)), тогда это будет работать.
Например,
console output
exec /my/script | logger
будет войдите в / var / log / messages
Например,
console output
exec /my/script | logger -t my-script
войдет в / var / log / messages
и пометит каждое сообщение регистратором my-script
- -help
для параметров использования регистратора.
(Я использую AMI Amazon Linux, основанный на Centos 5.x; YMMV)
Для последних версий Ubuntu (12.04+) просто используйте
console log
И вывод демона (STDOUT & STDERR) будет добавлен в / var / log / upstart /
Мне не удалось заставить трюк mkfifo
нормально работать; похоже, что он не захватывает stderr, и попытки перенаправления вызвали отказ Upstart без ошибок.
Он также имеет неприятный побочный эффект, заключающийся в том, что процесс logger
остается дочерним по отношению к init
, поэтому информация о том, кто «владеет» регистратором, теряется, и любой, кто еще не знаком с mkfifo
, может подумать, что это зависший процесс, который можно убить.
Вместо этого я закончил со следующим решением, которое решает все эти проблемы. Это заставляет регистратор
становиться дочерним процессом, сохраняя службу как корневой процесс. К сожалению, для этого требуется exec bash
, но он просто выглядит грязно.
script
# ... setup commands here, e.g. environment, cd, ...
exec bash <<EOT
exec 1> >(logger -t myservice) 2>&1
exec myservice
EOT
end script
Здесь используется трюк, который перенаправляет stdout и stderr на команду. Поскольку мы выполняем службу внутри команды bash
, это имеет побочный эффект замены оболочки и волшебным образом превращает bash в дочерний процесс службы,как показано в ps aufxw
:
myservice
\_ bash -c exec 1> >(logger -t myservice) 2>&1 && exec myservice
\_ logger -t myservice
По какой-то причине указанная выше команда должна быть заключена в bash -c
. Я предполагаю, это потому, что Upstart только делает вид, что запускает ваш скрипт через Bash, но на самом деле это не так. Если бы кто-нибудь мог предложить способ избежать лишней оболочки bash, это было бы здорово.
Другой альтернативой является использование tee, например:
exec $SERVER 2>&1 | tee /dev/stderr | logger -t myservice
, чтобы получить оба файла выскочки,и вывод системного журнала