服务公告

服务公告 > 综合新闻 > frp - 自动化 实战技巧

frp - 自动化 实战技巧

发布时间:2026-05-01 10:01
frp内网穿透自动化:服务自启、进程守护与监控脚本实战,告别frp断线需要手动重启的烦恼。

一、前言

搞过frp的人都知道,最烦的不是配置,难的是frp客户端动不动就断线,断了你还得手动去重启服务。特别是机器多的时候,一个个登录去重启简直要命。本篇聊透frp自动化那点事,从systemd服务到进程守护脚本,一次性搞定。

二、操作步骤

步骤1:安装frp客户端

先确保frp客户端已经安装好,假设你已经在服务器上下载了对应版本的frp。

# 下载frp(以0.52.0版本为例,根据架构选择) # AMD64架构 wget https://github.com/fatedier/frp/releases/download/v0.52.0/frp_0.52.0_linux_amd64.tar.gz tar -xzf frp_0.52.0_linux_amd64.tar.gz cd frp_0.52.0_linux_amd64 # 将frp移动到系统目录 sudo mv frpc /usr/local/bin/ sudo mv frpc.ini /etc/frp/ sudo chmod +x /usr/local/bin/frpc

预期输出:

frpc.ini frpc_full.ini LICENSE systemd ./systemd/frpc.service frpc /usr/local/bin/frpc

步骤2:创建systemd服务单元文件(CentOS/RHEL)

在CentOS/RHEL系统下,创建标准的systemd服务文件来管理frpc。

sudo cat > /etc/systemd/system/frpc.service << 'EOF' [Unit] Description=Frp Client Service After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini Restart=on-failure RestartSec=5 TimeoutStartSec=10 TimeoutStopSec=10 [Install] WantedBy=multi-user.target EOF

预期输出:

# 执行后无输出,创建成功 # 验证文件内容 cat /etc/systemd/system/frpc.service [Unit] Description=Frp Client Service After=network.target [Service] Type=simple User=root ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini Restart=on-failure RestartSec=5 TimeoutStartSec=10 TimeoutStopSec=10 [Install] WantedBy=multi-user.target

步骤3:创建systemd服务单元文件(Ubuntu/Debian)

Ubuntu系统路径相同,但需要注意systemd版本兼容性。

# Ubuntu下同样的服务文件,但建议添加额外检查 sudo cat > /etc/systemd/system/frpc.service << 'EOF' [Unit] Description=Frp Client Service Documentation=https://github.com/fatedier/frp After=network-online.target Wants=network-online.target systemd-networkd-wait-online.service [Service] Type=simple User=root ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini ExecReload=/bin/kill -HUP $MAINPID Restart=on-failure RestartSec=5 LimitNOFILE=65536 # 安全加固 NoNewPrivileges=true ProtectSystem=strict ProtectHome=true ReadWritePaths=/etc/frp /var/log [Install] WantedBy=multi-user.target EOF

预期输出:

# 重载systemd配置 sudo systemctl daemon-reload # 设置开机自启 sudo systemctl enable frpc Created symlink /etc/systemd/system/multi-user.target.wants/frpc.service → /etc/systemd/system/frpc.service.

步骤4:编写自动重连监控脚本

⚠️ 警告:以下脚本会执行进程检查和重启操作,生产环境使用前请先在测试环境验证。

sudo cat > /usr/local/bin/frpc_monitor.sh << 'EOF' #!/bin/bash # frpc进程监控与自动重启脚本 # 建议通过cron定期执行:*/5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1 PROCESS_NAME="frpc" LOG_FILE="/var/log/frpc_monitor.log" FRPC_BIN="/usr/local/bin/frpc" FRPC_CONFIG="/etc/frp/frpc.ini" log_msg() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE } # 检查进程是否存在 if ! pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG" > /dev/null; then log_msg "frpc进程未运行,正在启动..." # 启动frpc $FRPC_BIN -c $FRPC_CONFIG >> /var/log/frpc.log 2>&1 & sleep 3 # 验证启动是否成功 if pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG" > /dev/null; then log_msg "frpc启动成功,PID: $(pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG")" else log_msg "frpc启动失败,请检查日志 /var/log/frpc.log" fi else log_msg "frpc进程运行正常,PID: $(pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG")" fi EOF sudo chmod +x /usr/local/bin/frpc_monitor.sh

预期输出:

# 测试脚本执行 sudo /usr/local/bin/frpc_monitor.sh # 查看日志 cat /var/log/frpc_monitor.log 2024-01-15 10:30:01 - frpc进程未运行,正在启动... 2024-01-15 10:30:04 - frpc启动成功,PID: 12345

步骤5:配置crontab定时任务

设置每5分钟执行一次监控脚本,实现自动检测和重启。

# 编辑crontab sudo crontab -e # 添加以下行(每5分钟检测一次) */5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1 # 或者直接追加 echo '*/5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1' | sudo tee -a /var/spool/cron/crontabs/root # 验证crontab配置 sudo crontab -l

预期输出:

# crontab -l 输出 # Edit this file to introduce tasks to be run by cron. # # /etc/crontab: system-wide crontab ... */5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1

步骤6:启动服务并验证状态

完成所有配置后,启动frpc服务并验证运行状态。

# 启动frpc服务 sudo systemctl start frpc # 查看服务状态 sudo systemctl status frpc

预期输出:

● frpc.service - Frp Client Service Loaded: loaded (/etc/systemd/system/frpc.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2024-01-15 10:35:00 CST; 5s ago Main PID: 12888 (frpc) Tasks: 5 (limit: 4915) Memory: 8.5M CPU: 112ms CGroup: /system.slice/frpc.service └─12888 /usr/local/bin/frpc -c /etc/frp/frpc.ini Jan 15 10:35:00 server systemd[1]: Started Frp Client Service.
# 查看frpc进程 ps aux | grep frpc root 12888 0.0 0.2 12345 6789 ? S 10:35 0:00 /usr/local/bin/frpc -c /etc/frp/frpc.ini # 查看端口监听(假设配置了SSH穿透) netstat -tlnp | grep frpc tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 12888/frpc

步骤7:配置日志轮转防止磁盘占满

日志文件会不断增长,需要配置logrotate进行自动轮转。

# 创建logrotate配置 sudo cat > /etc/logrotate.d/frpc << 'EOF' /var/log/frpc.log /var/log/frpc_monitor.log { daily missingok rotate 7 compress delaycompress notifempty create 0644 root root sharedscripts postrotate systemctl reload frpc > /dev/null 2>&1 || true endscript } EOF

预期输出:

# 测试logrotate配置 sudo logrotate -d /etc/logrotate.d/frpc

验证后会显示模拟执行的日志轮转操作,确认配置正确后正式生效。

三、常见问题FAQ

Q1:frpc进程在后台运行,但systemctl status显示failed怎么办?

这种情况一般是配置文件中存在语法错误或者端口被占用。先别急着重启,直接看日志:

# 查看详细错误信息 sudo journalctl -u frpc -n 50 --no-pager # 常见原因排查 # 1. 检查端口占用 sudo netstat -tlnp | grep <端口号> # 2. 检查配置文件语法 /usr/local/bin/frpc -c /etc/frp/frpc.ini --check

Q2:监控脚本检测不到frpc进程,但ps明明能看到?

pgrep匹配的问题,你的frpc启动参数和脚本里写的不一致就会匹配失败。改用更宽松的匹配方式:

# 把这行: if ! pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG" > /dev/null; then # 改成这样: if ! pgrep -f "frpc" > /dev/null; then

或者直接用pgrep不带任何参数,只要进程名包含frpc就能匹配到。

Q3:服务器重启后frpc没自启,什么情况?

先确认enable过没有,别以为配置了service文件就自动enable了:

# 检查是否enable systemctl is-enabled frpc # 如果没enable,执行 systemctl enable frpc # 如果enable了还是不启动,检查network依赖是否正确 systemctl list-dependencies frpc

有些云服务器网络服务启动慢,frpc配置了After=network.target可能等不到网络就启动失败了,建议改成After=network-online.target。

Q4:如何实现frpc配置热重载不用重启服务?

新版frpc支持热重载SIGHUP信号,直接改配置文件然后发信号:

# 修改配置后,执行 sudo kill -HUP $(pgrep frpc) # 查看输出确认重载成功 sudo journalctl -u frpc --no-pager -n 10

四、总结

frp自动化核心三板斧:systemd服务管理+监控脚本+cron定时检测。搞完这套,frp断线你自己都不知道什么时候断的,系统自己就拉起来了。要点记住:服务文件配置Restart=on-failure是灵魂,监控脚本匹配进程别太严格,日志轮转一定要配不然磁盘早晚会满。

延伸阅读:

上一篇: HAProxy - 健康检查 新手入门教程

已经是最后一篇啦!