麒麟系统空闲任务应通过systemd用户服务绑定idle.target实现,需创建service文件、启用linger、重载配置并手动触发idle.target;也可用cron+systemd-inhibit或内核模块方式,但前者最标准可审计。

麒麟系统中某些后台任务(如日志归档、磁盘清理、离线备份)无需开机即运行,但需在系统空闲超过指定时间后自动触发——这要求进程不抢占前台资源,且能准确感知CPU与I/O负载状态,不能依赖简单定时器。
配置systemd用户服务并绑定idle.target
这是最符合Linux标准、可审计、支持负载感知的方案。systemd原生提供idle.target,当系统连续30秒内无键盘/鼠标输入、CPU平均负载低于0.1、且无活跃终端会话时自动激活该target。你的服务必须显式声明WantedBy=idle.target,否则不会响应空闲事件。
第一步:创建服务文件
执行命令:mkdir -p ~/.config/systemd/user && nano ~/.config/systemd/user/backup-on-idle.service
第二步:填入以下内容(注意替换ExecStart路径)
[Unit]
Description=空闲时执行磁盘备份
After=idle.target
StartLimitIntervalSec=0
[Service]
Type=oneshot
ExecStart=/home/kylin/bin/disk-backup.sh
StandardOutput=journal
StandardError=journal
User=kylin
Group=kylin
[Install]
WantedBy=idle.target
第三步:启用服务并验证依赖链
先启用linger:loginctl enable-linger $USER→ 重载配置:systemctl --user daemon-reload→ 启用服务:systemctl --user enable backup-on-idle.service
【关键前提:必须执行 systemctl --user start idle.target 手动触发一次,否则首次空闲不会激活;后续系统会自动维护】
第四步:模拟空闲并观察日志
执行systemctl --user start idle.target→ 等待5秒 → 运行journalctl --user -u backup-on-idle.service -n 20 --no-pager,确认输出含“Started 空闲时执行磁盘备份”及脚本实际执行日志。
用cron结合systemd-inhibit实现条件启动
适用于无法修改服务定义、但需保留cron习惯的场景。systemd-inhibit可临时阻止系统休眠或挂起,同时其退出时会触发一次空闲检测,配合cron的@reboot和*/5 * * * *可实现“启动后每5分钟检查一次是否空闲”。
方法一:编写空闲检测包装脚本
新建/home/kylin/bin/check-and-run-if-idle.sh,内容为:
#!/bin/bash<br>if [ $(cat /proc/loadavg | awk '{print $1}') \ systemd-inhibit --what=handle-lid-switch:suspend --who="backup" --why="run backup" /home/kylin/bin/disk-backup.sh<br>fi
赋予执行权限:
chmod +x /home/kylin/bin/check-and-run-if-idle.sh方法二:添加到用户级crontab
执行crontab -e,追加一行:*/5 * * * * /home/kylin/bin/check-and-run-if-idle.sh > /dev/null 2>&1
这行指令每5分钟运行一次检测,仅当CPU负载低且无GUI会话时才真正执行备份脚本。
通过KYSEC空闲钩子注入(应急专用)
当上述机制因安全策略被禁用(如政务专网环境),且你有root权限时,可直接利用KYSEC提供的空闲事件回调接口。此方式绕过systemd,由内核模块直接监听idle状态,但需手动管理进程生命周期。
第一步:以root身份打开终端,执行sudo -i
第二步:确认KYSEC空闲模块已加载:lsmod | grep kysec_idle,若无输出则需先加载:modprobe kysec_idle
第三步:注册空闲触发器:echo "/home/kylin/bin/disk-backup.sh" > /sys/kernel/kysec/idle_hook
【注意:此操作会覆盖已有hook,且重启后失效,必须配合rc.local或systemd系统服务持久化】
第四步:手动触发一次测试:echo 1 > /sys/kernel/kysec/trigger_idle,然后检查ps aux | grep disk-backup是否出现进程。











