Я использую CentOS 7. Как мне выяснить, почему служба не запускается? Я создал этот сервис
[rails@server ~]$ sudo cat /usr/lib/systemd/system/nodejs.service
[Unit]
Description=nodejs server
[Service]
User=rails
Group=rails
ExecStart=/home/rails/NodeJSserver/start.sh
ExecStop=/home/rails/NodeJSserver/stop.sh
[Install]
WantedBy=multi-user.target
Файл указывает на это
[rails@server ~]$ cat /home/rails/NodeJSserver/start.sh
#!/bin/bash
forever start /home/rails/NodeJSserver/server.js
Я могу запустить этот файл сам по себе. Но когда я пытаюсь запустить его как часть службы, я замечаю, что мой сервер nodeJS не запущен. Даже когда я проверяю "sudo systemctl --state = fail", я не вижу никаких ошибок ...
[rails@server ~]$ sudo systemctl enable NodeJSserver
[rails@server ~]$ sudo systemctl start NodeJSserver
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ forever list
info: No forever processes running
[rails@server ~]$
[rails@server ~]$
[rails@server ~]$ sudo systemctl --state=failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● nginx.service loaded failed failed The nginx HTTP and reverse proxy server
● systemd-sysctl.service loaded failed failed Apply Kernel Variables
● systemd-vconsole-setup.service loaded failed failed Setup Virtual Console
LOAD = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB = The low-level unit activation state, values depend on unit type.
3 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Как выяснить, почему мой сервис не запустился?
journalctl -u nodejs
должен дать вам более значимое сообщение об ошибке.Ответы:
Ваш сервис не
Type=
указан в[Service]
разделе, поэтомуsystemd
предполагается, что вы имели в видуType=simple
.Это означает,
systemd
что ожидаемый процессExecStart=
будет продолжать работать до тех пор, пока служба работает. Но похоже, что выstart.sh
только запускаете одну команду и затем выходите. То есть команда : запускает целевую команду как демон, или другими словами, в фоновом режиме. Как только команда завершится, запущенная оболочка завершится.forever
forever start
forever start
start.sh
В этот момент
systemd
считается, что эта служба не работает. Но подождите, контрольная группа, назначенная для этой службы, все еще содержит запущенный процесс. «Итак, - думаетsystemd
, - он не только потерпел неудачу, но и оставил после себя беспорядок. Не может этого иметь». Так как нет иKillMode=
неKillSignal=
указано,systemd
продолжает свои значения по умолчанию и отправляет SIGTERM для любых оставшихся процессов в этой контрольной группе, и если они не останавливаются своевременно, следует SIGKILL. После этого ваш фактический процесс NodeJS будет мертв, гарантировано.Как это исправить
Поскольку команда, с которой вы работаете,
ExecStart=
завершится, как только будет запущен реальный сервер, вы не можете использовать значение по умолчаниюType=simple
. Вы должны указать другой тип сервиса.Вы могли бы использовать
Type=forking
. Для этого типаman systemd.service
рекомендуется использоватьPIDFile=
параметр, поэтому, если ваш сервер NodeJS создает файл PID для себя (или вы добавляете параметры вforever
команду, чтобы он создавал его для него), вы должны сообщитьsystemd
, где он будет.Если у
Type=forking
вас не работает, то вы можете указатьType=oneshot
сRemainAfterExit=yes
.Это заставляет
systemd
просто запускатьExecStart=
команду при запуске службы иExecStop=
при ее остановке, и не заботиться ни о чем другом.systemd
все равно будет помнить, был ли последний раз установлен сервис в остановленном или запущенном состоянии. Таким образом, если вы установите другую службу в зависимости от этой службы, а затем остановите службу NodeJS вручную, другая служба не остановится автоматически и, несомненно, вернет ошибки, когда не сможет использовать вашу службу NodeJS.Третий вариант -
forever
полностью пропустить команду и позволитьsystemd
перезапустить процесс NodeJS. В этом случае весь вашnodejs.service
блок будет:Вы можете добавить другие варианты.
Например, вы можете
RestartSec=5
указать 5-секундный спящий режим перед попыткой перезапустить службу, если она неожиданно умирает, чтобы избежать перегрузки системных ресурсов частыми попытками перезапуска, если ваша служба продолжает умирать сразу после перезапуска по какой-либо причине. (Значение по умолчаниюRestartSec=
составляет 100 мс.)Или, если вы хотите, чтобы служба была перезапущена, если она возвращает какие-то определенные значения состояния выхода, но считает, что это не удалось на других, есть варианты для этого тоже.
источник
Restart=always
в мой файл конфигурации .service.