从零到自动化的完整指南
目录导读
- 为什么需要自定义关机脚本?
- 基础准备:理解系统关机命令
- Windows平台脚本编写(批处理与PowerShell)
- Linux/macOS平台脚本编写(Bash)
- 高级技巧:条件判断与错误处理
- 任务调度器集成:让脚本定时运行
- 常见问题问答(FAQ)
为什么需要自定义关机脚本?
在日常运维或个人电脑管理中,我们经常遇到需要 定时关机、条件关机、或执行清理后关机 的场景。

- 长时间下载完成后自动关机(节省电费)
- 下班前自动保存文档并关机(避免数据丢失)
- 服务器在无人值守时执行维护后重启(减少手动操作)
通过编写自定义关机任务脚本,你可以将这些重复性操作交给系统自动完成,大幅提升效率,更重要的是,脚本可以结合 日志记录、错误通知、条件等待 等逻辑,比直接使用系统内置的 shutdown 命令更灵活、更可靠。
基础准备:理解系统关机命令
无论是 Windows、Linux 还是 macOS,都提供了底层关机命令,这是编写脚本的核心。
Windows 系统
# 立即关机 shutdown /s /t 0 # 1小时后关机 shutdown /s /t 3600 # 取消关机 shutdown /a # 重启 shutdown /r /t 0
关键参数:
/s关机/r重启/t xx延迟时间(秒)/c "注释"添加关机原因
Linux/macOS
# 立即关机(需要root权限) sudo shutdown -h now # 10分钟后关机 sudo shutdown -h +10 # 指定时间关机(如23:00) sudo shutdown -h 23:00 # 取消关机 sudo shutdown -c # 重启 sudo shutdown -r now
参数区别:Linux 使用 -h 表示关机(halt),-r 表示重启。
Windows平台脚本编写(批处理与PowerShell)
方法1:批处理脚本 (.bat)
创建文件 shutdown_timer.bat如下:
@echo off echo 脚本启动:将在30分钟后关机 shutdown /s /t 1800 /c "计划维护,请保存工作" echo 如需取消,请输入:shutdown /a pause
扩展:带用户确认的版本
@echo off
set /p confirm="确认关机?(Y/N): "
if /i "%confirm%"=="Y" (
shutdown /s /t 60 /c "用户确认关机"
) else (
echo 操作已取消
shutdown /a
)
pause
方法2:PowerShell脚本 (.ps1)
PowerShell 提供更强大的对象和日志能力:
# 定义关机参数
$delayMinutes = 30
$comment = "日常维护关机"
# 记录日志
$logPath = "C:\Logs\shutdown_$(Get-Date -Format 'yyyyMMdd').log"
"$(Get-Date) - 计划关机,延迟${delayMinutes}分钟" | Out-File -Append $logPath
# 执行关机命令
shutdown /s /t ($delayMinutes * 60) /c $comment
# 显示提示
Write-Host "系统将在 $delayMinutes 分钟后关机,日志已保存: $logPath"
注意:PowerShell 默认禁止执行脚本,需以管理员身份运行:
Set-ExecutionPolicy RemoteSigned
Linux/macOS平台脚本编写(Bash)
基础关机脚本
创建 shutdown_task.sh:
#!/bin/bash
# 自定义关机脚本
DELAY=600 # 10分钟
MESSAGE="系统将在10分钟后关机"
# 输出提示
echo "$MESSAGE"
echo "若要取消,请运行: sudo shutdown -c"
# 执行关机
sudo shutdown -h +$((DELAY / 60)) "$MESSAGE"
# 记录日志
echo "$(date): 计划关机,延迟${DELAY}秒" >> /var/log/shutdown.log
赋予执行权限: chmod +x shutdown_task.sh
运行: ./shutdown_task.sh(建议通过 sudo 或配置免密)
检查活跃进程后关机
#!/bin/bash
# 如果特定程序运行,则等待
if pgrep -x "rsync" > /dev/null; then
echo "rsync 正在运行,等待完成..."
while pgrep -x "rsync" > /dev/null; do
sleep 60
done
echo "rsync 已完成,准备关机"
fi
sudo shutdown -h now
这种场景非常适合备份脚本或大文件传输后自动关机。
高级技巧:条件判断与错误处理
时间窗口检查(只在非工作时间关机)
#!/bin/bash
HOUR=$(date +%H)
if [ "$HOUR" -ge 8 ] && [ "$HOUR" -lt 18 ]; then
echo "工作时间,取消关机"
exit 1
fi
shutdown -h now
资源阈值触发(CPU/内存过高时不关机)
# PowerShell 示例:CPU负载<80%才关机
$cpuLoad = (Get-CimInstance Win32_Processor | Measure-Object -Property LoadPercentage -Average).Average
if ($cpuLoad -lt 80) {
shutdown /s /t 0
} else {
Write-Warning "CPU负载过高 ($cpuLoad%),取消关机"
}
日志与邮件通知
# Linux 脚本最后发送邮件通知 shutdown -h +10 echo "服务器将在10分钟后关机" | mail -s "关机提醒" admin@example.com
任务调度器集成:让脚本定时运行
Windows 任务计划程序
- 打开
taskschd.msc - 创建基本任务 → 触发器(每天/每周/登录时)
- 操作 → 启动程序 → 选择你的脚本(
.bat或.ps1) - 勾选 “使用最高权限运行”(尤其对于关机命令)
Linux Crontab
# 编辑 crontab crontab -e # 每天 23:00 执行关机脚本 0 23 * * * /home/user/shutdown_task.sh # 每小时检查一次是否需要关机 0 * * * * /home/user/conditional_shutdown.sh
macOS Launchd(与 Linux 的 plist 类似)
# 创建 plist 文件(略),然后加载 launchctl load ~/Library/LaunchAgents/com.shutdown.plist
常见问题问答(FAQ)
Q1:脚本执行后没有关机怎么办?
A: 检查以下内容:
- 是否以管理员/root权限运行(核心原因)
- 是否有其他进程阻止关机(如未保存的文档弹出提示)
- 脚本中时间单位是否正确(Windows
/t单位是秒,Linux+10单位是分钟)
Q2:如何远程触发关机脚本?
A:
- Windows 可以使用
psexec \\远程电脑 -s shutdown /s /t 0 - Linux 可使用
ssh user@remote "sudo shutdown -h now"(需配置 SSH 免密)
Q3:脚本在关机前如何保存正在编辑的文档?
A:
- 先调用程序自动保存功能(Office 的
Ctrl+S可通过 SendKeys 模拟) - 更稳妥的方法是:先通过任务管理器发送
WM_QUIT消息,再执行关机
Q4:如何让脚本在用户未登录时也能运行?
A:
- Windows:使用任务计划程序,勾选“不管用户是否登录都要运行”
- Linux:使用
systemd服务或cron(注意环境变量差异)
Q5:如何测试脚本而不真的关机?
A:
- Windows:将
shutdown /s改为shutdown /a(只显示提示但不执行) - Linux:使用
echo替代实际关机命令,如echo "would shutdown"
Q6:脚本参数化——如何从外部传递关机延迟?
A:
- 命令行参数:
shutdown_task.bat 60,脚本内用%1接收 - 环境变量:
export DELAY=30; ./shutdown.sh
通过本文的引导,你应该能够从零编写出满足自身需求的关机脚本,无论是简单的定时关机,还是结合条件判断的智能关机,核心思路都是:理解底层命令 → 添加逻辑判断 → 集成到调度器,建议先从最简单的脚本开始测试,确保稳定后再加入复杂条件,自动化关机不仅节省能源,更是一种高效的系统管理习惯。