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 ответа2

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. Так как вы запустите его вручную, он никогда не имеет каких - либо других устройств в зависимости от него, поэтому он будет немедленно остановлен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .