1问:我似乎启动了多条frpc指令,如何停止未成功运行的,并配置自动开机执行,保证开机只有一条被成功执行?$ ps -ef|grep frpc

root 2726 2610 0 Sep08 pts/0 00:00:00 sudo /etc/frp/frp_0.56.0_lin ux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml
root 2727 2726 0 Sep08 pts/1 00:00:00 sudo /etc/frp/frp_0.56.0_lin ux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml
root 2728 2727 0 Sep08 pts/1 00:14:39 /etc/frp/frp_0.56.0_linux_am d64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml
zch 41477 41456 0 06:48 pts/2 00:00:00 grep --color=auto frpc

1答:

要停止未成功运行的 frpc 实例,并确保开机自动执行且只启动一条成功的 frpc 进程,您可以按照以下步骤进行操作:

1. 停止多余的 frpc 实例

首先,找到正在运行的 frpc 进程并终止它们:

sudo kill -9 2726 2727 2728

此命令会强制终止进程 ID 为 2726、2727 和 2728 的进程。您可以使用 ps -ef | grep frpc 检查是否有其他实例正在运行。

2. 配置 frpc 开机自动启动

为了保证开机时只启动一个成功的 frpc 进程,建议您使用 systemd 服务文件进行配置。

  1. 创建一个 frpc 服务文件:

    sudo nano /etc/systemd/system/frpc.service
  2. 在文件中添加以下内容:

    [Unit]
    Description=Frpc Service
    After=network.target
    
    [Service]
    ExecStart=/etc/frp/frp_0.56.0_linux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
  3. 保存并退出 nano 编辑器。

3. 启用和启动服务

启用服务,使其在开机时自动启动:

sudo systemctl enable frpc

启动服务:

sudo systemctl start frpc

4. 检查服务状态

您可以通过以下命令检查 frpc 服务的状态:

sudo systemctl status frpc

这样一来,每次开机时,只有一条 frpc 进程会被成功启动,并且如果进程失败,systemd 会自动重启它。

2问:我没执行sudo kill -9 2726 2727 2728,只执行了你给的下面一些指令,重启后发现远程连接不上了,我在内网重新连接后应该如何排查?

2答:

抱歉给您带来了不便。由于您没有终止之前的 frpc 进程,可能导致了服务冲突。下面我将指导您如何在内网环境下排查并解决问题。

1. 检查 frpc 服务的状态

首先,查看 frpc 服务的当前状态:

sudo systemctl status frpc

可能的情况:

  • 服务正在运行: 但可能有错误信息,需要进一步检查日志。
  • 服务未运行: 需要启动服务或检查配置问题。

2. 查看服务日志

使用以下命令查看 frpc 服务的详细日志:

sudo journalctl -u frpc -n 50

这将显示最近的 50 条日志,您可以查看是否有任何错误信息。

3. 检查服务文件配置

确保您的 /etc/systemd/system/frpc.service 文件配置正确。再次打开并检查:

sudo nano /etc/systemd/system/frpc.service

确认以下内容:

  • ExecStart 路径: 确保 frpc 可执行文件和配置文件的路径正确。
  • 权限问题: 确保 frpc 可执行文件具有执行权限。

示例:

[Unit]
Description=Frpc Service
After=network.target

[Service]
Type=simple
ExecStart=/etc/frp/frp_0.56.0_linux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml
Restart=on-failure

[Install]
WantedBy=multi-user.target

4. 检查 frpc 可执行文件权限

确保 frpc 文件具有可执行权限:

sudo chmod +x /etc/frp/frp_0.56.0_linux_amd64/frpc

5. 重新加载 systemd 并重启服务

在修改了服务文件后,需要重新加载 systemd 配置:

sudo systemctl daemon-reload

然后重启 frpc 服务:

sudo systemctl restart frpc

6. 检查是否有残留的 frpc 进程

由于之前没有终止旧的 frpc 进程,可能存在冲突。检查并终止所有运行中的 frpc 进程:

ps -ef | grep frpc

终止所有发现的 frpc 进程(除了 grep 命令本身):

sudo kill -9 <进程ID>

7. 确保配置文件正确

检查您的 frpc.toml 配置文件,确保配置正确,尤其是服务器地址、端口和认证信息。

sudo nano /etc/frp/frp_0.56.0_linux_amd64/frpc.toml

8. 手动运行 frpc 进行测试

在不使用服务的情况下,手动运行 frpc,以查看是否有错误提示:

sudo /etc/frp/frp_0.56.0_linux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml

观察终端输出,检查是否有错误信息。

9. 检查网络连接

确保您的机器能够连接到 frps 服务器,检查防火墙设置和网络连通性。

10. 检查端口占用

确认所需的端口没有被其他服务占用,使用以下命令:

sudo netstat -tulnp | grep <端口号>

如果以上步骤仍未解决问题,请将错误日志或提示信息分享出来,我会尽力帮助您进一步排查。

问:我把sudo /etc/frp/frp_0.56.0_linux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml重新运行了6-7次最终成功了,这是否说明是网络问题,如何才能让计算机自动重试直到成功呢?

答:

是的,您的描述表明 frpc 经过多次尝试后最终成功连接,可能确实是网络问题或瞬时的连接不稳定导致的连接失败。为了解决这种情况,您可以让计算机自动重试 frpc 进程,直到连接成功。以下是几种方法来实现自动重试:

方法 1: 修改 frpc 的配置进行重试

frpc 支持设置重试次数和间隔。您可以在 frpc.toml 中添加或修改以下选项,让 frpc 自动重试连接:

# 设置为 false,使得连接失败时 frpc 不会退出
login_fail_exit = false

# 每次连接失败后等待的秒数
login_fail_interval = 10

这将使得 frpc 在连接失败后不会退出,而是每隔 10 秒重试一次,直到连接成功。

方法 2: 使用 systemd 自动重启服务

如果您已经使用 systemd 来管理 frpc 服务,您可以通过配置 systemd 来让服务在失败时自动重启,直到成功。

  1. 编辑 frpc.service 文件:

    sudo nano /etc/systemd/system/frpc.service
  2. [Service] 段中添加或修改以下内容:

    [Service]
    ExecStart=/etc/frp/frp_0.56.0_linux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml
    Restart=always
    RestartSec=10  # 设置重启间隔为 10 秒
  3. 保存并退出文件后,重新加载 systemd 配置并重启服务:

    sudo systemctl daemon-reload
    sudo systemctl restart frpc

这个配置会让 frpc 在失败后每 10 秒自动重启一次,直到连接成功。

方法 3: 使用 Shell 脚本循环重试

如果您不想使用 systemd 或无法修改 frpc.toml 文件,您也可以使用一个简单的 Shell 脚本,让 frpc 在连接失败后自动重试:

  1. 创建一个脚本文件,例如 frpc_retry.sh

    sudo nano /usr/local/bin/frpc_retry.sh
  2. 添加以下内容:

    #!/bin/bash
    while true; do
        /etc/frp/frp_0.56.0_linux_amd64/frpc -c /etc/frp/frp_0.56.0_linux_amd64/frpc.toml
        if [ $? -eq 0 ]; then
            echo "FRPC started successfully"
            break
        else
            echo "FRPC failed to start, retrying in 10 seconds..."
            sleep 10
        fi
    done
  3. 保存文件并为其赋予可执行权限:

    sudo chmod +x /usr/local/bin/frpc_retry.sh
  4. 使用此脚本启动 frpc

    sudo /usr/local/bin/frpc_retry.sh

这个脚本会在连接失败时自动重试,每次间隔 10 秒,直到 frpc 成功启动。

总结

  • 使用 frpc 配置文件中的 login_fail_exit = falselogin_fail_interval 选项可以自动重试连接。
  • 使用 systemdRestart=always 选项可以让系统在 frpc 失败时自动重启服务。
  • 使用 Shell 脚本进行手动重试也是一种可靠的方法。

通过这些方式,您的 frpc 将能够在网络不稳定的情况下自动重试,直到连接成功。

发表评论