1. 为什么银河麒麟用户需要“用完自动关机”这回事先说个真实场景。上个月我处理一台办公电脑的工单用户抱怨“早上开机特别慢风扇声音大得像起飞下午一碰就卡”。我远程一看进程列表好家伙这台电脑已经连续开机四天没关过机后台堆积了两万多条日志浏览器缓存膨胀到 8 个多 G还有一堆没人记得是干嘛的驻留进程在那挂着。这种情况在公司、机关、学校的国产化终端上特别常见。银河麒麟 V10 桌面系统本身跑得挺稳但架不住长期不关机。我这里的经验是长期不重启的麒麟系统迟早会在某个周一早上给你脸色看。让电脑在没人用的时候自动关机是运维里投入产出比最高的一件小事。这期笔记想聊的核心话题很直白怎么给银河麒麟系统安排一个“免费小工具”让它在指定时间或者空闲足够久之后自动关机。里面既包含图形界面的傻瓜式工具也包含运维最常用的命令行方案还有我在实际部署中踩过的一些坑。适合看这篇内容的人大概有这么几类在单位里负责维护一批国产终端的人自己电脑装了银河麒麟双系统、想省电又想保护硬件的人以及刚接触 Linux 运维、想在国产系统上练练手的新人。别看“自动关机”四个字很小把这件事做专业了牵扯到的定时任务、权限管理、日志排查全是运维的看家本领。提示文中介绍的方法在银河麒麟桌面版 V10 和服务器版 V10 上都能跑通。统信 UOS 的底层机制和它同源也基本适用个别命令的包名可能略有差异。2. 自动关机的方案选型图形工具、命令还是定时任务2.1 先搞清楚需求再选工具很多人一上来就问“哪个工具最好用”但这个问题的前提应该是“你到底需要哪种自动关机”。就我这几年在国产系统上做运维的观察需求大致可以分成三类。第一类是最朴素的倒计时关机比如“我再干两个小时就走两小时后自动关机”这种场景用最简单的一次性定时任务就能解决不需要常驻软件。第二类是固定时间点关机比如每天下午六点半或者每周五晚上八点下班之后机器自己断电这种需要持久化的定时任务支持。第三类是空闲自动关机也就是电脑一段时间内没人操作就自动关闭这种最省心但也最容易误伤——比如你正在后台跑一个数据导出任务键盘鼠标虽然没人碰但任务还在运行贸然关机就把活干废了。我自己的习惯是给普通办公用户尽量提供图形界面工具他们不会去记命令也没有兴趣了解shutdown有多少种参数给运维和开发用命令行方案因为要批量下发、要写脚本、要纳入监控命令行才是最高效的。不要试图用一种方案通吃所有场景这是我这几年反复踩坑得出来的结论。2.2 常见自动关机方案横向对比为了方便选择我先把常见的几条路摆出来对比一下。表格里的工具在银河麒麟 V10 上都实测过运行环境是 AMD64 架构 麒麟自带的 UKUI 桌面。方案界面类型支持定时关机支持空闲关机支持重启/注销是否常驻后台适合人群gShutdown免费工具图形界面支持支持支持启动后常驻托盘普通办公用户、初级运维系统自带shutdown命令命令行支持不支持支持一次性任务不常驻运维、开发at命令 shutdown命令行支持一次性的时间点不支持支持不常驻运维、开发cron 脚本命令行支持循环定时可自行编写判断逻辑支持由系统 crond 常驻运维、开发其他第三方“管家类”软件图形界面部分支持部分支持部分支持常驻后台捆绑多不建议使用这里我想多说一句为什么“不建议使用管家类软件”。在 Windows 生态里这类“全家桶”已经让人头疼了在国产 Linux 生态里情况更麻烦——它们往往以“优化”“清理”为卖点实际上会侵入系统目录、替换系统组件、弹广告一个不爽还会和其他桌面组件抢资源。你给我一个不用常驻的后台脚本就能搞定的事为什么要装一个三四十兆的管家程序2.3 我为什么推荐“物理层自由”的原生方案说白了银河麒麟是深度定制的 Linux 发行版Linux 底层的定时机制本来就是全球无数服务器每天依赖的看家本领可靠性比任何第三方的“智能省电助手”都高。cron 和 at 是系统级服务只要机器没有被人为停止相关服务到点就会执行不存在软件崩溃导致失灵的问题。所以我给用户的建议永远是能用系统自带能力解决的绝对不要装额外的软件必须用工具提升体验的优先选 gShutdown 这种精简、开源、有对应平台包的小工具。gShutdown 本质上只是把shutdown命令封装成了一个图形界面它不常驻占用多少资源也不修改系统配置属于“把命令行了然于胸但不想背参数的人”的偷懒神器。3. 免费小工具实操gShutdown 的安装与配置3.1 获取 gShutdown用软件商店还是用命令银河麒麟 V10 自带的应用商店里面搜“关机”其实能找到几个相关的工具但不同版本、不同镜像源里收录情况不一样有时候你搜出来的名字叫“自动关机”有时候叫“Gshutdown”。我不能保证每个镜像都收录了这个包所以最稳妥的安装方式是直接用 apt 拉取或者下载 deb 包手动安装。先看 apt 方式。打开终端快捷键 CtrlAltT依次执行sudo apt update sudo apt install gshutdown -y第一行命令的作用是刷新软件源缓存让系统知道远程仓库里最新的包信息。如果在国内网络环境下这一步执行很慢建议换一下软件源——银河麒麟官方维护了多个镜像节点你可以通过系统自带的“软件更新”工具切换也可以手动编辑/etc/apt/sources.list但手动编辑有风险新手不推荐最好用系统工具操作。如果 apt 提示找不到这个包那就走第二种方式网上搜索 gShutdown 的 Linux 发行版deb 格式安装包下载后手动安装。下载的时候注意两点一是认准.deb后缀二是认准 amd64 架构不要下载成 i386 或者其他架构的包否则装不上。拿到 deb 包后在文件管理器里双击它会弹出软件安装器点击“安装”输入密码即可。也可以命令行安装sudo dpkg -i gshutdown_*.deb如果遇到依赖缺失的报错执行一下sudo apt -f install系统会自动把缺的依赖装上。3.2 图形界面的设置方法安装完成后不需要重启系统。在开始菜单里搜“关机”或者直接在终端里输入gshutdown回车就能看到主界面。gShutdown 的主界面设计得比较直观我大概翻译一下关键选项关机模式有两个入口一个是“请指定关机时间”可以选“倒计时”比如从当前时间开始算多少分钟后关机或者“指定时间”比如 18:30 准时关机另一个是“系统空闲时自动关机”这里可以设置空闲多少分钟后关机。操作类型可以选择“关闭系统”“重启系统”“注销”等下拉菜单里都有。如果需要执行自定义命令选择“自定义命令”然后填上具体命令。时间格式如果选择“指定时间”要注意它显示的是 24 小时制格式结合本机系统时间生效。实际使用中我给办公室普通用户推荐的配置是每天 18:30 关机 空闲 30 分钟自动关机双保险。如果哪天用户需要加班可以直接从托盘图标退出 gShutdown或者在提示窗口跳出来的时候点“取消”非常灵活。注意gShutdown 只是个前端配置工具真正执行关机动作的还是系统底层的shutdown命令。所以确保当前用户有权限执行关机操作这点一般没问题因为安装时已经赋予过了。3.3 常见问题打不开界面、点保存没反应在实际部署过程中有几个和 gShutdown 相关的坑值得单独拿出来说。第一个问题是“安装完成后在开始菜单搜不到”。这是国产系统的菜单缓存刷新滞后导致的通常过几分钟就好了等不及的话直接在终端敲gshutdown启动即可。第二个问题是“点确定后没反应”。排查思路是先看后台进程有没有起来ps -ef | grep gshutdown如果进程在但没反应多半是托盘图标没有正确加载。在 UKUI 桌面上这个工具依赖系统的托盘通知区域组件有些精简过的系统镜像把通知区域组件裁剪掉了。解决方法倒也不复杂退出去用命令行方案代替就行。第三个问题是运行sudo gshutdown时的权限问题。**这里特别提醒一下不要在终端里用sudo gshutdown启动这个工具。虽然这样能启动但它会以 root 用户权限运行一旦你设置的是“自定义命令”整个命令都会以最高权限执行出了一点操作失误后果可能很严重。这个工具本身不需要 root 权限就能完成设置它设置完成之后系统会通过 PolicyKit 授权机制来执行关机的动作。老老实实以普通用户启动就够了。4. 运维最爱纯命令行的自动关机方案4.1shutdown命令的基本用法图形工具照顾到了“不想记命令的人”但作为运维命令行是必须掌握的底层能力。先把shutdown命令的基本用法过一遍因为不管是 at 还是 cron最后真正执行关机的都是它。查看命令帮助可以敲man shutdown日常最常用的几个参数我列一下# 立即关机 sudo shutdown -h now # 10 分钟后关机并给所有登录用户发提示信息 sudo shutdown -h 10 系统将在10分钟后关机请保存工作 # 指定具体时间点关机格式是 24 小时制 HH:MM sudo shutdown -h 18:30 # 取消已计划的关机 sudo shutdown -c # 重启作用和 -h 类似但动作是重启 sudo shutdown -r 5 系统将在5分钟后重启这里有个小细节-h是 halt 的意思代表停机-r是 reboot代表重启。关机场景用-h有的人习惯用-Ppoweroff效果一样都是关机并且断电。不同发行版里这些参数行为基本一致。另外如果只想关机但不想等也可以直接:sudo poweroff sudo reboot很多初学者会纠结shutdown -h now、halt、poweroff三者的区别其实在日常运维里它们最终的效果差别可以忽略都是关闭机器。真正需要注意的是定时关机的任务不要随便放在普通用户下直接跑必须要有 sudo 权限否则执行时会提示“Operation not permitted”。4.2 一次性定时关机at命令的正确姿势很多 Linux 初学者只知道 cron不知道 at。这两兄弟的分工是cron 适合周期性的任务比如“每天凌晨两点清理日志”at 适合一次性的任务比如“90 分钟后关机”。自动关机绝大多数场景是一次性任务用 at 比用 cron 更贴合语义也少了周期任务的意外触发风险。先检查 at 服务是否安装并启动sudo apt install at -y systemctl status atd如果状态不是 active启动它systemctl enable --now atd然后指定 90 分钟后关机可以这样写echo sudo shutdown -h now | at now 90 minutes也可以写成更可读的形式at 18:30 sudo shutdown -h now # 按 Ctrl D 提交at 服务会把任务排队查看待执行的任务队列用atq要删除某个任务用atrm 任务编号。结合 atq 和 atrm运维可以在用户误设了自动关机后快速撤销这比让用户满世界找 gShutdown 要快得多。4.3 周期性关机任务cron 脚本的写法如果是长期、固定、每天或每周执行的关机任务那就得用 cron。cron 任务分为系统级crontab和用户级crontab。设置自动关机我推荐放在用户级因为系统级 crontab 有额外的格式要求要看/etc/crontab里的说明给新手增加了理解成本。用户级用crontab -e首次执行时会让你选择编辑器我习惯选 vim.basic。然后在文件的末尾加上一行30 18 * * 1-5 /sbin/shutdown -h now这行的含义是每周一到周五的 18:30 执行关机。五个时间字段分别是“分钟 小时 日 月 星期”星号代表任意值1-5代表周一到周五。设置完成后用下面的命令确认任务已经生效crontab -l我特别想强调一个坑cron 环境变量和交互终端不一样。你在终端里敲shutdown能执行不代表 cron 里直接写shutdown就能执行。因为 cron 执行时 PATH 环境变量很有限通常不会包含/sbin和/usr/sbin这两个目录。所以写脚本或者写 crontab 时尽量使用命令的绝对路径/sbin/shutdown。如果你真踩了“任务没执行”的坑第一件事就是去看命令的绝对路径是否正确第二件事是看日志grep CRON /var/log/syslog这样一定能定位到问题。4.4 更安全的做法写一个自动关机脚本把命令直接写在 crontab 里虽然简单但不够灵活。比如我想在关机之前先写一条日志、想临时跳过某次关机、想判断某个关键进程是否还在运行这些场景光靠一行命令很难实现。所以我建议写一个脚本在脚本里加必要的前置判断再由 cron 或者 at 去调用脚本。以下是我在项目里常用的一个自动关机脚本放在/usr/local/bin/auto-shutdown.sh#!/bin/bash # 自动关机脚本带日志记录和进程保护 # 使用前请根据自己的环境调整 LOG_FILE/var/log/auto-shutdown.log # 定义需要保护的进程名匹配到则本次不关机 PROTECT_PROCESSrsync|ffmpeg|tar|mysqldump # 检查是否有重要任务正在运行 if pgrep -f $PROTECT_PROCESS /dev/null; then echo $(date %Y-%m-%d %H:%M:%S) 检测到关键任务运行中取消本次自动关机 $LOG_FILE exit 0 fi # 写入关机日志 echo $(date %Y-%m-%d %H:%M:%S) 开始关机 $LOG_FILE # 执行关机 /sbin/shutdown -h now创建脚本文件后执行sudo chmod x /usr/local/bin/auto-shutdown.sh sudo crontab -e在系统级 crontab 中加入30 18 * * 1-5 /usr/local/bin/auto-shutdown.sh这个方案的妙处在于关机逻辑完全由我自己控制以后要加“检测到网络还在传输文件就延迟关机”之类的功能改脚本就行不需要动 cron。在维护几十台机器的场景下这种可扩展性非常重要。5. 部署自动关机时绕不开的系统细节5.1 时间同步定时不准的元凶定时关机前提是系统时间得准。这个话题听着基础但在国产终端上真的太容易翻车了。我遇到过一个案例一台机器显示的时间比北京时间快了整整 8 分钟因为 BIOS 里的时间被某个软件改乱了。用户设置了 18:30 自动关机结果 18:22 电脑就“砰”地一声关了用户当场崩溃。排查方法很简单date timedatectl status如果时间不对先设置系统时区sudo timedatectl set-timezone Asia/Shanghai然后强制同步网络时间。银河麒麟默认带了 NTP 同步服务但有些镜像里 NTP 服务没启用手动同步的命令是sudo apt install ntpdate -y sudo ntpdate ntp.aliyun.com如果是刚装完系统、机器长期没联网建议先做一次手动同步再开启系统自动校时。那么自动关机任务的时间点才会真正有意义。5.2 取消密钥环弹窗别让权限提示挡了自动关机的路银河麒麟桌面版在登录时会自动解锁一个叫“密钥环”的组件它用于保存 Wi-Fi 密码、浏览器密码之类的敏感信息。如果系统设置变化或者用户修改了登录密码密钥环会在开机后一直弹窗提示输入密码我见过很多终端用户被这个弹窗折磨到抓狂。自动关机本身不依赖密钥环但如果你把自动关机配置成了开机启动服务而系统一直卡在密钥环弹窗这里偶发情况下任务可能被阻塞导致关机指令下发不顺畅。取消密钥环的方式是编辑应用密钥环的配置文件rm -rf ~/.local/share/keyrings/删掉这个目录后重新登录系统会让该用户重新初始化密钥环并且不再要求设置密钥环密码。这个操作会清空已经保存的 Wi-Fi 密码等凭据需要重新输入一遍成本可接受。注意这个操作只对当前用户生效。如果单位里每台电脑都有多个账户需要在每个账户下执行。5.3 防火墙别误拦本地 shutdown 的依赖银河麒麟桌面版默认防火墙是 ufw一般情况下自动化关机命令和防火墙无关因为 shutdown 走的是系统内部机制不经过网络栈。但有一个边缘情况有些单位在终端上安装了远程管理 Agent由管理服务器下发电源指令。如果服务器的端口没在防火墙放行远程关机就会失败。这种情况下的排查思路是sudo ufw status sudo ufw allow from 服务器IP to any port 22 proto tcp对于纯本地自动关机场景防火墙不会影响但如果你的技术方案涉及 SSH 远程执行关机就要确保 SSH 端口默认 22是放行的。5.4 升级 SSH 服务远程管理不掉链子既然聊到了远程执行关机就顺手把 SSH 这事儿补全。单位里运维远程控制终端最常用的手段就是 SSH。银河麒麟 V10 系统自带的 OpenSSH 版本如果偏老可能会因为系统安全策略升级而出现无法连接的情况我就在几个项目上遇到过。升级 SSH 服务的操作比较简单sudo apt update sudo apt install openssh-server -y sudo systemctl enable --now ssh升级后检查版本和服务状态ssh -V systemctl status ssh这里不建议去源码编译最新版 OpenSSH除非你对依赖库很清楚。国产系统的软件源维护是有延迟的用软件源提供的版本稳定性有保障也避免了编译升级后与 PAM 模块不兼容的问题。6. 让自动关机更可靠日志、特权与会话管理的细节6.1 查看关机记录今天到底有没有执行过自动关机部署完之后怎么确认它真的按计划执行了两个途径一是查系统日志里的关机记录二是查 shutdown 计划任务。查看本次开机时间以及上一次关机时间who -b last reboot last shutdownlast shutdown输出里能看到关机时间点以及在关机前当时登录的用户。如果发现关机时间不在计划内就是有异常任务在捣鬼配合journalctl进一步确认journalctl -u systemd-shutdownd对于用了我们之前那个脚本方案的直接看/var/log/auto-shutdown.log里面的记录比系统日志更直观。6.2 别忘了给自动关机机制保障“特权边界”权限是自动关机方案里最容易出问题的一环。普通用户执行shutdown -h now会提示权限不足所以在 crontab 里配置关机任务一定要用 root 用户的 crontabsudo crontab -e而不是普通用户的 crontab。但用 root crontab 也有副作用如果你在个人用户名的 crontab 里写了关机任务会以该用户的权限执行除非该用户在 sudoers 里有免密权限否则任务必然失败。我见过太多新手在crontab -e里配置/sbin/shutdown -h now结果执行时报错系统提示authentication required。所以有一条铁律配置关机任务要么放 root crontab要么在脚本里用sudo -n配合 sudoers 免密规则不要尝试在普通用户 crontab 里裸奔。6.3 保留 date 重装系统和磁盘快照防患于未然这里想多说一个和自动关机关系不大、但实操中很常见的延伸问题——“银河麒麟保留 date 重装系统”这个热搜词背后的事情。银河麒麟 V10 在重装系统时有一个“保留数据”的选项但很多用户重装完发现系统时间不对劲或者 /home 分区还挂着旧的挂载点这里其实牵扯到系统对分区的识别和 date 命令的环境变量配置。自动关机配置中如果要用到时间判断重装系统后旧的 cron 配置可能残留也可能丢失。重装前我建议先备份 /var/spool/cron 目录和 /etc/crontab 文件重装后再恢复否则默认配置会覆盖掉你精心调好的关机时间表。另外既然说到了防患于未然就顺带推荐一下磁盘快照。银河麒麟上可以用 timeshift 定期做系统快照一旦某次自动关机前后出现磁盘异常比如网上很多人反馈的“磁盘突然空白了”只要快照还在就能快速回滚到正常状态。自动关机是为了省心快照是为了防止万一出了事手忙脚乱两者搭配是终端运维的基础素养。sudo apt install timeshift -y图形界面下一路下一步配置即可快照放在独立分区或者移动硬盘上都行推荐留两个冗余。7. 常见问题排查与避坑实录7.1 问题速查表在几十台机器上部署下来我把高频问题汇总成一个速查表照着排查效率最高。现象可能原因排查命令/方法解决思路到了时间没关机cron 服务未运行systemctl status cronsudo systemctl enable --now cron到了时间没关机命令写成了相对路径grep shutdown /var/spool/cron/crontabs/*改为/sbin/shutdown绝对路径到了时间没关机任务被 at 队列阻塞atqatrm 编号删除残留任务弹出关机提示但立刻断电定时任务与 Power Manager 冲突ps aux | grep -i power关闭桌面电源管理器里的自动挂起关机后又自动开机主板设置 RTC WakeBIOS 里关闭 Wake on RTC设置每天定时开机除外设置了关机但没权限用户不在 sudoerssudo visudo添加用户名 ALL(ALL) NOPASSWD:/sbin/shutdown日志显示执行了但机器还在桌面会话阻止了关机journalctl -b -1 -e退出所有用户会话再执行关机7.2 别让 gShutdown 和系统电源管理打架这是一个非常隐蔽的坑。银河麒麟桌面自带的电源管理器也有“闲置多少分钟后进入休眠/挂起”的设置它和 gShutdown 的“空闲后关机”是两套独立机制。如果电源管理器设置的挂起时间是 20 分钟而 gShutdown 设置的空闲关机是 30 分钟那么结果是20 分钟后机器进入挂起状态系统不再计算“空闲”时间gShutdown 的关机条件永远触发不了。所以在桌面环境下要让 gShutdown 的空闲关机生效优先把系统电源管理器里的“空闲挂起”时间调得比 gShutdown 更长或者直接关闭挂起功能。这个细节我踩过一次后来在每台部署的机器上都特别注意检查再也没出过问题。7.3 关机执行前的“后悔药”机制管理几十台机器最怕的不是关机失败而是不该关机的时候它给关了——比如员工晚上还在加班赶报告结果系统 20:00 准时断电那可就引发“血案”了。为了应对这种情况我在最终的自动关机脚本里加了一个“8 分钟倒计时”机制/sbin/shutdown -h 8 系统将在8分钟后关机如需取消请执行 sudo shutdown -c同时用 notify-send 给登录用户弹一个图形提示notify-send 系统即将关机 如需取消请在8分钟内到终端执行sudo shutdown -c这样既保留了定时关机的省心效果又给了现场人员一个撤回的窗口。对于办公场景这个“后悔药”设计让我少挨了很多骂。提示如果你管理的机器使用者普遍不太懂命令也可以告诉他们看到提示后双击桌面上的“取消关机.bat”快捷方式里面放一行sudo shutdown -c效果一样。别笑这种“桌面快捷方式”的办法在终端用户里非常受欢迎。8. 批量部署小结一台、十台、一台批量上架最后聊聊批量部署的事情。如果你只管自己一台电脑装个 gShutdown 或者手写 crontab 就够了。但如果你和我一样需要在几十台银河麒麟终端上统一部署自动关机策略那最好把配置做成标准化的。我目前的批量部署做法是先维护一个标准的/usr/local/bin/auto-shutdown.sh脚本统一放在配置管理仓库里。用 Ansible 批量分发脚本文件到各台终端并用 Ansible 的 cron 模块统一写入 root crontab。在 Ansible 配置中单独处理例外情况比如某台机器需要延迟关机就在它的 host_vars 里覆盖变量。Ansible 批量配置的核心操作大致是- name: 分发自动关机脚本 copy: src: files/auto-shutdown.sh dest: /usr/local/bin/auto-shutdown.sh mode: 0755 - name: 配置 root crontab cron: name: auto-shutdown weekday: 1-5 hour: 18 minute: 30 job: /usr/local/bin/auto-shutdown.sh become: true如果你没接触过 Ansible也可以直接做一个压缩包里面放脚本和 crontab 文件写一个 install.sh 让每台机器跑一遍。但无论用哪种方式标准化的脚本命名和统一的日志路径一定要坚持否则后面排查问题的时候会疯掉。写到这里我还想再额外分享一个经验。刚入行的时候我也觉得自动关机是小菜一碟后来在一次项目里因为没考虑“系统电源管理挂起”这个坑导致几十台机器在设定时间都没关机白白耗了一夜的电第二天被客户当着全组的面点名。从那以后我就养成了一个习惯在国产系统上做任何自动化任务先把系统的电源管理、会话管理、权限模型这三件事摸透再动手写脚本。很多自动化任务不是被脚本逻辑坑死的而是被系统自身的行为坑死的。希望这期笔记能帮你少走几步弯路。如果你在银河麒麟上配置自动关机时遇到其他问题多看看系统日志多拆一拆命令的执行链路多半都能找到答案。