少女祈祷中...

起初

  • 本着废物利用的目的,把移动的电视盒子刷成了Armbian,然后在上面挂Alist。但我也是终究没有弄到公网IP,也就只能通过内网穿透来解决这个问题。

电视盒子配置

  • 型号:MGV2000 JZ(九州)
  • 处理器型号:s905l-b
    • 不确定,因为有部分人说是s905l2,但我之前看固件应该是s905-b(没错,-b指的就是有杜比)。
    • 但我刷armbian的时候刷的是s905l2的uboot,除了网络之外一切正常(没错,就是没网,包括有线,无线与蓝牙。我还因此买了个RJ45转USB-A来保证连接)。
    • 然而刷入s905l或者s905lb的dtb会无法启动。
    • 这部分有待更新(等有时间把散热片拿开看一眼)。

无人监管的初步_定时重启

  • 刚开始因为电视盒子所处环境的网络可能会周期性断开,所以我设置了每天0点自动重启。一开始还好,基本都能挂上,但越后面重启时间越久。刚开始以为是网络问题,重启一次可能不过,于是乎设置了每日两次重启。然而掉线的现象更加严重。
  • 在一次排查中发现,电视盒子在重启之后有一定几率会重启失败,系统就卡在那,包括HDMI输出都没。

定时重启设置

创建一个新的服务

  • /etc/systemd/system/目录创建一个服务,名字随便命名,这里为reboot

    1
    sudo vim /etc/systemd/system/reboot.service
  • 输入以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Unit]
    Description=Reboot Service

    [Service]
    Type=oneshot
    ExecStart=/sbin/reboot

    [Install]
    WantedBy=multi-user.target

设置一个新的定时器

  • 在与刚刚创建的reboot.service的同级目录创建一个定时器,随便命名,这里同样为reboot

    1
    sudo vim /etc/systemd/system/reboot.timer
  • 输入以下内容并保存。(每天的2:30重启)

    1
    2
    3
    4
    5
    6
    7
    8
    [Unit]
    Description=Reboot Timer

    [Timer]
    OnCalendar=*-*-* 02:30:00

    [Install]
    WantedBy=timers.target
  • 启动定时器

    1
    sudo systemctl enable --now reboot.timer
  • 查看时间表,如果不出意外的话会看到一个名为reboot.timer的服务会在02:30:00执行,然后截止日期为n/a

    1
    sudo systemctl list-timers

无人监管的进阶_看门狗

  • 因为重启可能导致的问题,我放弃了所有定时重启的选项,转而选择看门狗重启FRP服务。
  • 用看门狗进行无人监管的原理其实很简单,就是通过定时对内网穿透出来的地址做访问,成功就不管,失败就调用FRP自带的重启。

看门狗设置

安装看门狗和netcat

1
sudo apt install watchdog netcat-openbsd

编辑检测FRP状态的脚本

  • /usr/local/bin目录下创建一个名为check_frp.sh的文件。

    1
    vim /usr/local/bin/check_frp.sh
  • 写入以下内容并保存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/bin/bash

    # FRP服务器的域名与端口号
    FRP_SERVER="your.frp.server"
    FRP_PORT="7000"

    # 写入的日志文件路径
    LOG_FILE="/var/log/frp_watchdog.log"

    # 清理日志文件,保留最近3天的日志
    find $(dirname "$LOG_FILE") -name "$(basename "$LOG_FILE")" -type f -mtime +3 -exec rm {} \;


    # 记录脚本运行的时间
    echo "$(date): Running FRP watchdog script." >> $LOG_FILE


    # 检查FRP的连接
    if ! nc -zv $FRP_SERVER $FRP_PORT 2>&1 | grep -q 'succeeded'; then
    echo "$(date): FRP cannot connect to $FRP_SERVER:$FRP_PORT" >> $LOG_FILE
    # 重启FRP服务,注意修改配置文件路径
    pkill frpc
    /usr/local/bin/frpc -c /usr/local/bin/frpc.ini
    echo "$(date): FRP service restarted." >> $LOG_FILE
    # exit 1 # 返回非零值以通知watchdog
    else
    echo "$(date): FRP is running and connected to the server." >> $LOG_FILE
    fi

赋予脚本执行权限

1
sudo chmod +x /usr/local/bin/check_frp.sh

配置看门狗调用脚本

  • 编辑看门狗的配置文件

    1
    sudo vim /etc/watchdog.conf
  • 输入以下内容(文件本身有内容不用管,直接在最上面写入就是了。)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # Enable the watchdog daemon
    watchdog-device = /dev/watchdog

    # Interval between checks in seconds
    interval = 10

    # Max load average before watchdog triggers
    max-load-1 = 24

    # Watchdog will reboot system if load average remains high for this many seconds
    watchdog-timeout = 30

    # Run the custom script to check FRP status
    test-binary = /usr/local/bin/check_frp.sh

    # Exit watchdog if the test-binary returns 1, to trigger restart attempts
    # test-binary-exit-1 = yes
  • 启动看门狗并给予自启权限。

    1
    2
    3
    sudo systemctl start watchdog

    sudo systemctl enable watchdog
  • 查看看门狗状态

    1
    sudo systemctl status watchdog
  • 不出意外的话,如果断开FRP连接就会在指定目录生成日志文件。然后重启FRP服务。

参考文章