Ну, у меня есть служба, настроенная с systemctl. Это файл конфигурации:
[Unit]
Description=The description of the service (:
After=network.target
[Service]
ExecStartPre=/bin/echo 'Starting Service' >> /var/log/node/myapp.log
ExecStart=/root/.nvm/versions/node/v5.0.0/bin/node ./bin/www
ExecStopPost=/bin/echo 'Stopping Service' >> /var/log/node/myapp.log
Restart=always
#StandardOutput=/var/log/node/myapp.log
#StandardError=/var/log/node/myapp.log
SyslogIdentifier=myapp
Environment=NODE_ENV=production
WorkingDirectory=/home/user/node-apps/theapp
[Install]
WantedBy=multi-user.target
Что мне нужно?:
1) ExecStartPre
и ExecStopPost
мог написать сообщение 'starting service'
или 'stopping service'
в файл /var/log/node/myapp.log
. С приведенной выше конфигурацией не работает, выводится только 'Starting Service' >> /var/log/node/myapp.log
и 'Stopping Service' >> /var/log/node/myapp.log
к journalctl
. (Я проверил с journalctl -u myapp
)
2) Мне нужно, чтобы вместо всех журналов приложения выходы в journalctl
, может выводить в файл. Пример: /var/log/node/myapp.log
. То есть, если в моем приложении есть console.log()
, это могло быть там.
С участием выскочка, Я могу сделать это так:
script
exec start-stop-daemon --start --make-pidfile --pidfile /var/run/upstart-yourapp.pid --chdir /var/www/yourapp/--chuid user:usergroup --exec /usr/bin/node index.js >> /var/log/yourapp.upstart.log 2>&1
end script
pre-start script
# Date format same as (new Date()).toISOString() for consistency
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/yourapp.upstart.log
end script
post-stop script
rm /var/run/upstart-ghost.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/yourapp.upstart.log
end script
Но это можно сделать с помощью systemctl?
Я столкнулся с подобной проблемой. Как объяснено Вот, оказывается, вы не можете перенаправить вывод непосредственно в ExecStartPre
, ExecStart
, или ExecStopPost
команды - systemd интерпретирует >
или >>
как аргументы. Решение состоит в том, чтобы выполнить вашу команду, используя sh -c
.
Есть еще одна проблема, с которой я столкнулся при попытке использовать date
команда в моем сценарии systemd: %m
- это специальный код, относящийся к идентификатору машины текущего хоста. Итак, чтобы он выводил месяц, вам нужно избежать знака процента, используя два знака процента (%%
). Собирая все вместе, systemd-версия вышеупомянутых пре и пост-скриптов:
# Date format same as (new Date()).toISOString() for consistency
ExecStartPre = /bin/sh -c 'echo "[`date -u +%Y-%%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/yourapp.upstart.log'
ExecStopPost = /bin/sh -c 'rm /var/run/upstart-ghost.pid; echo "[`date -u +%Y-%%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/yourapp.upstart.log'