如何编写自动关机并记录原因脚本

wen 实用脚本 1

从零开始的系统运维实战指南

目录导读

  1. 为什么需要自动关机脚本?
  2. 脚本核心逻辑与语言选择
  3. 基于Windows的PowerShell实现
  4. 基于Linux的Bash实现
  5. 记录关机原因到日志文件
  6. 计划任务与定时触发
  7. 常见问题与错误处理
  8. 问答环节:你关心的脚本问题

为什么需要自动关机脚本?

在日常运维中,服务器或电脑需要定期维护、节能或应对特定时间段无人值守场景,手动关机不仅低效,而且缺乏审计追踪。自动关机并记录原因脚本能够:

如何编写自动关机并记录原因脚本

  • 确保系统按时关闭,避免非正常断电损坏硬件
  • 记录每次关机的原因(如“每日维护”、“电量低”),便于后续分析
  • 与任务计划或cron结合,实现无人值守管理

适用场景: 数据中心服务器、远程办公电脑、实验室设备、网吧计费系统等。


脚本核心逻辑与语言选择

编写这类脚本需要三个基本要素:

  • 获取当前时间/用户输入:确定关机时刻或立即执行
  • 调用系统关机命令:如Windows的shutdown、Linux的shutdown -h
  • 日志写入功能:将关机原因、时间、触发者追加到文本文件

推荐语言

  • Windows:PowerShell(原生支持COM对象和日志写入)
  • Linux/macOS:Bash(最简捷,配合echo和重定向)
  • 跨平台:Python(需安装,但灵活性高,适合复杂场景)

本文重点介绍PowerShell和Bash两种主流实现。


基于Windows的PowerShell实现

以下脚本允许用户传入原因参数,并记录到C:\Logs\shutdown.log

# shutdown_with_reason.ps1
param(
    [string]$Reason = "未指定原因"  # 默认原因
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$logPath = "C:\Logs\shutdown.log"
# 确保日志目录存在
if (-not (Test-Path "C:\Logs")) {
    New-Item -ItemType Directory -Path "C:\Logs" -Force | Out-Null
}
# 追加日志
"[$timestamp] 自动关机触发 - 原因: $Reason" | Out-File -FilePath $logPath -Append
# 执行关机(延迟10秒以便日志写入完成)
shutdown /s /t 10 /c "自动关机:$Reason"
Write-Host "将在10秒后关机,原因已记录"

关键点

  • 使用shutdown /s执行关机,/t 10表示10秒后执行
  • 日志文件追加写入,不会覆盖历史
  • 默认未携带原因时,记录“未指定原因”

基于Linux的Bash实现

Linux下使用shutdown -h命令,通过echo写入日志。

#!/bin/bash
# auto_shutdown.sh
REASON="${1:-未指定原因}"  # 如果无参数则使用默认值
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
LOG_FILE="/var/log/shutdown_reason.log"
# 确保日志文件存在
touch "$LOG_FILE"
# 写入日志
echo "[$TIMESTAMP] 系统将关机 - 原因: $REASON" >> "$LOG_FILE"
# 执行关机(1分钟后)
shutdown -h +1 "自动关机:$REASON"
echo "系统将在1分钟后关机,原因已记录。"

执行权限chmod +x auto_shutdown.sh

区别:Linux下shutdown -h默认在1分钟后关机,可用-P now立即执行。


记录关机原因到日志文件

日志文件的格式应便于后续检索,建议包含:

  • 时间戳:精确到秒
  • 触发程序名称或PID(可选)
  • 原因文本
  • 用户/进程上下文(如脚本调用者)

示例日志输出

[2025-03-21 22:00:00] 系统将关机 - 原因: 每日夜间维护
[2025-03-22 08:00:00] 系统将关机 - 原因: 电池电量低于15%自动保护

增强方案:在Windows中可使用EventLog(Write-EventLog),Linux中使用logger写入系统日志,但普通文件更易解析。


计划任务与定时触发

Windows任务计划

  1. 打开“任务计划程序”
  2. 创建任务 → 触发器选择“每天”或“当事件发生时”
  3. 操作选择“启动程序”,程序填powershell.exe,参数填-File "C:\Scripts\shutdown_with_reason.ps1" -Reason "每日维护"

Linux Cron

crontab -e
# 每天22:00执行关机,原因“自动定时关机”
0 22 * * * /root/auto_shutdown.sh "夜间例行维护"

提示:cron环境变量较少,建议在脚本内使用绝对路径。


常见问题与错误处理

问题 原因 解决办法
脚本未被管理员权限运行 Windows下shutdown需要管理员权限 右键以管理员身份运行;或任务计划勾选“最高权限运行”
日志文件无法写入 路径无权限或目录不存在 脚本内添加try-catch或目录创建逻辑
Linux脚本无执行权限 未添加chmod +x 给予执行权限或者用bash script.sh运行
多个脚本同时触发关机 竞争条件 使用锁文件或检查shutdown进程是否已存在

问答环节:你关心的脚本问题

Q1:如何在脚本中取消已计划的关机?
A1: Windows用shutdown /a,Linux用shutdown -c,可在脚本开头检查是否存在挂起的关机并提示。

Q2:脚本如何记录关机原因到系统事件日志?
A2: Windows下用Write-EventLog -LogName System -Source "AutoShutdown" -EntryType Information -EventId 1001 -Message "关机原因:$Reason",Linux下用logger "关机原因:$Reason"

Q3:如果用户取消关机,日志仍然被写入怎么办?
A3: 不要在脚本开头立即写入日志,应只在确认关机即将执行时写入,或者采用两阶段法:先记录“计划关机”,实际关机时再记录“已执行”。

Q4:能否通过远程唤醒(WOL)后再自动关机?
A4: 可以,脚本可先发送WOL包唤醒,等待任务完成后调用关机,但需配合任务计划或外部调度系统。

Q5:日志文件越来越大如何管理?
A5: 使用日志轮转策略,如Linux的logrotate,Windows的最大文件大小策略(在脚本内检测文件大小并压缩旧日志)。


通过以上步骤,你可以轻松编写一个自动关机并记录原因脚本,并集成到日常运维流程中,无论是单个电脑还是服务器集群,这种自动化手段都能显著提升管理效率与审计能力,根据实际环境选择PowerShell或Bash,并配合计划任务,即可实现无人值守的智能关机体系。

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