Apache SkyWalking 常用 CLI 命令与工具详解

本文详解 Apache SkyWalking 9.7.0 的常用命令与工具,覆盖 bin 目录启动脚本、GraphQL 查询接口 curl 实测、Java Agent 参数与三种接入方式、日志检索与 systemd 运维命令,所有命令与回显均经真实环境实测,可直接照做。

Apache SkyWalkingApache SkyWalking2026/10/12

Apache SkyWalking 常用 CLI 命令与工具详解

目标:详解 Apache SkyWalking 9.7.0 的常用命令行工具——bin 目录启动脚本、GraphQL 查询接口的 curl 实测、Java Agent 参数与接入方式、日志检索与 systemd 运维命令。已在 Ubuntu 22.04.5 LTS 环境实测通过,命令输入与回显逐行照抄。

一、环境信息

项目值
操作系统Ubuntu 22.04.5 LTS
SkyWalking 主发行版apache-skywalking-apm-9.7.0(安装于 /opt/skywalking)
Java Agent9.8.0(安装于 /opt/skywalking-agent)
JDKOpenJDK 17.0.20.1
运行形态OAP 与 UI 以 systemd 服务运行(skywalking-oap.service、skywalking-ui.service)
被观测服务tomcat-demo(端口 18080)、tomcat-demo2(端口 19180),已接入 Agent
端口11800(gRPC 上报)、12800(REST/GraphQL)、8080(UI)
JVM 堆OAP 与 UI 实测均为 -Xms256m -Xmx512m

二、工具概览

工具位置用途
oapService.sh/opt/skywalking/bin/启动 OAP 后端
webappService.sh/opt/skywalking/bin/启动 Web UI
startup.sh/opt/skywalking/bin/串联调用上述两个脚本
oapServiceInit.sh / oapServiceNoInit.sh/opt/skywalking/bin/带 mode 参数的 OAP 启动变体
curl系统自带调用 OAP 的 GraphQL 查询接口
jpsJDK 自带列出 Java 进程与主类
ssiproute2 包核查 11800/12800/8080 端口监听
pgrep + /procprocps 包核查进程实际生效的启动参数
systemctl / journalctl系统自带服务托管与单元日志
日志文件/opt/skywalking/logs/OAP 与 UI 的运行日志

三、前置条件

  1. SkyWalking 9.7.0 已解压至 /opt/skywalking,Java Agent 已解压至 /opt/skywalking-agent;
  2. OAP 与 UI 正在运行。可用下面两条命令独立确认(与后文所有命令无关,直接可执行):
curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' -d '{"query":"{ version }"}'
{"data":{"version":"9.7.0-066457b"}}
ss -tlnp | grep -E '11800|12800|8080'
LISTEN 0      4096               *:12800            *:*    users:(("java",pid=7496,fd=2781))
LISTEN 0      4096               *:11800            *:*    users:(("java",pid=7496,fd=2777))
LISTEN 0      4096               *:8080             *:*    users:(("java",pid=7671,fd=88))
  1. 依赖包已安装:openjdk-17-jdk-headless(含 jps)、iproute2(含 ss)、procps(含 pgrep)、curl。

四、bin 启动脚本详解

4.1 脚本清单

ls /opt/skywalking/bin
oapService.bat
oapService.sh
oapServiceInit.bat
oapServiceInit.sh
oapServiceNoInit.bat
oapServiceNoInit.sh
startup.bat
startup.sh
webappService.bat
webappService.sh

Linux 服务器使用 .sh 脚本,.bat 为 Windows 侧对应版本。五个 shell 脚本均为前台执行型:脚本末行以 exec 方式将自身进程替换为 java 进程,标准输出被丢弃(1>/dev/null),标准错误分别重定向到 logs/oap.log 或 logs/webapp-console.log。

4.2 oapService.sh:启动 OAP

脚本行为要点(源自脚本源码):

要点说明
安装目录推导未设置 OAP_HOME 时按脚本位置自动推导为 bin 的上级目录
日志目录未设置 OAP_LOG_DIR 时使用安装目录下 logs,目录不存在会自动创建
JVM 参数读取环境变量 JAVA_OPTS,未设置时默认 -Xms256M -Xmx4096M
类路径安装目录 config 与 oap-libs 下全部 jar
主类org.apache.skywalking.oap.server.starter.OAPServerStartUp

启动命令(显式覆盖堆参数,后台运行):

export JAVA_OPTS='-Xms256M -Xmx512M'
nohup /opt/skywalking/bin/oapService.sh > /tmp/oap-start.out 2>&1 &

执行后终端立即返回且无脚本输出,属设计行为(标准输出被脚本丢弃)。确认进程真实启动:

cat /proc/$(pgrep -f 'OAPServerStartU[p]' | head -1)/cmdline | tr '\0' '\n' | grep -E 'Xms|Xmx'
-Xms256m
-Xmx512m

说明:pgrep 模式写成 OAPServerStartU[p](方括号正则)是为了避免 pgrep 命中执行命令的 shell 自身,后文同。

4.3 webappService.sh:启动 Web UI

脚本行为要点:未设置 WEBAPP_HOME 时按脚本位置推导安装目录;日志目录由 WEBAPP_LOG_DIR 控制,默认安装目录下 logs;JVM 参数同样走 JAVA_OPTS,未设置时默认 -Xms256M -Xmx1024M 并附加 -Dwebapp.logDir 指定日志目录;主类为 org.apache.skywalking.oap.server.webapp.ApplicationStartUp,类路径为 webapp/skywalking-webapp.jar 与 webapp 目录。

export JAVA_OPTS='-Xms256M -Xmx512M'
nohup /opt/skywalking/bin/webappService.sh > /tmp/webapp-start.out 2>&1 &

启动后核查堆参数与端口:

cat /proc/$(pgrep -f 'ApplicationStartU[p]' | head -1)/cmdline | tr '\0' ' ' | grep -oE '\-Xms256m -Xmx512m'
-Xms256m -Xmx512m
ss -tlnp | grep 8080
LISTEN 0      4096               *:8080             *:*    users:(("java",pid=7671,fd=88))

4.4 startup.sh:一体化脚本与前台阻塞特性

脚本仅两行有效调用:先执行 oapService.sh,再执行 webappService.sh。由于两个脚本都是前台 exec 型,直接运行 startup.sh 会阻塞在 OAP 前台进程上,UI 启动行不会被执行到。实测验证:

timeout 6 /opt/skywalking/bin/startup.sh
exit=124

6 秒内命令未返回(timeout 以退出码 124 终止),期间无任何输出。结论:

  1. startup.sh 适合交给 systemd、supervisor 等托管工具在前台拉起单个 OAP 进程;
  2. 需要 OAP 与 UI 同时启动时,分别前台运行两个脚本(如分别由两个 systemd 单元托管),不要依赖 startup.sh。

4.5 oapServiceInit.sh 与 oapServiceNoInit.sh

两个变体脚本与 oapService.sh 的唯一差别是启动时附加系统属性:

脚本附加参数场景
oapServiceInit.sh-Dmode=init首次接入 Elasticsearch 等外部存储前,仅完成存储初始化后退出
oapServiceNoInit.sh-Dmode=no-init明确以不初始化模式启动
oapService.sh无默认启动,日常使用

默认 H2 内置存储无需 init,两个变体仅在外部存储首次接入时使用。

4.6 堆参数生效的两种核查方式

方式一,/proc 文件(见 4.2、4.3 节命令)。方式二,jps:

jps -v | grep -E 'OAPServerStartUp|ApplicationStartUp' | grep -oE ' -Xms256m -Xmx512m'
 -Xms256m -Xmx512m
 -Xms256m -Xmx512m

两行分别对应 OAP 与 UI 进程,说明脚本 JAVA_OPTS 默认值已被显式覆盖。systemd 托管时堆参数写在单元文件 Environment 中,值含空格必须加双引号,否则 systemd 把空格解析为变量分隔符,进程实际只带前半个参数。

五、OAP GraphQL 查询接口 curl 实测

5.1 接口入口与 version 探活

OAP 的 12800 端口提供 GraphQL 查询协议,统一入口为 POST /graphql,请求体为 JSON,查询语句放在 query 字段。探活命令:

curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' -d '{"query":"{ version }"}'
{"data":{"version":"9.7.0-066457b"}}

UI 在 8080 端口也提供同样的 GraphQL 代理,防火墙只放行 8080 时查询不受影响:

curl -s -X POST http://localhost:8080/graphql -H 'Content-Type: application/json' -d '{"query":"{ version }"}'
{"data":{"version":"9.7.0-066457b"}}

5.2 服务与 Endpoint 查询

查询时间窗口内的全部服务(Duration 的 step 为 DAY 时 start/end 写日期):

curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' \
  -d '{"query":"query ($duration: Duration!) { getAllServices(duration: $duration) { id name } }","variables":{"duration":{"start":"2026-10-12","end":"2026-10-12","step":"DAY"}}}'
{"data":{"getAllServices":[{"id":"dG9tY2F0LWRlbW8y.1","name":"tomcat-demo2"},{"id":"dG9tY2F0LWRlbW8=.1","name":"tomcat-demo"}]}}

按服务 ID 与关键字查询 Endpoint:

curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' \
  -d '{"query":"query ($serviceId: ID!, $keyword: String!, $limit: Int!) { searchEndpoint(keyword: $keyword, serviceId: $serviceId, limit: $limit) { id name } }","variables":{"serviceId":"dG9tY2F0LWRlbW8=.1","keyword":"/","limit":10}}'
{"data":{"searchEndpoint":[{"id":"dG9tY2F0LWRlbW8=.1_R0VUOi9wcm94eTIuanNw","name":"GET:/proxy2.jsp"}]}}

5.3 Trace 查询

查询指定服务的 Trace 列表,列表查询、详情查询、指标查询的入参名统一为 condition:

curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' \
  -d '{"query":"query ($serviceId: ID!, $duration: Duration!) { queryBasicTraces(condition: {serviceId: $serviceId, queryDuration: $duration, traceState: ALL, queryOrder: BY_DURATION, paging: {pageNum: 1, pageSize: 3}}) { traces { segmentId endpointNames start duration isError } } }","variables":{"serviceId":"dG9tY2F0LWRlbW8=.1","duration":{"start":"2026-10-12","end":"2026-10-12","step":"DAY"}}}'
{"data":{"queryBasicTraces":{"traces":[{"segmentId":"ed408ab69ba441a083c38aadbb8fd85d.43.17917744749040000","endpointNames":["GET:/proxy2.jsp"],"start":"1791774474904","duration":8,"isError":false}]}}}

5.4 拓扑与指标查询

全局拓扑(节点与调用关系):

curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' \
  -d '{"query":"query ($duration: Duration!) { getGlobalTopology(duration: $duration) { nodes { id name } calls { source target } } }","variables":{"duration":{"start":"2026-10-12","end":"2026-10-12","step":"DAY"}}}'
{"data":{"getGlobalTopology":{"nodes":[{"id":"VXNlcg==.0","name":"User"},{"id":"dG9tY2F0LWRlbW8=.1","name":"tomcat-demo"},{"id":"dG9tY2F0LWRlbW8y.1","name":"tomcat-demo2"}],"calls":[{"source":"VXNlcg==.0","target":"dG9tY2F0LWRlbW8=.1"},{"source":"VXNlcg==.0","target":"dG9tY2F0LWRlbW8y.1"}]}}}

单服务指标(service_cpm 为每分钟请求数,天粒度窗口返回逐日值):

curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' \
  -d '{"query":"query ($duration: Duration!) { readMetricsValues(condition: {name: \"service_cpm\", entity: {scope: Service, serviceName: \"tomcat-demo\", normal: true}}, duration: $duration) { label values { values { id value } } } }","variables":{"duration":{"start":"2026-10-12","end":"2026-10-12","step":"DAY"}}}'
{"data":{"readMetricsValues":{"label":null,"values":{"values":[{"id":"service_cpm_20261012_dG9tY2F0LWRlbW8=.1","value":0}]}}}}

5.5 类型内省与错误返回排查

GraphQL 支持内省查询,用它确认枚举取值而无需翻文档(查询排序枚举 QueryOrder):

curl -s -X POST http://localhost:12800/graphql -H 'Content-Type: application/json' \
  -d '{"query":"{ __type(name: \"QueryOrder\") { enumValues { name } } }"}'
{"data":{"__type":{"enumValues":[{"name":"BY_START_TIME"},{"name":"BY_DURATION"}]}}}

查询了不存在的字段时,返回 errors 数组并指明字段与位置,可用于校对查询语句:

{"errors":[{"message":"Validation error (FieldUndefined@[noSuchField]) : Field 'noSuchField' in type 'Query' is undefined","locations":[{"line":1,"column":3}],"extensions":{"classification":"ValidationError"}}]}

5.6 查询协议要点

  1. Duration 格式必须与 step 匹配:DAY 对应 yyyy-MM-dd,MINUTE 对应 yyyy-MM-dd HHmm(四位小时分钟);DAY 窗口混入时间部分会直接报 Invalid format;
  2. queryBasicTraces、queryTrace、readMetricsValues 的入参名均为 condition;
  3. 分页对象 Pagination 无 needTotal 字段,Trace 列表返回体无 total 字段,取值直接读 traces 数组;
  4. Agent 批量上报约 30 秒一批,OAP 落库周期 25 秒,刚接入的服务需等待约 1 分钟再查询。

六、Java Agent 参数与启动方式

6.1 方式一:JVM 启动参数(-javaagent 与 -D 覆盖)

被观测服务以 -javaagent 挂载 Agent,并用 -D 系统属性覆盖服务名与后端地址。以 tomcat9 为例(/etc/default/tomcat9):

JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
JAVA_OPTS="-Djava.awt.headless=true -Xms256m -Xmx512m -javaagent:/opt/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=tomcat-demo -Dskywalking.collector.backend_service=127.0.0.1:11800"

tomcat9 启动后,核查进程实际参数(pgrep 自排除写法):

cat /proc/$(pgrep -f 'catalina.startup.Bootstra[p]' | head -1)/cmdline | tr '\0' '\n' | grep -E 'javaagent|service_name' | head -2
-javaagent:/opt/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=tomcat-demo

Agent 挂载成功后,进程控制台或 Agent 日志出现固定启动序列(实测):

INFO SnifferConfigInitializer : Config file found in /opt/skywalking-agent/config/agent.config.
INFO SkyWalkingAgent : Skywalking agent transformer has installed.
INFO Version : SkyWalking agent version: 9.8.0-805f941

6.2 方式二:操作系统环境变量覆盖

agent.config 中每个配置项都定义了同名环境变量占位,优先级高于配置文件默认值。服务名与后端地址对应的环境变量为 SW_AGENT_NAME 与 SW_AGENT_COLLECTOR_BACKEND_SERVICES。实测:为演示程序(一个每 3 秒发起 HTTP 调用的自编 Java 类,任意 Java 服务同理)携带环境变量启动,不修改任何配置文件:

SW_AGENT_NAME=env-demo SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 \
  java -javaagent:/opt/skywalking-agent/skywalking-agent.jar DemoApp18180

进程运行约 1 分钟后查询服务列表,环境变量指定的新服务名已注册:

{"data":{"getAllServices":[{"id":"dG9tY2F0LWRlbW8y.1","name":"tomcat-demo2"},{"id":"dG9tY2F0LWRlbW8=.1","name":"tomcat-demo"},{"id":"ZW52LWRlbW8=.1","name":"env-demo"}]}}

注意:服务注册由 Agent 心跳周期驱动(collector.heartbeat_period 默认 30 秒),短命进程(运行数十秒即退出)可能来不及注册,验证时保持进程运行 1 分钟以上。

6.3 方式三:修改 agent.config

直接修改 /opt/skywalking-agent/config/agent.config,两个必改项的行号与默认值:

grep -n 'agent.service_name\|collector.backend_service' /opt/skywalking-agent/config/agent.config
20:agent.service_name=Your_ApplicationName
100:collector.backend_service=127.0.0.1:11800

三种方式的优先级:-D 系统属性最高,其次操作系统环境变量,最后是 agent.config 文件默认值。批量部署机器建议保持配置文件默认值,统一用前两种方式注入。

6.4 插件目录管理

Agent 按目录加载插件,plugins/ 内置 154 个插件(ls /opt/skywalking-agent/plugins | wc -l 实测),即装即用。bootstrap-plugins/ 提供 JDK 自身能力的增强,需手动启用:

ls /opt/skywalking-agent/bootstrap-plugins
apm-jdk-forkjoinpool-plugin-9.8.0.jar
apm-jdk-http-plugin-9.8.0.jar
apm-jdk-httpclient-plugin-9.8.0.jar
apm-jdk-threading-plugin-9.8.0.jar
apm-jdk-threadpool-plugin-9.8.0.jar
apm-jdk-virtual-thread-executor-plugin-9.8.0.jar

optional-reporter-plugins/ 提供替代上报通道(如 Kafka 上报):

ls /opt/skywalking-agent/optional-reporter-plugins
kafka-reporter-plugin-9.8.0.jar
lz4-java-1.6.0.jar
snappy-java-1.1.7.3.jar
zstd-jni-1.4.3-1.jar

启停某个插件就是把 jar 在 plugins/ 与 optional-plugins/ 之间移动,修改后重启被观测服务生效。

6.5 Agent 自身日志

Agent 自身日志独立于被观测服务,由 agent.config 的 logging 段控制:logging.output 默认 FILE,logging.file_name 默认 skywalking-api.log,logging.dir 未设置时写到 Agent 目录下 logs 子目录,也可指定为 /var/log/skywalking-agent 等绝对路径。本环境实测日志内容:

tail -5 /var/log/skywalking-agent/skywalking-api.log
INFO SkyWalkingAgent : Skywalking agent transformer has installed.
INFO Version : SkyWalking agent version: 9.8.0-805f941
WARN AsyncProfilerTaskChannelService : Backend doesn't support async-profiler, async-profiler will be disabled

WARN 行说明后端未启用 async-profiler 支持该功能被禁用,属预期,不影响链路上报。

七、日志与运维命令

7.1 日志文件清单

ls -la /opt/skywalking/logs/
total 12928
drwxr-xr-x  2 root root     4096 Oct 12 02:36 .
drwxr-xr-x 10 root root     4096 Oct 12 02:35 ..
-rw-r--r--  1 root root        0 Oct 12 03:06 oap.log
-rw-r--r--  1 root root 13193361 Oct 12 03:54 skywalking-oap-server.log
-rw-r--r--  1 root root    28113 Oct 12 03:06 skywalking-webapp.log
-rw-r--r--  1 root root        0 Oct 12 03:06 webapp-console.log
文件内容
skywalking-oap-server.logOAP 主日志,log4j2 输出,排障主战场
skywalking-webapp.logUI 主日志
oap.logoapService.sh 的标准错误重定向目标,通常为空
webapp-console.logwebappService.sh 的标准错误重定向目标,通常为空

7.2 日志检索

确认 OAP 的 gRPC 监听就绪:

grep 'Server started' /opt/skywalking/logs/skywalking-oap-server.log | tail -1
2026-10-12 02:35:34,156 - org.apache.skywalking.oap.server.library.server.grpc.GRPCServer - 108 [main] INFO  [] - Server started, host 0.0.0.0 listening on 11800

确认 TTL 历史数据清理任务在执行:

grep 'Deleting history' /opt/skywalking/logs/skywalking-oap-server.log | tail -1
2026-10-12 03:51:26,758 - org.apache.skywalking.oap.server.storage.plugin.jdbc.common.dao.JDBCHistoryDeleteDAO - 55 [pool-5-thread-1] INFO  [] - Deleting history data, ttl: 7, now: 1791777086758. Keep [20261005, 20261013]

7.3 进程与端口核查

jps -l | grep -v Jps
6993 org.apache.catalina.startup.Bootstrap
7671 org.apache.skywalking.oap.server.webapp.ApplicationStartUp
7496 org.apache.skywalking.oap.server.starter.OAPServerStartUp
6893 org.apache.catalina.startup.Bootstrap

四类进程一目了然:两个 Bootstrap 为接入 Agent 的 tomcat 实例,OAPServerStartUp 为 OAP,ApplicationStartUp 为 UI。端口核查:

ss -tlnp | grep -E '11800|12800|8080'
LISTEN 0      4096               *:12800            *:*    users:(("java",pid=7496,fd=2781))
LISTEN 0      4096               *:11800            *:*    users:(("java",pid=7496,fd=2777))
LISTEN 0      4096               *:8080             *:*    users:(("java",pid=7671,fd=88))

进程启动参数核查见 4.2、4.3、6.1 节的 /proc 命令。

7.4 systemd 服务运维

本环境的 OAP 与 UI 由 systemd 托管,常用命令(每个单元单独操作):

# 查看 OAP 服务状态与最近日志
systemctl status skywalking-oap.service
# 探测 OAP 活跃状态
systemctl is-active skywalking-oap.service
# 重启 OAP
systemctl restart skywalking-oap.service
# 查看 UI 服务状态
systemctl status skywalking-ui.service
# 重启 UI
systemctl restart skywalking-ui.service
# 查看单元最近 20 行日志
journalctl -u skywalking-oap.service -n 20 --no-pager

状态探测回显:

systemctl is-active skywalking-oap.service
active
systemctl is-active skywalking-ui.service
active

7.5 数据维护

默认 H2 为内存库,OAP 进程重启后历史 Trace 与指标清空,重启后只需等待被观测服务重新上报。历史数据由 TTL 机制按天清理,指标默认保留 7 天、记录数据默认保留 3 天,清理动作见 7.2 节日志行。调整 TTL 与切换外部存储属配置变更,方法见《Apache SkyWalking 配置参数详解》。

八、注意事项

  1. 手工执行 oapService.sh 或 webappService.sh 后终端没有任何输出,属设计行为(标准输出被丢弃),启动是否成功以端口监听与日志文件为准;
  2. startup.sh 会阻塞在 OAP 前台且不会执行到 UI 启动行,生产一律分开托管两个脚本;
  3. 两个脚本内置的默认堆较大(OAP 默认上限 4096M、UI 默认 1024M),小内存服务器务必用 JAVA_OPTS 显式覆盖,否则 JVM 可能申请内存失败;
  4. systemd 单元中 Environment 的值含空格时必须加双引号,并按 4.6 节核查实际生效值;
  5. GraphQL 的 Duration 格式与 step 必须匹配,时间窗口错位是查询为空的最常见原因;
  6. Agent 上报地址是 gRPC 端口 11800 而非 12800,写错端口会表现为服务一直注册不上;
  7. standalone 模式下 checkHealth 查询返回 health-checker missing 属预期(未注册健康检查组件),探活改用 version 查询;
  8. OAP 默认监听 0.0.0.0,公网服务器用防火墙限制 11800/12800/8080 来源。

九、常见问题

9.1 执行启动脚本后终端一直卡住不动

脚本以前台方式拉起 JVM,属正常现象。生产环境用 nohup 放后台,或交给 systemd 托管(推荐);确认启动成功的标志是 12800/8080 端口监听与 skywalking-oap-server.log 出现 Server started 行。

9.2 用 startup.sh 启动后 UI 没有起来

见 4.4 节实测:startup.sh 阻塞在 OAP 前台进程,webappService.sh 不会被执行。分别运行两个脚本或分别配置 systemd 单元。

9.3 Agent 已挂载但 getAllServices 查不到新服务

按顺序排查:Agent 日志确认 transformer has installed 与版本行;确认 backend_service 指向 11800 端口;确认进程运行超过 1 分钟(心跳 30 秒加落库 25 秒的固有延迟);确认查询窗口 Duration 与当前日期匹配。

9.4 GraphQL 查询报 Invalid format

Duration 格式与 step 不匹配。DAY 步长写 2026-10-12,MINUTE 步长写 2026-10-12 0240 格式;混用即报错,见 5.6 节。

9.5 查询返回 errors 提示字段未定义

查询字段名或入参写错,按 5.5 节先做内省查询核对类型与枚举;列表类查询入参统一为 condition。

9.6 jps 命令不存在

jps 由 JDK 提供,安装 openjdk-17-jdk-headless 后可用;仅有 JRE 的机器按 4.2 节改用 pgrep 加 /proc 文件核查进程。

十、参考链接