为了保持服务持续运行并且在崩溃后自动恢复, 我们可以通过 systemd
管理服务, 并结合监控脚本来确保服务不间断运行。
后台运行
使用 systemctl
我们通过 systemctl
来启动并管理服务, 确保服务能够开机启动。
编辑服务器配置文件 /lib/systemd/system/frps.service
[Unit]
Description=frp Server
After=network.target
[Service]
Type=simple
User=root
# 启动服务的命令 (此处写你的 frps 的实际安装目录)
ExecStart=/your/path/frps -c /your/path/frps.ini
[Install]
WantedBy=multi-user.target
客户端的配置与服务器端类似。可以通过 systemctl start frps
和 systemctl start frpc
启动服务
使用 screen
#!/bin/bash
screen_name=$"frpc"
cmd=$"/home/frp/frpc -c /home/frp/frpc.ini"
screen -dmS $screen_name
screen -x -S $screen_name -p 0 -X stuff "$cmd"
screen -x -S $screen_name -p 0 -X stuff $'\n'
监控服务
服务监控脚本
为了避免服务崩溃后需要手动重启, 我们可以编写监控脚本来实时检测服务状态, 如果服务停止则自动重启。
服务器端监控 frps
#!/bin/sh
ps -fe | grep frps | grep -v grep
if [ $? -ne 0 ]
then
echo "start process....."
systemctl start frps
else
echo "runing....."
fi
客户端端监控 frpc (基于 CentOS 7 测试)
#!/bin/bash
ps -fe | grep frp/frpc | grep -v grep
if [ $? -ne 0 ]; then
echo "start process....."
systemctl start frpc
else
echo "runing....."
fi
代码执行逻辑
ps -fe | grep frps | grep -v grep
-
ps -fe
会列出所有正在运行的进程及其详细信息 -
| grep frps
|
是管道符, 用于将前一个命令的输出传递给下一个命令grep frps
会从ps -fe
的输出中筛选出包含字符串frps
的行。即, 查找所有包含frps
进程名的进程
这一步的作用是过滤出所有包含
frps
进程名的行。如果frps
进程在运行, 它会显示该进程的相关信息 -
| grep -v grep
grep -v
是grep
的一个选项, 表示反向匹配, 即排除匹配到的行grep -v grep
会从前面的输出中排除掉包含grep
字符串的行。因为在执行grep
命令时,grep
本身也会被列出为一个进程, 所以这一步是用来过滤掉grep
命令本身的输出, 确保结果中只显示frps
进程
这条命令的目的是检查是否有名为 frps
的进程在运行。如果 frps
进程正在运行, ps -fe | grep frps
会返回进程信息, 然后通过 grep -v grep
排除掉包含 grep
本身的行, 最终只显示 frps
进程。如果没有找到 frps
进程, 返回的结果会为空, 并返回一个非 0 值。
$?
表示上一个命令的返回值-ne 0
表示返回值不等于 0, 表示命令执行失败, 也就是说frps
进程没有运行。-eq 0
表示返回值等于 0, 表示命令执行成功, 也就是说frps
进程正在运行。
定时监控
为了定期检测服务是否正常运行, 可以使用 cron
设置定时任务, 每一分钟执行一次监控脚本。
设置定时任务, 使用命令 crontab -e
*/1 * * * * sh /your/path/check_frp_status.sh
这样每分钟执行一次 check_frp_status.sh
脚本, 确保服务持续运行
客户端也要做相应处理。到此, 再也不用担心因内网穿透服务崩溃或中断带来的问题了!
原文