Вход вывода демона с выскочкой

Моим текущим фаворитом является Zabbix. Существует также Nagios и возможно немногие другие. Но если бы это - всего один сервис, я, вероятно, записал бы сценарий жемчуга для контроля его и журнал к sqlite.

34
задан 18 February 2010 в 01:25
7 ответов

Это является ужасным, но до сих пор лучшим, я нашел

должностное лицо/path/to/server>> /tmp/upstart.log 2> &1

6
ответ дан 28 November 2019 в 19:52

Можно также перенаправить вывод к системному журналу, например.

exec $SERVER 2>&1 | logger -t myservice -p local0.info

Однако конвейер может заставить выскочку путать PID процесса входа с PID демона.

3
ответ дан 28 November 2019 в 19:52

Этот фрагмент будет передавать вывод вашей службы по конвейеру. в регистратор, при этом позволяя выполнять сервисный процесс (таким образом заменяя процесс оболочки) чтобы выскочка не запуталась. Это также делает убедитесь, что процесс регистратора переименован в 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

Вот как это работает:

  1. mkfifo / tmp / myservice-log-fifo просто создает специальный файл fifo (он же именованный канал). Для получения дополнительной информации введите man 7 fifo .
  2. (logger ... запускает чтение регистратора из fifo в фоновом режиме. Крестики заставляют процесс логгера быть измененным на init, а не оставаться дочерним по отношению к текущему процессу оболочки.
  3. exec> / tmp / myservice-log-fifo перенаправляет стандартный вывод текущей оболочки на fifo. Теперь у нас есть открытый файловый дескриптор для этого fifo, и нам больше не нужна запись файловой системы ...
  4. rm / tmp / myservice-log-fifo , поэтому мы удалим его.
  5. ] exec myservice 2> / dev / null просто запускает службу обычным способом. Stdout уже переходит на fifo, и это не изменится при запуске новой программы.

ОБНОВЛЕНИЕ:

35
ответ дан 28 November 2019 в 19:52

Если вы используете консольный вывод , , а затем направьте вывод вашего скрипта в регистратор (командный интерфейс оболочки к модулю системного журнала 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)

11
ответ дан 28 November 2019 в 19:52

Для последних версий Ubuntu (12.04+) просто используйте

console log

И вывод демона (STDOUT & STDERR) будет добавлен в / var / log / upstart / .log

http://upstart.ubuntu.com/cookbook/#console-log

31
ответ дан 28 November 2019 в 19:52

Мне не удалось заставить трюк 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, это было бы здорово.

10
ответ дан 28 November 2019 в 19:52

Другой альтернативой является использование tee, например:

exec $SERVER 2>&1 | tee /dev/stderr | logger -t myservice

, чтобы получить оба файла выскочки,и вывод системного журнала

1
ответ дан 28 November 2019 в 19:52

Теги

Похожие вопросы