需求:
systemd开机启动我的带gui的qt程序,当程序被关闭或者崩溃后可以马上重启。
问题:
如果按照正常的正确配置无法启动,发现不带gui的可以成功启动。(qt中main函数中用QApplication的无法启动,QCoreApplication的可以启动)。
环境:
统信 银河麒麟 (amd64和arm64架构)
解决方案1
1、编写linux启动器文件(.desktop文件)放到/etc/xdg/autostart目录下。
[Desktop Entry]
Categories=Utility;Application;
Exec=qt应用的绝对路径,或者启动qt应用脚本文件的绝对路径
Name=trustofdsignservice
Type=Application
这个方案不是以服务的方式启动应用程序,所以如果需要守护进程就需要自己写。
解决方案2
步骤:
需要的文件:
1、要启动的应用文件,以及他依赖的库等
2、启动脚本文件1(XXX1.sh)用于启动应用程序。
3、Unit配置文件(XXX.service),这个最后放到/etc/systemd/system/目录下。
4、脚本文件2(XXX2.sh)用于配置启动环境。
5、linux启动器文件(.desktop文件)
4和5步是为了在用户登录后,系统以登录的用户权限执行这句命令 xhost +,其实也有其他简单办法,但是我需要将所有操作都在安装时完成,即打包后,安装在任何一台机器上后不需要其他操作,就可以实现开机自动启动。所以用这个方法。
文件详情
1、启动脚本1
#!/bin/bash
while [ true ]
do
/bin/sleep 1
processNum=`ps -fe | grep Qt程序名称 | grep -v grep | wc -l`
if [ $processNum -eq 0 ];then
export DISPLAY=:0
xhost +
Qt程序名称绝对路径 &
else
/bin/sleep 1
fi
done
2、Unit配置XXX.service文件
[Unit]
Description= XXXXX
[Service]
Type=sismple
ExecStart=要执行程序的绝对路径
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
3、脚本文件2
#!/bin/bash
xhost +
4、linux启动器文件(.desktop文件)
[Desktop Entry]
Categories=Utility;Application;
Exec=脚本2的绝对路径
Name=trustofdsignservice
Type=Application
放置文件
1、qt应用程序、脚本文件1和脚本文件2,可以按照自己的需求放置。只要相互调用的绝对地址正确就可以了。
2、Unit配置XXX.service文件放到/etc/systemd/system/目录下。
3、linux启动器文件(.desktop文件)放到/etc/xdg/autostart目录下。
执行命令
打开终端执行以下命令
xhost +
systemctl daemon-reload
systemctl enable trustofdsign.service
systemctl restart trustofdsign.service