之前

我在serv00上部署了alist后(可以看看我的这篇文章拥有自己第一个免费Alist),总是会遇见服务正常运行后一个星期左右就莫名奇妙自动停机的问题,返502错误。我一开始以为这是因为serv00一段时间没有访问后就会自动停机,就用了uptimerobot来持续访问以保活,但这仍然没有解决问题,后来才发现需要一段时间内有ssh连接或登入控制面板的操作(render的五分钟停机是因为没有访问,看起来是陷入了解决那个问题时的思维惯性啊)

停机时如图所示:

502.png

所以?

我决定写一个脚本来完成自动保活操作,毕竟我懒的无可救药,要是我有这个精力登录控制面板也不至于停机。

准备工作

检查了一下serv00上freebsd的软件配置,正好有sshpass能够帮助我们自动输入密码,那么直接开干!

脚本

进入alist启动目录,使用vim编辑以下脚本(不要照抄变量!)。什么?你不会用vim?那么看看vim教程吧。

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/sh
# 请勿照抄变量!
SSH_USER="你的用户名" # SSH用户名
SSH_HOST="你的主机名,如s1.serv00.com" # SSH主机名
SSH_PORT="22" # SSH端口,默认为22
INTERVAL=3600 # 每次重试之间的间隔时间(秒),即1小时
LOG_FILE="keeper.log" # 日志文件路径
ALIST_STOP_CMD="./alist stop" # 停止alist的命令
ALIST_START_CMD="./alist start" # 启动alist的命令
SSH_PASSWORD="你的ssh密码" # SSH密码,请谨慎处理
LOCK_FILE="keeper.lock" #锁文件路径,防止同时启动多个脚本

# 函数:写入日志
log_message() {
echo "$(date +"%Y-%m-%d %H:%M:%S") - $1" >> "$LOG_FILE"
}

# 函数:检查alist是否在运行
is_alist_running() {
pgrep -x "alist" > /dev/null
return $?
}

# 使用flock确保只有一个实例运行
(
flock -n 9 || { log_message "Another instance is running, exiting."; exit 1; }

# 主循环
while true; do
# 检查alist是否在运行,如果不是,则启动它
if ! is_alist_running; then
log_message "Alist is not running. Starting alist..."
$ALIST_STOP_CMD
$ALIST_START_CMD
sleep 10 # 等待几秒钟,给alist启动的时间
if is_alist_running; then
log_message "Alist has been started successfully."
else
log_message "Failed to start alist."
fi
else
log_message "Alist is already running."
fi

# 尝试通过SSH连接,使用sshpass自动输入密码
if sshpass -p "$SSH_PASSWORD" ssh -p $SSH_PORT -o ConnectTimeout=10 $SSH_USER@$SSH_HOST "echo 'Keep-alive'"; then
log_message "Successfully connected to $SSH_HOST for keep-alive."
else
log_message "Failed to connect to $SSH_HOST for keep-alive."
fi

# 确保每次循环后等待一个小时
sleep $INTERVAL
done
) 9>"$LOCK_FILE"

然后

运行以下命令连接到主机的ssh,并按y允许密钥格式方面的问题,这一过程是为了防止接下来的自动化环境中遇到这个确认,出现密码输入栏后可直接退出:

1
ssh <你的用户名>@<你的主机名>

授予脚本执行权限:

1
chmod +x keeper.sh

再运行以下命令即可启动:

1
2
nohup ./keeper.sh &
# nohup用于记录日志,&使脚本在后台运行

注意

在脚本中硬编码密码会带来一些潜在的安全问题,请务必注意。