У вашего сервиса нет Type=
, указанного в разделе [Service]
, поэтому systemd
предполагает, что вы имели в виду Type=simple
.
Это означает, что systemd
будет ожидать, что процесс, запущенный с помощью ExecStart=
, будет продолжать работать, пока работает служба. Но похоже, что ваш start.sh
запускает только одну команду, а затем завершает работу. То есть команда forever
:forever start
запускает целевую команду как демон или, другими словами, в фоновом режиме. Как только команда forever start
завершится, оболочка, выполняющая start.sh
, завершит работу.
В этот момент systemd
считает эту службу неисправной. Но подождите, в группе управления, назначенной для этой службы, все еще есть запущенный процесс. «Значит, — думает systemd
, — не только не получилось, но еще и бардак после себя оставил. Не может быть такого». Поскольку KillMode=
и KillSignal=
не указаны, systemd
продолжает работать со своими значениями по умолчанию и отправляет SIGTERM для всех оставшихся процессов в этой группе управления, и если они не останавливаются своевременно, СИГКИЛЛ. После этого ваш фактический процесс NodeJS будет гарантированно мертв.
Поскольку команда, которую вы запускаете с ExecStart=
, завершится, как только будет запущен фактический сервер, вы не можете использовать Type=simple
по умолчанию. Необходимо указать другой тип службы.
Вы можете использовать Type=forking
. С этим типом man systemd.service
рекомендует использовать параметр PIDFile=
, поэтому, если ваш сервер NodeJS создает файл PID для себя (или вы добавляете параметры в команду forever
, чтобы он создал для него файл ), вы должны сообщить systemd
, где она будет.
[Service]
Type=forking
PIDFile=/absolute/path/to/nodejs.pid
User=rails
...
Если Type=forking
у вас не работает, вы можете указать Type=oneshot
с помощью RemainAfterExit=yes
.
Это означает, что systemd
просто запускает команду ExecStart=
при запуске службы и ExecStop=
при ее остановке и не заботится ни о чем другом.
Однако
systemd
по-прежнему помнит, была ли служба в последний раз установлена в остановленном или запущенном состоянии. Поэтому, если вы установите другую службу в зависимость от этой службы,а затем остановите службу NodeJS вручную, другая служба не остановится автоматически и, несомненно, вернет ошибки, если не сможет использовать вашу службу NodeJS.
Третий вариант — полностью пропустить команду forever
и позволить systemd
перезапустить процесс NodeJS. В этом случае вся ваша единица nodejs.service
будет:
[Unit]
Description=nodejs server
[Service]
User=rails
Group=rails
ExecStart=/home/rails/NodeJSserver/server.js
Restart=always
[Install]
WantedBy=multi-user.target
Вы можете добавить другие параметры.
Например, вы можете указать RestartSec=5
, чтобы указать 5 -секунд ожидания перед попыткой перезапустить службу, если она неожиданно умирает, чтобы избежать перегрузки системных ресурсов частыми попытками перезапуска, если ваша служба продолжает умирать сразу после перезапуска. по какой-то причине. (Значение по умолчанию RestartSec=
равно 100 мс.)
Или, если вы хотите, чтобы служба была перезапущена, если она возвращает некоторые определенные значения состояния выхода, но считает, что она не удалась на других, для этого тоже есть варианты.
Попробуйте заменить репозиторий yum на тот, который описан здесь:
https://nvidia.github.io/libnvidia-container/centos7/libnvidia-container.repo