银河麒麟系统中进程断网自动退出有三种可靠方式:一是用systemd服务配置bindsto=network-online.target实现网络中断时强制终止;二是用shell脚本轮询ping检测后kill进程;三是用networkmanager dispatcher脚本监听down事件毫秒级响应。

银河麒麟系统中,当进程依赖网络连接(如HTTP服务、数据库同步脚本、远程日志采集器)但网络意外中断时,进程常陷入假死或重试阻塞状态,无法主动感知断网并退出。需通过检测网络连通性变化触发进程终止,避免资源占用和状态不一致。
用systemd服务配置网络断开自动退出
这是最可靠的方式,利用systemd原生的网络依赖与条件检查机制,在网络不可达时优雅终止服务。
第一步:确认目标进程已封装为systemd用户服务
若尚未配置,请先创建 ~/.config/systemd/user/myapp.service,内容含 ExecStart、Type=simple 等基本字段。
第二步:在服务文件 [Unit] 段添加网络依赖声明
插入两行:
[Unit]
Wants=network-online.target
After=network-online.target
这确保服务仅在网络真正就绪后启动,也为后续断网检测埋下钩子。
第三步:在 [Service] 段启用网络状态监控与退出逻辑
添加以下三行:
BindsTo=network-online.target
Restart=on-failure
RestartSec=1
【BindsTo=network-online.target 不可省略——它使 network-online.target 停止时(即网络断开),myapp.service 强制停止;而 Restart=on-failure 仅对进程自身崩溃生效,不响应外部依赖中断】。
第四步:重载并启用服务
执行 loginctl enable-linger $USER → systemctl --user daemon-reload → systemctl --user enable --now myapp.service。
第五步:手动模拟断网验证效果
执行 sudo ip link set wlan0 down(替换为你的实际网卡名)→ 等待2秒 → 运行 systemctl --user status myapp.service,确认状态为 inactive (dead) 且 Active: 未显示“since”时间戳。
用shell脚本轮询检测并kill进程
适用于无法改造成systemd服务的临时脚本、Python后台程序或需要自定义断网判定逻辑的场景,例如只认特定域名可达才算联网。
方法一:编写轻量级检测脚本
执行 sudo nano /usr/local/bin/net-down-killer.sh,填入:
#!/bin/bash
PID=$(pgrep -f "myapp.py")
if [ -z "$PID" ]; then exit 0; fi
if ! ping -c1 -W2 114.114.114.114 &>/dev/null; then
kill "$PID" 2>/dev/null
echo "$(date): 网络不可达,已终止进程 $PID" >> /var/log/net-killer.log
fi
方法二:设置每30秒执行一次
执行 crontab -e,新增行:
*/1 * * * * /usr/local/bin/net-down-killer.sh
注意:此处用 */1 表示每分钟,因 cron 最小粒度为1分钟;若需更高频检测,改用 systemd timer。
方法三:赋予执行权限并测试
运行 sudo chmod +x /usr/local/bin/net-down-killer.sh → 手动执行一次脚本 → 检查日志是否生成、目标进程是否被杀。
用NetworkManager dispatcher脚本监听网络事件
此方式由NetworkManager内核级触发,毫秒级响应网络上下线,无需轮询,适合对实时性要求高的守护进程。
第一步:创建dispatcher脚本
执行 sudo nano /etc/NetworkManager/dispatcher.d/99-kill-on-down,写入:
#!/bin/bash
if [ "$2" = "down" ] && [ "$1" = "wlan0" ]; then
pgrep -f "myapp.py" | xargs kill -TERM 2>/dev/null
fi
第二步:设置权限并测试
执行 sudo chmod +x /etc/NetworkManager/dispatcher.d/99-kill-on-down → 断开WiFi → 查看进程是否消失。
⚠️ 注意:脚本名必须以数字开头且全局可执行,否则NetworkManager会忽略它。
第三步:确认NetworkManager dispatcher已启用
执行 systemctl is-active NetworkManager,输出 active 即表示正常;若为 inactive,需运行 sudo systemctl enable --now NetworkManager。











