{{i18nTranslate('_layout.t11')}} {{i18nGetLang()==='zh' ? 'EN' : '中文'}}

# 常用命令

在执行命令的时候请使用完整的路径或者使用相对路径，如：

    /$EdgeNode安装目录/bin/edge-node -v

或者：

    cd /$EdgeNode安装目录
    bin/edge-node -v

如果使用的是GoEdge远程安装的节点，安装目录默认在 `/$ssh用户名/edge-node/edge-node`，请将其中的`$ssh用户名`换成你实际使用的用户名，比如`root`。

从GoEdge v1.2.7以后，节点初次启动后（`edge-node start`）后，会在系统里自动生成软链接：创建文件 `/usr/bin/edge-node`，以后可以执行使用`edge-node xxx`命令执行。

> 注意：如果提示命令找不到 `Unknown command: edge-node`，说明你没有指定命令所在目录，请在命令执行时使用完整的路径或者使用相对路径，参考本文开始说明。

> 注意：如果是使用非 root 用户执行命令，你需要使用 `sudo` 执行大部分命令，比如 `sudo bin/edge-node conns` 。

## 打印帮助信息

    edge-node -h

## 打印版本信息

    edge-node -v

## 启动服务

启动服务并在后台运行：

    edge-node start

如果要在前端启动服务，并阻塞当前进程，可以使用：

    edge-node

## 测试服务

可以用下面命令检查服务是否可以正常工作：

    edge-node test

## 停止服务

    edge-node stop

对于集群中开启了systemd服务的（默认是开启状态），可以使用以下命令停止节点：

    systemctl stop edge-node

## 优雅退出

    edge-node quit

## 重启服务

    edge-node restart

## 查看服务状态

    edge-node status

## 重载节点配置

在v0.4.5中加入。

    edge-node reload

## 安装systemd系统服务

安装系统服务后，系统重新启动的时候，会自动启动 `edge-node` 进程。使用此命令的前提是系统已经安装并启用了 `systemd` 服务。可以通过 `systemctl --system` 命令来确认 `systemd` 服务是否在正常运行。

    edge-node service

## 使用守护进程启动服务

自动安装的edge-node会自动启动一个守护进程，手动启动的时候也可以通过 `daemon` 参数来启动守护进程。当守护进程在运行时，`edge-node` 进程在遇到故障意外退出时，守护进程可以立即启动一个新的 `edge-node` 进程，保障服务不会长时间宕机。

    edge-node daemon

## 调试

### 开启pprof

从v0.2.0开始，可以使用以下命令开启pprof模式，用来监控节点运行性能信息：

    edge-node pprof

默认pprof地址为`127.0.0.1:6060`，可以使用 `--addr` 指定地址（从v0.5.0开始）：

    edge-node pprof --addr="192.168.1.100:6060"

启动后可以在浏览器上访问这个地址，比如 `http://127.0.0.1:6060/debug/pprof/` ，或者使用`go tool pprof`命令来查看，比如查看所有alloc的heap信息：

    go tool pprof -alloc_space  "http://127.0.0.1:6060/debug/pprof/heap"

查看正在使用的内存空间：

    go tool pprof -inuse_space  "http://127.0.0.1:6060/debug/pprof/heap"

查看CPU调用信息：

    go tool pprof  "http://127.0.0.1:6060/debug/pprof/profile"

查看当前正在运行的goroutine：

    go tool pprof "http://localhost:6060/debug/pprof/goroutine"

还有更多的示例可以参考 https://jvns.ca/blog/2017/09/24/profiling-go-with-pprof/。

### 打印正在运行的任务

    edge-node trackers

### 打印正在运行的goroutine

    edge-node goman

### 打印连接数

    edge-node conns

### 强制执行内存回收

默认2分钟回收一次运行时内存，使用此命令可以强制立即执行回收。此命令跟内存缓存无关。

    edge-node gc

## 防火墙相关

目前支持的本地防火墙：

- Firewalld，v0.4.0加入
- nftables，v0.4.7加入

### 在本地防火墙中丢弃数据包

从v0.4.0开始。

    # 丢弃来自 192.168.1.100 的数据包
    edge-node ip.drop 192.168.1.100

    # 丢弃来自 192.168.1.100 的数据包，有效期 30 秒
    edge-node ip.drop 192.168.1.100 --timeout=30

### 在本地防火墙中拒绝连接

从v0.4.0开始。

    # 拒绝来自 192.168.1.100 的连接
    edge-node ip.reject 192.168.1.100

    # 拒绝来自 192.168.1.100 的连接，有效期 30 秒
    edge-node ip.reject 192.168.1.100 --timeout=30

### 在本地防火墙中删除已有的IP

从v0.4.0开始。

    # 删除我们使用 ip.drop 和 ip.reject 添加的IP
    edge-node ip.remove 192.168.1.100

### 关闭某个IP所有连接

从v0.6.0开始。

    # 关闭来自 192.168.1.100 的所有连接
    edge-node ip.close 192.168.1.100

## 本地查询访问日志

从v0.4.8开始，可以在本地使用命令查询访问日志（前提是网站中已经启用了访问日志）：

    edge-node accesslog

如果有访问时会出现类似以下输出：

    1.2.3.4 [1/May/2024:19:28:08 +0800] "GET https://example.com/html HTTP/1.1" 200 83 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.82ms
    1.2.3.4 [1/May/2024:19:28:08 +0800] "GET https://example.com/favicon.ico HTTP/1.1" 200 12 "https://example.com/html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 1.22ms
    1.2.3.4 [1/May/2024:19:28:10 +0800] "GET https://example.com/html HTTP/1.1" 304 0 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.80ms
    1.2.3.4 [1/May/2024:19:28:10 +0800] "GET https://example.com/favicon.ico HTTP/1.1" 200 12 "https://example.com/html" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.55ms
    1.2.3.4 [1/May/2024:19:28:12 +0800] "GET https://example.com/ HTTP/1.1" 200 1 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 1.09ms
    1.2.3.4 [1/May/2024:19:28:12 +0800] "GET https://example.com/favicon.ico HTTP/1.1" 200 12 "https://example.com/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36" - 0.55ms
    1.2.3.4 [1/May/2024:19:28:24 +0800] "GET https://example.com/ HTTP/1.1" 200 1 "" "curl/8.4.0" - 1.38ms

格式为：

    ${remoteAddr} - [${timeLocal}] "${requestMethod} ${requestURI} ${proto}" ${status} ${bytesSent} "${referer}" "${userAgent}" - ${requestTime}

其中：

- `${remoteAddr}` - 访客IP地址
- `${timeLocal}` - 服务器所在本地时间
- `${requestMethod}` - 请求方法，比如`GET`、`POST`
- `${requestURI}` - 请求URI
- `${proto}` - 包含版本的HTTP请求协议，类似于HTTP/1.1
- `${status}` - 响应状态码，比如`200`
- `${bytesSent}` - 发送的内容长度
- `${referer}` - 请求来源，v1.3.9中加入
- `${userAgent}` - 客户端UserAgent，v1.3.9中加入
- `%{requestTime}` - 处理请求花费时间，单位为`ms`

可以使用管道符（`|`）筛选访问日志：

    edge-node accesslog | grep "css"

输出类似于：

    root@vm # bin/edge-node accesslog | grep "css"
    1.2.3.4 [15/Jun/2022:11:18:41 +0800] "GET https://goedge.cloud/_/@default/@layout.css.map HTTP/2.0" 200 - 0.93ms
    1.2.3.4 [15/Jun/2022:11:18:41 +0800] "GET https://goedge.cloud/_/@default/docs/index.css.map HTTP/2.0" 200 - 0.81ms

可以使用重定向符号（`>`）将访问日志输出到文件中：

    edge-node accesslog > accesslog.log

如果要在后台执行，在命令后面加入`&`符号：

    edge-node accesslog > accesslog.log &

## 测试硬盘写入速度

从GoEdge v1.2.4开始，可以在本地使用命令测试硬盘写入速度（目前无法区分不同的分区）：

    edge-node disk speed

## 卸载

从GoEdge v1.2.7开始，可以使用命令卸载一个节点程序：

    edge-node uninstall

卸载成功后，会自动删除`edge-node`相关服务、目录、文件等。

卸载后，并不会删除缓存策略使用的缓存目录，如有必要，你需要手工删除；如果有遗留的`edge-node`进程，可以使用 `kill 对应进程ID` 来停止。

## 清除垃圾缓存文件

从GoEdge v1.2.9开始，可以使用以下命令来清理垃圾缓存文件（指的是跟索引失去关联的缓存文件）：

    # 统计垃圾缓存文件
    edge-node cache.garbage

    # 统计并删除垃圾缓存文件
    edge-node cache.garbage --delete

## 配置节点

从GoEdge v1.3.3开始，可以使用以下命令配置节点：

    edge-node config '
                    rpc.endpoints: [ "http://192.168.2.1:8003" ]
                    nodeId: "a186380dbd26ccd49e75d178ec59df1b"
                    secret: "VOqilMFo62MsxgL8XlNFbmYFKgkkfboH"
                    '

其中的配置内容（`rpc.endpoints`等）可以在”节点详情“ – “安装节点“界面获得。

执行后，会自动创建或覆盖 `configs/api_node.yaml` 中的配置。

## 执行top命令

从GoEdge v1.3.9开始，可以使用 `top` 命令调用系统的 `top` 命令并传入edge-node进程PID，以方便我们调试：

    edge-node top

{{i18nTranslate('_layout.t27')}}
{{i18nTranslate('_layout.t12')}}