Я создал сервис на 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)
Когда я запускаю скрипт вручную, он хорошо работает. У кого-либо есть какая-либо идея того, что я сделал неправильно?
systemd
не является подходящим инструментом для запуска настольных приложений, таких как gnome-terminal
на переднем плане. Ваша конфигурация systemd
будет запускать приложение как root
, что, я полагаю, вы намереваетесь. Он не будет знать, что не сможет запустить приложение в сеансе переднего плана конкретного пользователя.
Обновите ваш скрипт, чтобы он не использовал gnome-terminal
, просто сделайте приложение исполняемым и запустите его напрямую.
Для отладки вы можете записать его в STDOUT или STDERR и использовать journalctl -u app.service
для просмотра журналов. Просмотр соседних строк в полном выводе journalctl
также может быть полезен.
Также смотрите этот пост о запуске приложений через CLI против systemd:
добавьте эту строку в свой служебный файл:
[Service]
User=root
Это сработало для меня!