Почему процесс systemd останавливается, как только он запускается для процесса первичного сервера?


2

Я пытаюсь экспортировать простое приложение на Ruby с помощью мастера. На основании его использование для systemd я, кажется, все делаю правильно.

Однако, когда я запускаю цель / сервис, я получаю сообщения о статусе в соответствии с этим:

systemd[1]: Starting app-web-1.service...
systemd[1]: Started app-web-1.service.
systemd[1]: Service app-web-1.service is not needed anymore. Stopping.
systemd[1]: Stopping app-web-1.service...
systemd[1]: Stopped app-web-1.service.

Процесс начинается, потом заканчивается. Я понятия не имею, почему это происходит.

Конечно, я не эксперт в systemd. Я впервые работаю со служебными сценариями, поэтому я не уверен, что в сгенерированных файлах есть что-то, что вызывает это.

При экспорте через мастера создается несколько целевых и служебных файлов. Таким образом, есть несколько, с которыми мне приходится иметь дело.

Вот содержимое app.target:

[Unit]
StopWhenUnneeded=true
Wants=app-web.target

[Install]
WantedBy=multi-user.target

И содержимое app-web-1.target:

[Unit]
StopWhenUnneeded=true
Wants=app-web-1.service

Наконец, app-web-1.service:

[Unit]
StopWhenUnneeded=true

[Service]
User=deployer
WorkingDirectory=/home/deployer/app/releases/20141202043054
Environment=PORT=5000
ExecStart=/bin/bash -lc 'bundle exec puma -p 5000 '
Restart=always
StandardInput=null
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=%n
KillMode=process

Очевидно, что StopWhenUnneeded является частью проблемы, но я не уверен, что это должно делать в контексте запуска веб-сервера в моем приложении.

Может кто-нибудь помочь мне понять, как заставить сервер работать и постоянно?

Ответы:


2

Хотя гравитация очень помогла выяснить, в чем проблема, я наконец решил, выполнив простую, но упущенную команду:

sudo systemctl enable app.target

Это было это. Просто включите цель, и сервис будет работать как шарм.

CoreOS документы помог мне понять это.


0

Как в справочные страницы , StopWhenUnneeded=true означает «остановить этот юнит, как только другие активные юниты больше не зависят от него».

Например, если вы начнете app.target, это зависит от app-web-1.target который также будет запущен, и также зависит от app-web-1.service,

Но если ты стоп главный app.target позже, как правило, это никак не повлияет на другие две единицы - они не имеют никаких зависимостей в «обратном» направлении, поэтому оба app-web-1.target а также app-web-1.service будет продолжать работать

Другими словами, наиболее вероятное намерение состояло в том, чтобы позволить человеку остановить все, используя только systemctl stop app.targetбез необходимости останавливать каждый сервис вручную. Это бы сработало если настройка была только в файлах "sub" -unit (хотя она не идеальна - в этом случае лучше BindsTo =).

Так что проблема с StopWhenUnneeded= в основном блоке app.target. Поскольку вы запускаете его вручную, он никогда не любой другие единицы в зависимости от этого, поэтому он будет немедленно остановлен.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.