如何编写自定义关机任务脚本

wen 实用脚本 3

从零到自动化的完整指南

目录导读

  1. 为什么需要自定义关机脚本?
  2. 基础准备:理解系统关机命令
  3. Windows平台脚本编写(批处理与PowerShell)
  4. Linux/macOS平台脚本编写(Bash)
  5. 高级技巧:条件判断与错误处理
  6. 任务调度器集成:让脚本定时运行
  7. 常见问题问答(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 任务计划程序

  1. 打开 taskschd.msc
  2. 创建基本任务 → 触发器(每天/每周/登录时)
  3. 操作 → 启动程序 → 选择你的脚本(.bat.ps1
  4. 勾选 “使用最高权限运行”(尤其对于关机命令)

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

通过本文的引导,你应该能够从零编写出满足自身需求的关机脚本,无论是简单的定时关机,还是结合条件判断的智能关机,核心思路都是:理解底层命令 → 添加逻辑判断 → 集成到调度器,建议先从最简单的脚本开始测试,确保稳定后再加入复杂条件,自动化关机不仅节省能源,更是一种高效的系统管理习惯。

抱歉,评论功能暂时关闭!