Услуги Systemd остаются неактивными из-за code=exited, status=1/FAILURE

Я создал сервис на Ubuntu 16.04 для запущения приложения C++ после каждой начальной загрузки. Выполнение приложения C++ среди других проверяет с помощью ping-запросов измерения, и вот почему я должен запустить его после того, как сеть произошла и иметь cap_net_raw=ep. Сервисный файл единицы я создал и сохранил его под/etc/systemd/system/, следует (app.service):

[Unit]
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
Restart=always
ExecStart=/home/app/script.sh

[Install]
WantedBy=default.target

script.sh содержит следующее:

#!/bin/bash
sudo setcap cap_net_raw=ep /home/app/C++_APP  
cd /home/app
gnome-terminal -e "./C++_APP"

Я также дал следующие команды:

   chmod +x /home/app/script.sh    
   chmod 664 /etc/systemd/system/app.service
   systemctl daemon-reload
   systemctl enable app.service

Однако, когда я перезагружаю OS, приложение C++ не запущено и когда я даю:

systemctl status app.service

Я получаю следующее сообщение:

app.service    Loaded: loaded (/etc/systemd/system/app.service; enabled; vendor preset: enabled)    Active: inactive (dead) (Result: exit-code) since Mon 2017-04-03 16:14:21 EEST; 2min 24s ago   Process: 2937 ExecStart=/home/user/script.sh (code=exited, status=1/FAILURE)

Когда я запускаю скрипт вручную, он хорошо работает. У кого-либо есть какая-либо идея того, что я сделал неправильно?

0
задан 3 April 2017 в 08:28

2 ответа

systemd не является подходящим инструментом для запуска настольных приложений, таких как gnome-terminal на переднем плане. Ваша конфигурация systemd будет запускать приложение как root, что, я полагаю, вы намереваетесь. Он не будет знать, что не сможет запустить приложение в сеансе переднего плана конкретного пользователя.

Обновите ваш скрипт, чтобы он не использовал gnome-terminal, просто сделайте приложение исполняемым и запустите его напрямую.

Для отладки вы можете записать его в STDOUT или STDERR и использовать journalctl -u app.service для просмотра журналов. Просмотр соседних строк в полном выводе journalctl также может быть полезен.

Также смотрите этот пост о запуске приложений через CLI против systemd:

0
ответ дан 3 November 2019 в 12:43

добавьте эту строку в свой служебный файл:

[Service]
User=root

Это сработало для меня!

0
ответ дан 4 February 2021 в 19:28

Другие вопросы по тегам:

Похожие вопросы: