Я использую сценарий инициализации для запуска простого процесса, который начинается с:
start-stop-daemon --start --quiet --chuid $DAEMONUSER \
--make-pidfile --pidfile $PIDFILE --background \
--exec $DAEMON $DAEMON_ARGS
Процесс с именем $ DAEMON обычно выводит информацию журнала на свой стандартный вывод. Насколько я могу судить, эти данные нигде не хранятся.
Я хотел бы записать или добавить stdout $ DAEMON где-нибудь в файл.
Единственное известное мне решение - это указать start-stop-daemon вызвать shellscript вместо $ DAEMON напрямую; затем сценарий вызывает $ DAEMON и записывает в файл журнала. Но для этого требуется дополнительный скрипт, который, как и изменение самого демона, кажется неправильным способом решения такой типичной задачи.
источник
--start
на--stop
действительно работает.start-stop-daemon --test (...)
выглядело сопровождение ?>>
вместо>
добавления.Вам необходимо сделать:
Также, если вы используете
--chuid
или--user
, убедитесь, что пользователь может писать/var/log
в существующий/var/log/some.log
. Лучше всего, чтобы у этого пользователя был/var/log/subdir/
хотя.источник
bashPID=$(cat $PIDFILE); [ -n "$bashPID" ] && pkill -P "$bashPID"
pkill
решение тоже. Интересно, что бы... -c "exec $DAEMON..."
(добавление "exec") сделать. У меня нет этого сейчас на тарелке, поэтому не могу попробовать.Кажется, теперь вы сможете использовать этот
--no-close
параметр при запускеstart-stop-daemon
захвата вывода демона. Эта новая функция доступна вdpkg
пакете, начиная с версии 1.16.5 в Debian:источник
start-stop-daemon
. Однако версия openrc имеет параметры-1
и-2
для перенаправления stdout и stderr соответственно.С openrc (который используется по умолчанию, например, в gentoo или alpine linux)
start-stop-daemon
есть параметры-1
и-2
:Так что вы можете просто написать:
источник
Захватить вывод демона и сохранить его в файл несложно:
Однако это решение может быть неоптимальным для
logrotate
.Возможно, лучше записать вывод в системный журнал. В Debian это соответствует поведению сервисов systemd. Следующая прямая попытка переписать приведенный выше пример неверна, потому что она оставляет после себя два родительских («зомби») процесса (регистратор и демон) после остановки демона, поскольку
start-stop-daemon
завершает работу только его дочернего элемента, но не всех потомков:Чтобы он работал, нам нужна оболочка, которая завершает свои дочерние элементы при получении
дуэнде :SIGTERM
отstart-stop-daemon
. Вот такие:Примечание:
uid=65534
является пользователемnobody
.Плюсы : работает и относительно просто.
демон :Минусы : 4 процесса (супервизор
duende
, его вилка с удаленными привилегиями (регистратор)su
и сам демон); обязательный--chroot
; Если демон сразу завершает свою работу (например, неверная команда),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
сообщите, что он запущен успешно.Преимущества : 3 процессы (супервизор
daemon
,su
и демон сам по себе).Минусы : сложно управлять
$PIDFILE
из-за запутанных параметров командной строки демона ; Если демон сразу завершает свою работу (например, неверная команда),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
сообщите, что он запущен успешно.pipexec ( победитель ):
Преимущества : 3 процессов (руководитель
pipexec
,logger
и демон сам по себе); Если демон немедленно завершает работу (например, неверная команда),status_of_proc -p $PIDFILE "$DAEMON" "$NAME"
правильно сообщите об ошибке.Минусы : нет.
Это победитель - самое простое и удобное решение, которое, кажется, работает хорошо.
источник
Обычно
start-stop-daemon
закрывает стандартные файловые дескрипторы при работе в фоновом режиме. На странице руководстваstart-stop-daemon
:Это сработало для меня:
источник
Цитата из старого списка рассылки:
https://lists.ubuntu.com/archives/ubuntu-uk/2005-June/000037.html
источник
Я не уверен, что "$ DAEMON $ DAEMON_ARGS> /var/log/some.log 2> & 1" когда-либо закроет файловый дескриптор для файла журнала ... что означает, что если ваш демон будет работать вечно, я не уверен этот logrotate или другие механизмы для очистки дискового пространства будут работать. Поскольку это> вместо >>, предлагаемая команда также будет обрезать существующие журналы при перезапуске. Если вы хотите узнать, почему демон разбился и автоматически перезапустился, это может быть не очень полезно.
Другой вариант - «$ DAEMON | logger». logger - это команда, которая будет записывать в системный журнал (/ var / log / messages). Если вам тоже нужен stderr, я думаю, вы можете использовать "$ DAEMON 1> & 2 | logger"
источник
>>
обычно более подходит для демонов, хотя это подразумевает, что теперь вы должны создать правило logrotate!--no-close ... | logger
у меня не работает (Debian 7.3, start-stop-daemon 1.16.12). Скрипт start-stop-daemon не возвращается, хотя / var / log / messages заполнен :-). Пробовал с и без1>&2
.Предполагая, что это bash (хотя некоторые другие оболочки также могут это допускать), строка:
отправит весь будущий стандартный вывод в этот файл. Это потому, что
exec
без имени программы просто происходит некоторая магия перенаправления. Наbash
странице руководства :Разумеется, управление указанным файлом - это еще одна проблема.
источник
start-stop-daemon
строки, упомянутой в первоначальном вопросе?Как насчет:
источник