在之前的一篇文章中,介绍了在ubuntu中基于.desktop文件实现程序开机自启动的方法
Ubuntu设置程序开机自启动:基于.desktop文件实现
但是上面这种方法只适合不需要root权限的程序自启动
在有的情况下,我们的程序需要以root身份来运行才能保证有足够的权限进行操作。这时候可以通过.service文件实现。但是这种方式也有一个缺点:就是如果程序带有GUI图形界面,启用该service服务时会失败。即这种方式虽然能满足以root身份自启动,但是却不能满足带GUI的程序以root身份自启动。(比如QT中的QCoreApplication可以使用该方式,QApplication不行)
一、操作步骤
1、创建一个systemd服务文件
bash
touch myapp.service
在文件中添加以下内容
bash
[Unit]
Description=My Program Service #Description:服务的简短描述
After=network.target #After:指定该服务需要在 network.target 启动后启动,通常适用于需要网络连接的程序
[Service]
ExecStart=/home/qing222/code/test_delete/build-untitled-unknown-Debug/untitled #ExecStart:指定要运行的程序路径
User=root #指定该服务以 root 用户身份运行
Group=root #指定该服务使用 root 组
Restart=always #如果服务崩溃或退出,会自动重启该服务
[Install]
WantedBy=multi-user.target #表示该服务将在系统启动进入多用户模式时自动启动
2、将systemd服务文件放在~/.config/systemd/user/目录下
这个目录用于用户级的服务文件,只会影响当前用户,而不会影响系统中的其他用户。如果希望服务对所有用户生效,可以放在/etc/systemd/system/目录下
3、重新加载 systemd 配置
bash
sudo systemctl daemon-reload
4、启用服务(开机启动)
注意这里可能需要用到绝对路径,否则会被报找不到该service文件的错误
bash
sudo systemctl enable ~/.config/systemd/user/myapp.service
使用 systemctl enable <service> 命令可以将服务设置为开机自启。此命令会创建一个符号链接,将服务单元文件链接到 /etc/systemd/system/multi-user.target.wants/ 目录中。
5、启动服务
bash
sudo systemctl start myapp.service
6、查看服务状态
可以通过查看服务状态判断是否正常运行
bash
sudo systemctl status myapp.service
bash
qing222@qing222-virtual-machine:~/Desktop$ sudo systemctl status myapp.service
● myapp.service - My Program Service
Loaded: loaded (/etc/systemd/system/myapp.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2025-11-05 01:36:44 CST; 3s ago
Main PID: 2291 (untitled)
Tasks: 1 (limit: 2213)
Memory: 9.4M
CPU: 34ms
CGroup: /system.slice/myapp.service
└─2291 /home/qing222/code/test_delete/build-untitled-unknown-Debug/untitled
11月 05 01:36:44 qing222-virtual-machine systemd[1]: Started My Program Service.
11月 05 01:36:45 qing222-virtual-machine untitled[2291]: aaa
7、禁用服务(禁止开机启动)
bash
sudo systemctl disable ~/.config/systemd/user/myapp.service
测试结果:
在sudo systemctl enable ~/.config/systemd/user/myapp.service使程序开机自启动后,重启系统,通过sudo systemctl status myapp.service查看服务状态

可以看到服务在运行了。通过ps aux 可以看到程序是在以root的身份运行。
