У меня есть пользовательский демон, которым управляет upstart на моем сервере Ubuntu. Он работает отлично, за исключением того, что мне нужно захватить (зарегистрировать) выходные данные демона. На официальной странице разделов сказано, что я могу использовать console logged
для этого, но в какой файл он входит?
Я также читал , что console logged
это больше не является допустимой строфа . В настоящее время я использую 0.3.9 (Hardy), но через несколько месяцев обновлюсь до 0.6.x (Lucid). Если console logged
на самом деле не будет работать с более поздними версиями, что я буду использовать вместо этого?
Ответы:
Этот фрагмент перенаправит вывод вашей службы в регистратор, но при этом позволит вам выполнить процесс службы (таким образом, заменив процесс оболочки), чтобы upstart не запутался. Это также гарантирует, что процесс логгера перезапускается в init, так что он не является дочерним элементом вашего сервиса, и он избегает бесполезного использования файловой системы, даже если ему необходимо временно создать fifo.
Вот как это работает:
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, и это не изменится, когда новая программа будет выполнена.UPDATE:
set -e
не требуется, так как Upstart по умолчанию запускает сценарии с этой опцией (см. Http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh ).источник
set -e
?set -e
приводит к немедленному завершению работы сценария в случае сбоя какой-либо команды. Без этой строки скрипт продолжит бесполезный запуск последующих команд (и, возможно, опасно).exec 2>&1
надrm
строкой и удалите ее2>/dev/null
из последней строки.Для последних версий Ubuntu (12.04+) просто используйте
И вывод демона (STDOUT & STDERR) будет добавлен к
/var/log/upstart/<service>.log
http://upstart.ubuntu.com/cookbook/#console-log
источник
Если вы используете
console output
раздел , а затем перенаправляете выходные данные вашего скрипта вlogger
(командный интерфейс оболочки в модуль системного журнала syslog (3)), это будет работать.Например
войдет в
/var/log/messages
Например
войдет в систему
/var/log/messages
и пометит каждое сообщениеmy-script
logger --help
для вариантов использования регистратора.(Я использую Amazon Linux AMI, который основан на Centos 5.x; YMMV)
источник
logger
, а не на процесс, которым вы действительно хотите управлять.Я не заставил
mkfifo
трюк работать удовлетворительно; казалось, что он не захватывает stderr, и попытки перенаправить вынудили Upstart выполнить без ошибок.У него также есть неприятный побочный эффект, заставляющий
logger
процесс зависать как потомокinit
, поэтому информация о том, кто «владеет» регистратором, теряется, и любой, кто еще не знает об этом,mkfifo
может предположить, что это зависший процесс, который можно убить.Вместо этого я получил следующее решение, которое решает все эти проблемы. Он
logger
становится дочерним процессом, сохраняя службу в качестве корневого процесса. К сожалению, это требует исполненияbash
, но выглядит просто грязно.Это использует трюк, который перенаправляет stdout и stderr в команду. Поскольку мы выполняем службу внутри
bash
команды, это побочный эффект - замена оболочки и магическое превращение bash в дочерний процесс службы, как показаноps aufxw
:По какой-то причине вышеупомянутая команда должна быть заключена в
bash -c
. Я предполагаю, что это потому, что Upstart только делает вид, что запускает ваш скрипт через Bash, но на самом деле это не так. Если кто-нибудь может предложить способ избежать дополнительной оболочки bash, это было бы здорово.источник
exec bash -l << EOF
чтобы без потерь.Это уродливо, но пока лучшее, что я нашел
exec / path / to / server >> /tmp/upstart.log 2> & 1
источник
Вы также можете перенаправить вывод в системный журнал, например
Однако конвейер может привести к тому, что программа upstart перепутает PID процесса регистрации с PID демона.
источник
expect fork
илиexpect daemon
строфа. Илиcat
, я думаю, вы могли бы добавить pid-файл в сообщение журнала.Другой альтернативой является использование тройника, как:
чтобы получить как файл upstart, так и вывод syslog
источник