运行server.sh脚本统计自身进程数返回2而非1的问题咨询
统计结果为2的原因
- 核心原因是 Bash 执行
$(...)格式的命令替换时,会自动创建一个子shell进程运行括号内的代码,这个子进程的进程名同样匹配server.sh关键词:
你运行脚本时首先会启动1个主server.sh进程,执行到process_count=$(ps aux | ...)这一行时,主进程会fork出1个临时子shell进程执行管道统计逻辑,此时ps扫描进程列表会同时匹配到主进程、临时子shell进程2个结果,所以最终统计值为2。 - 即使用pgrep统计结果依旧为2也是同样的逻辑:pgrep执行时子shell还未退出,依旧会被匹配到。
验证方法
你可以修改脚本打印出所有匹配到的进程详情,就能直观看到两个进程:
#!/bin/bash # 先打印所有匹配的进程信息 matched_process=$(ps aux | grep server.sh | grep -v grep) echo "匹配到的进程列表:" echo "$matched_process" process_count=$(echo "$matched_process" | wc -l) echo "total process running:" echo $process_count
运行后你会看到两行进程记录,其中一行是脚本主进程,另一行是执行命令替换的临时子shell进程。
解决方法
如果要统计真实的server.sh独立实例数,可以排除临时子shell的干扰:
# 统计时减去当前命令替换产生的1个临时子进程即可 process_count=$(( $(ps aux | grep server.sh | grep -v grep | wc -l) - 1 ))
或者过滤掉父PID为当前脚本主PID的临时子进程:
# $$ 代表当前脚本主进程的PID process_count=$(ps aux | grep server.sh | grep -v grep | grep -v -F "ppid $$" | wc -l)
内容的提问来源于stack exchange,提问作者Sahil Butani
相关产品推荐
相关产品推荐

