Systemd 服务因代码=exited、状态=1/FAILURE 而处于非活动状态

Systemd 服务因代码=exited、状态=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

但是当我重新启动操作系统时,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)

当我手动运行脚本时,它运行正常。有人知道我做错了什么吗?

答案1

systemd不是gnome-terminal在前台运行桌面应用程序的正确工具。您的systemd配置将以 的形式运行应用程序root,我猜这是您的意图。它将不知道无法在特定用户的前台会话中运行应用程序。

更新您的脚本以使其不再使用gnome-terminal,而只需使应用程序可执行并直接运行它。

要进行调试,您可以将其记录到 STDOUT 或 STDERR 并使用journalctl -u app.service它查看日志。查看完整journalctl输出中的邻近行也可能有帮助。

另请参阅有关通过 CLI 与 systemd 运行应用程序的相关文章:

答案2

将这一行添加到您的服务文件中:

[Service]
User=root

这对我有用!

相关内容