为VPS重装AlpineLinux并使用OpenRC平替Systemd

重装系统

使用reinstall脚本为VPS重装系统,脚本来自github.com/bin456789/reinstall,需要先下载脚本

1
2
3
4
5
6
7
8
9
10
11
# 国内服务器
curl -O https://cnb.cool/bin456789/reinstall/-/git/raw/main/reinstall.sh

# 国外服务器
curl -O https://raw.githubusercontent.com/bin456789/reinstall/main/reinstall.sh

# 给予脚本运行权限
chmod +x reinstall.sh

# 运行脚本
./reinstall.sh alpine

此时脚本会让你输入重装后的Root用户密码,自己设置即可,然后脚本执行完手动执行reboot重启,等待5分钟(时间长短与机房网络与配置有关),这个脚本非常好用,他会自己选择机房网络环境最近的镜像源,不需要操心网络环境问题

进程管理

需求描述

由于AlpineLinux的轻量化,纯净系统也只有100M,里面没有我们熟悉的systemd

我的需求是:

  • 开机自启
  • 便于管理
  • 随时查看日志和使用stdin

所以需要另辟蹊径,这个方法依赖tmux,请使用apk add tmux进行安装,这个脚本你可以当作一个像之前systemd一样的service配置文件,请把他重命名成你喜欢的,如:yunzai,文件不需要有后缀名,放入/etc/init.d/目录中,然后使用chmod +x /etc/init.d/yunzai给予脚本运行权限

配置脚本

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/sbin/openrc-run

description="YunzaiBot" # 进程描述

TMUX_BIN="/usr/bin/tmux" # 非必要不需要修改
SESSION_NAME="" # 进程名字
APP_DIR="/root/yunzai" # 工作目录
APP_COMMAND="node app" # 启动指令

CHECK_INTERVAL=5 # 秒,检测间隔
CHECK_LOOP_PID_FILE="/run/${SESSION_NAME}.checkloop.pid"

depend() {
need net
}

start() {
ebegin "Starting ${SESSION_NAME} (tmux session: ${SESSION_NAME})"

if ! ${TMUX_BIN} has-session -t "${SESSION_NAME}" 2>/dev/null; then
local cmd_to_run="cd ${APP_DIR} && ${APP_COMMAND}"
${TMUX_BIN} new-session -d -s "${SESSION_NAME}" "${cmd_to_run}"
fi

if ${TMUX_BIN} has-session -t "${SESSION_NAME}" 2>/dev/null; then
eend 0 "${SESSION_NAME} started successfully in tmux session '${SESSION_NAME}'."
else
eend 1 "Failed to start ${SESSION_NAME} tmux session '${SESSION_NAME}'."
return 1
fi

# 启动后台检测进程
if [ ! -f "${CHECK_LOOP_PID_FILE}" ] || ! kill -0 "$(cat ${CHECK_LOOP_PID_FILE})" 2>/dev/null; then
check_loop & echo $! > "${CHECK_LOOP_PID_FILE}"
einfo "Started background monitor for ${SESSION_NAME}."
fi
}

stop() {
ebegin "Stopping ${SESSION_NAME} (tmux session: ${SESSION_NAME})"

if ${TMUX_BIN} has-session -t "${SESSION_NAME}" 2>/dev/null; then
${TMUX_BIN} kill-session -t "${SESSION_NAME}"
fi

# 停止后台检测进程
if [ -f "${CHECK_LOOP_PID_FILE}" ]; then
kill "$(cat ${CHECK_LOOP_PID_FILE})" 2>/dev/null
rm -f "${CHECK_LOOP_PID_FILE}"
einfo "Stopped background monitor for ${SESSION_NAME}."
fi

eend 0
}

status() {
if ${TMUX_BIN} has-session -t "${SESSION_NAME}" 2>/dev/null; then
einfo "${SESSION_NAME} (tmux session '${SESSION_NAME}') is running."
return 0
else
einfo "${SESSION_NAME} (tmux session '${SESSION_NAME}') is not running."
return 1
fi
}

# 后台监控函数:如果 tmux 会话挂了,就重启
check_loop() {
while true; do
if ! ${TMUX_BIN} has-session -t "${SESSION_NAME}" 2>/dev/null; then
einfo "${SESSION_NAME} tmux session disappeared. Restarting..."
start
fi
sleep ${CHECK_INTERVAL}
done
}

command_user="root" # 运行用户

管理指令

请将yunzai更换为自己的文件名,运行后会自动在tmux中创建分离会话,你可以通过tmux ls来获取当前运行的会话,并且通过tmux a -t yunzai来打开会话,会话名和脚本设置的进程命一致

1
2
3
4
5
6
7
8
9
10
# 启动进程
rc-service yunzai start
# 停止进程
rc-service yunzai stop
# 重启进程
rc-service yunzai restart
# 将进程添加至开机自启
rc-update add yunzai
# 将进程从开启自启中删除
rc-update del yunzai

Tmux相关

指令

你需要有使用tmux的基础,如退出,分离会话,恢复会话这些基础指令

1
2
3
4
# 恢复会话
tmux a -t 会话名
# 创建会话(此脚本不需要这个,只需要了解即可)
tmux new-session -t 会话名

快捷键

快捷键 作用
Ctrl + D 关闭会话
Ctrl + B + D 分离会话(挂后台)
Ctrl + B 后输入`:set -g mouse on`可以使用鼠标上下滚动会话内容