我在 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
这对我有用!