Memo

步骤 1:创建 Bash 脚本

搞了个定时脚本来解决 PVE 下 OpenWRT 意外卡死的问题。 这个 OpenWRT 容器作为网络中的唯一主路由,所以用最简单的方法就是直接在宿主机上检查网络联通性来推测 OpenWRT 是不是寄了。 定时任务使用了 systemed timer 来实现,感觉确实不错 -(Systemd 定时器教程 - 阮一峰的网络日志 - pct(1) 步骤 1:创建 Bash 脚本 1. 创建脚本文件...

搞了个定时脚本来解决 PVE 下 OpenWRT 意外卡死的问题。

这个 OpenWRT 容器作为网络中的唯一主路由,所以用最简单的方法就是直接在宿主机上检查网络联通性来推测 OpenWRT 是不是寄了。

定时任务使用了 systemed timer 来实现,感觉确实不错

-(Systemd 定时器教程 - 阮一峰的网络日志

步骤 1:创建 Bash 脚本

  1. 创建脚本文件 /usr/local/bin/restart_openwrt_when_error.sh
sudo nano /usr/local/bin/restart_openwrt_when_error.sh
  1. 将以下内容粘贴到脚本文件中:
#!/bin/bash if [ -z "$1" ]; then echo -e "\e[31mUsage: $0 <LXC_ID>\e[0m" >&2 exit 1 fi LXC_ID=$1 RETRY_COUNT=3 RETRY_INTERVAL=5 fail_count=0 echo -e "\e[34mStarting network accessibility check for https://qq.com and https://baidu.com...\e[0m" for ((i=1; i<=RETRY_COUNT; i++)); do if curl -s --head --connect-timeout 10 https://qq.com/ > /dev/null || curl -s --head --connect-timeout 10 https://baidu.com/ > /dev/null; then echo -e "\e[32mNetwork is accessible.\e[0m" fail_count=0 break else
  1. 保存文件并退出编辑器。

  2. 赋予脚本执行权限:

sudo chmod +x /usr/local/bin/restart_openwrt_when_error.sh

步骤 2:创建 Systemd 服务文件

  1. 创建服务文件 /etc/systemd/system/restart_openwrt_when_error.service
sudo nano /etc/systemd/system/restart_openwrt_when_error.service
  1. 添加以下内容:
[Unit]
Description=Check network access and restart OpenWRT LXC if unreachable

[Service]
Type=oneshot
ExecStart=/usr/local/bin/restart_openwrt_when_error.sh 305
TimeoutStartSec=5min

<LXC_ID> 替换为实际的 LXC 容器 ID。

  1. 保存文件并退出编辑器。

步骤 3:创建 Systemd 定时器文件

  1. 创建定时器文件 /etc/systemd/system/restart_openwrt_when_error.timer
sudo nano /etc/systemd/system/restart_openwrt_when_error.timer
  1. 添加以下内容:
[Unit]
Description=Run restart_openwrt_when_error.service every 10 minutes

[Timer]
OnBootSec=3min
OnUnitActiveSec=10min
AccuracySec=1s
Persistent=false

[Install]
WantedBy=timers.target
  1. 保存文件并退出编辑器。

步骤 4:启用并启动服务和定时器

  1. 重新加载 Systemd 配置:
sudo systemctl daemon-reload
  1. 启用并启动定时器:
sudo systemctl enable restart_openwrt_when_error.timer
sudo systemctl start restart_openwrt_when_error.timer
  1. 检查定时器状态,以确保其正常运行:
sudo systemctl status restart_openwrt_when_error.timer

步骤 5:查看日志

  • 使用 journalctl 查看服务的日志输出,包括脚本的输出:
journalctl -u restart_openwrt_when_error.service