我需要在启动时以 root 权限运行 Qt 应用程序,下面是我使用 systemctl 创建的名为QtApp.service
[Unit]
Description=QtApp
[Service]
ExecStart= exec su -l user -c 'export DISPLAY=:0; /QtInst/QtApp'
Restart=always
[Install]
WantedBy=multi-user.target
但是当我运行命令启动服务时sudo systemctl start QtApp.service
出现以下错误
Failed to start QtApp.service: Unit QtApp.service is not loaded properly: Invalid argument.
以下是错误的详细信息
systemctl status QtApp.service
● QtApp.service - QtApp
Loaded: error (Reason: Invalid argument)
Active: inactive (dead)
Jul 06 15:23:54 user-pc systemd[1]: [/etc/systemd/system/QtApp.service:5] Executable path is not absolute, ignoring: exec su -l user -c 'export DISPLAY=:0; /QtInst/QtApp'
Jul 06 15:23:54 user-pc systemd[1]: QtApp.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Jul 06 15:26:08 user-pc systemd[1]: [/etc/systemd/system/QtApp.service:5] Executable path is not absolute, ignoring: exec su -l user -c 'export DISPLAY=:0; /QtInst/QtApp'
Jul 06 15:26:08 user-pc systemd[1]: QtApp.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
答案1
Executable path is not absolute
- 它的意思是exec
。
通常exec
在这里没有意义。它是一个 shell 内置命令,用给定的命令替换 shell。没有exec
可执行文件的绝对路径,因为没有可执行文件。
su
是可执行文件。该行可能
ExecStart=/bin/su -l user -c 'export DISPLAY=:0; /QtInst/QtApp'
但在 systemd 服务中使用su
可能不是一个好主意。请参阅:如何让我的 systemd 服务通过特定用户运行并在启动时启动?
答案2
通常,这里的“无效参数”是单元定义文件本身。要调试它,您可以使用:
sudo systemd-analyze verify QtApp.service
或者对于用户的本地服务:
sudo systemd-analyze --user verify QtApp.service
答案3
错误说
Executable path is not absolute, ignoring: exec su -l user -c 'export DISPLAY=:0; /QtInst/QtApp'
尝试使用绝对路径(例如在/usr/本地/QtInst/QtApp) 代替/QtInst/QtApp。
这可能是相关的。