通过systemd去启动一个qt程序

我们先用cmake编译好一个qt程序

先测试一下能不能运行 ./test,成功运行

先在/usr/lib/systemd/system下创建一个env_test.service文件,内容如下

[Unit]
Description=env_test service

[Service]
Type=oneshot
ExecStart=/home/he/systemd_test/test.sh

[Install]
WantedBy=multi-user.target

其中test.sh内容如下

#!/bin/bash
env  >> /home/he/systemd_test/test.log
/home/he/hql/hql_test/code/build/test             #启动qt程序

接着试着启动env_test.service

systemctl daemon-reload 
systemctl restart env_test.service

systemctl daemon-reload该命令将会删除先前的单元生成器所创建的所有单元文件与软连接,然后重新运行所有生成器来重新创建单元文件与软连接,最后再让systemd 重新加载所有的单元文件,建议每次更改.service后都来一下;systemctl restart env_test.service 重启服务

然后我们就会发现,诶报错了。通过systemctl status env_test.service查看,原因就在于并没有该程序能够执行的环境

× env_test.service - env_test service Loaded: loaded (/usr/lib/systemd/system/env_test.service; enabled; preset: disabled) Active: failed (Result: exit-code) since Wed 2024-01-24 15:58:45 CST; 4min 19s ago Process: 10323 ExecStart=/home/he/systemd_test/test.sh (code=exited, status=134) Main PID: 10323 (code=exited, status=134) CPU: 34ms 
1月 24 15:58:45 manjaro systemd[1]: Starting env_test service... 
1月 24 15:58:45 manjaro test.sh[10326]: Authorization required, but no authorization protocol specified 
1月 24 15:58:45 manjaro test[10326]: qt.qpa.xcb: could not connect to display :0 
1月 24 15:58:45 manjaro test[10326]: qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. 
1月 24 15:58:45 manjaro test[10326]: This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may f> Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, wayland-egl, wayland, wayland-xco> 
1月 24 15:58:45 manjaro test.sh[10323]: /home/he/systemd_test/test.sh: 第 3 行:10326 已放弃 (核心已转储)/home/he/> 
1月 24 15:58:45 manjaro systemd[1]: env_test.service: Main process exited, code=exited, status=134/n/a 
1月 24 15:58:45 manjaro systemd[1]: env_test.service: Failed with result 'exit-code'. 
1月 24 15:58:45 manjaro systemd[1]: Failed to start env_test service.

一个简单粗暴的方法就是将当前终端的环境变量全部写入.service的环境变量,systemd有一套自己的环境变量,通过查看test.log与当前环境变量对比便可得知。

先修改env_test.service,添加环境变量文件test.env([service]部分第二行),EnvironmentFile指定文件后,该服务会去指定文件读取该服务的环境变量,环境变量格式为KEY=VALUE

[Unit]
Description=env_test service

[Service]
Type=oneshot
EnvironmentFile=/home/he/systemd_test/test.env
ExecStart=/home/he/systemd_test/test.sh

[Install]
WantedBy=multi-user.target

将当前环境变量写入test.env,再重启服务

env >> /home/heqinglin/systemd_test/test.env 
systemctl daemon-reload 
systemctl restart env_test.service

发现成功运行了该qt程序

这样做有没有意义?常规情况来看,如果要开机自启动一个程序的话,还是建议在/etc/profile.d自建shell脚本等等,开机启动读取时会顺便启动。用systemd开机去启动程序并不太好,原因就是因为systemd有不同的环境变量,且开机自启动某些环境变量可能会改变,博主这样做只是为了加深对systemd的理解

若要开机自启动systemd,则用systemctl enable xxx.service

systemctl enable env_test.service

该举动通过env_test.service里面[Install]部分的WantedBy=multi-user.targetenv_test.service通过链接方式放到/etc/systemd/system/multi-user.target.wants下,也就是说systemctl enable env_test.service相当于

sudo ln -s /usr/lib/systemd/system/env_test.service /etc/systemd/system/multi-user.target.wants/env_test.service

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux 中,可以使用 systemd 来管理和守护一个 shell 脚本的运行。systemdLinux 的新一代系统初始化和服务管理器,可以用来启动、停止、重启和守护一个程序或服务。 下面是一个简单的例子,演示如何使用 systemd 来守护一个 shell 脚本的运行。 1. 创建一个 shell 脚本,比如说叫做 `myscript.sh`,并确保它有可执行权限: ``` #!/bin/bash while true do echo "Hello World" sleep 10 done ``` 这个脚本会无限循环输出 "Hello World",并且在每次输出之后会睡眠 10 秒钟。 2. 创建一个 systemd 服务的配置文件,比如说叫做 `myscript.service`,并将其放置在 `/etc/systemd/system/` 目录下: ``` [Unit] Description=My Script Service After=network.target [Service] ExecStart=/path/to/myscript.sh User=root [Install] WantedBy=multi-user.target ``` 在这个配置文件中,`ExecStart` 指定了要启动的脚本,`User` 指定了要以哪个用户身份运行脚本。其他的配置项可以根据需要进行调整。 3. 启动 systemd 服务: ``` sudo systemctl start myscript.service ``` 这个命令会启动 `myscript.service` 服务,并开始运行 `myscript.sh` 脚本。 4. 检查服务状态: ``` sudo systemctl status myscript.service ``` 这个命令会显示 `myscript.service` 服务的状态。如果一切正常,状态应该为 active (running)。 现在,`myscript.service` 服务会守护 `myscript.sh` 脚本的运行状态。如果 `myscript.sh` 意外停止了,systemd 会自动重启它。这样,你就可以确保 `myscript.sh` 脚本一直在运行,而且不需要手动去检查和启动它。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值