麒麟系统关键程序崩溃可采用五种守护方案:一、systemd Restart策略;二、.desktop+守护脚本启GUI;三、supervisord跨架构管理;四、xinetd网络触发恢复;五、crontab心跳检测。

如果您在麒麟操作系统中运行关键程序时遭遇意外崩溃,导致业务中断,则可能是由于缺乏有效的进程守护与自动恢复机制。以下是解决此问题的步骤:
一、配置systemd服务的Restart策略
systemd提供原生的进程崩溃响应能力,通过设置Restart=on-failure可使服务在非零退出码时自动重启,配合RestartSec控制间隔,并利用StartLimitBurst避免频繁崩溃被限频。该方法适用于命令行或后台服务类程序,不依赖桌面环境。
1、创建系统级服务文件:sudo nano /etc/systemd/system/crashguard.service
2、写入以下内容(按实际路径替换ExecStart):
[Unit]
Description=CrashGuard Auto-Restart Service
After=network.target
[Service]
Type=simple
User=kylin
ExecStart=/opt/myapp/bin/app
Restart=on-failure
RestartSec=5
StartLimitBurst=3
StartLimitIntervalSec=60
RestartPreventExitStatus=0 143
[Install]
WantedBy=multi-user.target
3、设置权限并重载配置:sudo chmod 644 /etc/systemd/system/crashguard.service && sudo systemctl daemon-reload
4、启用并启动服务:sudo systemctl enable --now crashguard.service
5、验证守护效果:sudo systemctl kill --signal=SIGSEGV crashguard.service;随后执行sudo systemctl status crashguard.service确认已自动重启
二、使用.desktop文件结合守护脚本启动GUI程序
.desktop文件是银河麒麟桌面环境下启动Qt等GUI程序的标准方式,但其本身不具备崩溃检测能力。需配合外部shell脚本实现循环拉起逻辑,并确保DISPLAY和XAUTHORITY环境变量正确传递,同时授权xhost访问权限。
1、创建守护脚本:sudo nano /opt/myqtapp/guard.sh
2、写入以下内容:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/kylin/.Xauthority
xhost +SI:localuser:kylin 2>/dev/null
while true; do
/opt/myqtapp/myqtapp &
wait $!
sleep 2
done
3、赋予执行权限:sudo chmod +x /opt/myqtapp/guard.sh
4、创建桌面自启项:sudo nano /etc/xdg/autostart/myqtapp-guard.desktop
5、填入以下内容:
[Desktop Entry]
Name=MyQtApp Guardian
Type=Application
Exec=/opt/myqtapp/guard.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
三、部署supervisord进行跨架构统一守护
supervisord是一个独立于init系统的进程管理工具,支持日志重定向、崩溃邮件通知及多进程组管理,在amd64与arm64双架构麒麟系统中表现稳定。它能绕过systemd对图形环境的限制,直接以用户身份管理GUI进程。
1、安装supervisord:sudo apt install supervisor -y
2、创建程序配置:sudo nano /etc/supervisor/conf.d/myapp.conf
3、填入以下内容:
[program:myapp]
command=/opt/myapp/bin/app
directory=/opt/myapp/bin
user=kylin
autostart=true
autorestart=true
startretries=3
environment=DISPLAY=":0",XAUTHORITY="/home/kylin/.Xauthority"
redirect_stderr=true
stdout_logfile=/var/log/myapp.log
4、更新配置并启动守护:sudo supervisorctl reread && sudo supervisorctl update && sudo supervisorctl start myapp
5、检查运行状态:sudo supervisorctl status myapp
四、启用xinetd实现网络触发式自动恢复
对于监听TCP端口的守护型程序(如HTTP API服务),可利用xinetd作为轻量级代理:当连接请求到达而主进程未响应时,xinetd自动拉起新实例。该方式无需修改程序代码,且天然具备超时熔断能力。
1、安装xinetd:sudo apt install xinetd -y
2、创建服务定义:sudo nano /etc/xinetd.d/myapp
3、填入以下内容:
service myapp
{
disable = no
type = UNLISTED
port = 8080
socket_type = stream
protocol = tcp
wait = no
user = kylin
server = /opt/myapp/bin/app
server_args = --no-daemon
per_source = 10
cps = 50 10
log_on_failure += USERID
}
4、重启xinetd:sudo systemctl restart xinetd
5、验证服务可用性:curl -I http://127.0.0.1:8080;若返回200则表示xinetd已成功接管并维持服务存活
五、配置crontab心跳检测与强制拉起
当其他机制不可用或需兼容老旧环境时,可采用crontab定时轮询方式检测进程是否存在。该方案简单可靠,适用于所有麒麟OS版本,但存在最多一分钟的恢复延迟窗口。
1、编写检测脚本:sudo nano /opt/healthcheck.sh
2、填入以下内容:
#!/bin/bash
PID=$(pgrep -f "/opt/myapp/bin/app")
if [ -z "$PID" ]; then
echo "$(date): App not found, restarting..." >> /var/log/app_health.log
/opt/myapp/bin/app &
else
echo "$(date): App running with PID $PID" >> /var/log/app_health.log
fi
3、赋予执行权限:sudo chmod +x /opt/healthcheck.sh
4、添加到root crontab:sudo crontab -e
5、追加一行:*/1 * * * * /opt/healthcheck.sh
6、验证脚本执行:sudo /opt/healthcheck.sh;随后检查/var/log/app_health.log是否生成时间戳记录


















