如果你有一款普通ups还想实现断 电自动关机,原理在飞牛os每分钟ping路由器(设备断 电关机不要连接ups)或者任意ip如果不通连续ping 5次也就是五分钟自动执行关机。
如果觉得这样用也可以就继续往下看使用ai写的一键脚本。
注意:必须修改此处的ip地址为自己的如路由器地址ROUTER_IP="192.168.1.1"
默认为每分钟ping1次,5次不通自动关机,可自定义。
准备好文件继续
#!/bin/bash
# shutdown_watcher.sh - 飞牛OS监控ip关机工具
# 用法: sudo ./shutdown_watcher.sh [install|uninstall|status|start|stop|restart|logs]
# ==================== 配置区域 ====================
ROUTER_IP="192.168.1.1"
CHECK_INTERVAL=60 # 检测间隔(秒)
RETRY_COUNT=5 # 失败重试次数
LOG_FILE="/var/log/shutdown_watcher.log"
SERVICE_NAME="shutdown-watcher"
SCRIPT_PATH="/usr/local/bin/shutdown_watcher.sh"
# =================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 打印带颜色信息
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 检查root权限
check_root() {
[[ $EUID -ne 0 ]] && error "请使用sudo运行此脚本" && exit 1
}
# 主监控逻辑(作为服务运行时)
start_monitor() {
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"; }
log "监控启动: IP=$ROUTER_IP, 间隔=${CHECK_INTERVAL}s, 重试=${RETRY_COUNT}次"
fail=0
while true; do
if ping -c1 -W3 "$ROUTER_IP" &>/dev/null; then
[[ $fail -gt 0 ]] && log "网络已恢复"
fail=0
else
((fail++))
log "检测失败: $fail/$RETRY_COUNT"
if [[ $fail -ge $RETRY_COUNT ]]; then
log "故障确认!1分钟后关机"
shutdown -h +1 "网络故障,1分钟后关机"
exit 0
fi
fi
sleep $CHECK_INTERVAL
done
}
# 安装服务
install_service() {
check_root
# 1. 复制脚本到系统目录
info "安装脚本到 $SCRIPT_PATH"
cp "$0" "$SCRIPT_PATH"
chmod +x "$SCRIPT_PATH"
# 2. 创建systemd服务
info "创建systemd服务"
cat > "/etc/systemd/system/${SERVICE_NAME}.service" << EOF
[Unit]
Description=Network Shutdown Watcher
After=network.target
[Service]
Type=simple
ExecStart=$SCRIPT_PATH run
Restart=always
RestartSec=10
User=root
[Install]
WantedBy=multi-user.target
EOF
# 3. 配置日志轮转
info "配置日志轮转"
cat > "/etc/logrotate.d/${SERVICE_NAME}" << EOF
$LOG_FILE {
daily
rotate 7
compress
missingok
notifempty
create 644 root root
}
EOF
# 4. 启动并启用服务
info "启动服务并设置开机自启"
systemctl daemon-reload
systemctl enable --now "$SERVICE_NAME"
info "安装完成!"
status_service
}
# 卸载服务
uninstall_service() {
check_root
# 1. 停止并禁用服务
info "停止并禁用服务"
systemctl stop "$SERVICE_NAME" 2>/dev/null
systemctl disable "$SERVICE_NAME" 2>/dev/null
# 2. 删除文件
info "删除相关文件"
rm -f "/etc/systemd/system/${SERVICE_NAME}.service"
rm -f "/etc/logrotate.d/${SERVICE_NAME}"
rm -f "$SCRIPT_PATH"
rm -f "$LOG_FILE"
# 3. 重载systemd
systemctl daemon-reload
info "卸载完成!"
}
# 查看状态
status_service() {
# 检查服务状态
if systemctl is-active "$SERVICE_NAME" &>/dev/null; then
info "服务运行中 ✓"
systemctl status "$SERVICE_NAME" --no-pager -l
else
warn "服务未运行"
systemctl status "$SERVICE_NAME" --no-pager -l 2>/dev/null || error "服务不存在"
fi
# 显示日志末尾
echo -e "\n${BLUE}最近日志:${NC}"
[[ -f "$LOG_FILE" ]] && tail -n 5 "$LOG_FILE" || warn "日志文件不存在"
}
# 启动服务
start_service() {
check_root
systemctl start "$SERVICE_NAME" && info "服务已启动"
}
# 停止服务
stop_service() {
check_root
systemctl stop "$SERVICE_NAME" && info "服务已停止"
}
# 重启服务
restart_service() {
check_root
systemctl restart "$SERVICE_NAME" && info "服务已重启"
}
# 查看日志
view_logs() {
if [[ -f "$LOG_FILE" ]]; then
info "实时日志(按Ctrl+C退出):"
tail -f "$LOG_FILE"
else
error "日志文件不存在"
fi
}
# 显示帮助
show_help() {
cat << EOF
Usage: sudo $0 [COMMAND]
Commands:
install 安装为systemd服务(开机自启)
uninstall 完全卸载服务
status 查看服务状态和日志
start 启动服务
stop 停止服务
restart 重启服务
logs 实时查看日志
run 直接运行监控(不调systemd)
help 显示此帮助信息
Configuration:
ROUTER_IP = $ROUTER_IP
CHECK_INTERVAL = ${CHECK_INTERVAL}s
RETRY_COUNT = $RETRY_COUNT
LOG_FILE = $LOG_FILE
Examples:
sudo $0 install # 安装并启用
sudo $0 status # 查看状态
sudo $0 logs # 查看日志
sudo $0 uninstall # 完全卸载
EOF
}
# 主程序入口
case "${1:-help}" in
install)
install_service
;;
uninstall)
uninstall_service
;;
status)
status_service
;;
start)
start_service
;;
stop)
stop_service
;;
restart)
restart_service
;;
logs)
view_logs
;;
run)
# 直接运行监控逻辑(不通过systemd)
info "直接启动监控(退出请按Ctrl+C)"
start_monitor
;;
help|--help|-h)
show_help
;;
*)
error "未知命令: $1"
show_help
exit 1
;;
esac
前期准备
修改脚本,复制到飞牛文件夹并获取文件位置

root方式运行
- 安装并启用
进入脚本文件夹
cd /vol1/1000/app/
ls看看有没有显示文件shutdown_watcher.sh

给予执行权限
chmod +x shutdown_watcher.sh
安装为系统服务(开机自启)
sudo ./shutdown_watcher.sh install

- 日常管理命令
查看状态
sudo ./shutdown_watcher.sh status
查看实时日志
sudo ./shutdown_watcher.sh logs
停止监控(临时)
sudo ./shutdown_watcher.sh stop
重新启动
sudo ./shutdown_watcher.sh restart
完全卸载
sudo ./shutdown_watcher.sh uninstall
- 配置文件修改(编辑脚本开头的配置区域:)
nano shutdown_watcher.sh
修改以下参数
ROUTER_IP="192.168.50.1" # 路由器IP
CHECK_INTERVAL=60 # 检测间隔(秒)
RETRY_COUNT=5 # 失败次数
修改后需要重新安装:
sudo ./shutdown_watcher.sh uninstall
sudo ./shutdown_watcher.sh install
- 快速检查工具
创建一个管理别名(可选):
cat >> ~/.bashrc << 'EOF'
alias watcher-status='sudo /usr/local/bin/shutdown_watcher.sh status'
alias watcher-logs='sudo /usr/local/bin/shutdown_watcher.sh logs'
alias watcher-restart='sudo /usr/local/bin/shutdown_watcher.sh restart'
EOF
source ~/.bashrc
示例1:查看监控状态
watcher-status
示例2:查看实时日志(按Ctrl+C退出)
watcher-logs
示例3:修改配置后重启服务
watcher-restart
示例4:组合使用 - 重启后立即查看日志
watcher-restart && sleep 2 && watcher-logs