systemd не запускает приложение из bash-скрипта

#linux #systemd

#linux #systemd

Вопрос:

У меня есть служба, которая должна запускать набор приложений в фоновом режиме в моей встроенной системе Linux Yocto. Мне не нравится идея создания сценария запуска systemd для каждого приложения, поэтому я просто запускаю их из сценария bash следующим образом:

Служба:

startup.service

 [Unit]
Description=applications startup script
After=network.target

[Service]
Type=simple
ExecStart=/opt/somedir/startup.sh

[Install]
WantedBy=multi-user.target
 

и сценарий

startup.sh

 #!/bin/bash

echo "application startup script"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/somedir
/opt/somedir/app1 amp;
/opt/somedir/app2 amp;
/opt/somedir/app3 amp;
 

Но приложение не запустилось. Проверка состояния службы дает мне:

 systemctl status startup

● startup.service - applications startup script
   Loaded: loaded (/lib/systemd/system/startup.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Thu 2021-03-25 10:33:16 UTC; 18min ago
  Process: 428 ExecStart=/opt/somedir/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 428 (code=exited, status=0/SUCCESS)

Mar 25 10:33:16 systemd[1]: Started application startup script.
Mar 25 10:33:16 startup.sh[428]: application startup script
Mar 25 10:33:16 systemd[1]: startup.service: Succeeded.
 

Таким образом, служба выполняется при запуске системы и выполняет сценарий. Если я выполняю скрипт из командной строки, он запускает приложения, как и ожидалось. Так в чем причина, по которой приложение не запускается?

Комментарии:

1. Исследуйте Type=simple , что он делает, и чем он отличается от других Type= .

Ответ №1:

Systemd нужно будет знать, как запустить скрипт. Поэтому либо добавьте:

 #!/bin/bash
 

в верхнюю строку startup.sh сценарий или измените строку ExecStart в служебном файле systemd на:

 ExecStart=/bin/bash -c /opt/somedir/startup.sh
 

Кроме того, чтобы гарантировать, что созданные процессы остаются постоянными после их создания, измените:

 Type=forking
 

Комментарии:

1. Извините, у меня есть эта строка в моем скрипте, просто потерял ее при копировании. Я обновил свой вопрос.

2. Попробуйте второй метод

3. Да, уже пробовал это, тот же результат. systemctl status startup показывает эхо-вывод, статус успешный, но после запуска службы приложения не запускаются, и сообщений об ошибках / предупреждениях нет.

4. Измените тип службы на разветвление. Я добавил к решению

5. Бинго! Это работает! Спасибо @Raman Sailopal, вы были очень полезны.

Ответ №2:

systemd запускает скрипт startup.sh , и после завершения этого процесса предполагается, что все сделано, поэтому он отключает все оставшиеся процессы, и модуль завершается. Самое простое решение — добавить a wait в конце startup.sh , чтобы оно возвращалось только тогда, когда все фоновые процессы завершились.