You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux脚本运行后出现双进程的原因咨询

为什么运行Bash脚本后出现两个同名进程?

你执行ps -ef | grep pong后看到的进程输出:

$ ps -ef | grep pong
adminus+    3024    2923  0 10:25 pts/0    00:00:00 /bin/bash ./pong.sh
adminus+    3029    3024  0 10:25 pts/0    00:00:00 /bin/bash ./pong.sh

你的脚本内容:

#!/bin/bash
DIR=/var/tmp/ping-pong
if [ -d $DIR ]
then
    echo "Directory Exists"
else
    mkdir -p $DIR
fi

ping google.it | while read pong; do echo "$(date): $pong" >> $DIR/google-ping-$(date +%d-%m-%Y).txt; done

原因解释

这是Bash处理管道的机制导致的:

  • 当脚本执行到ping google.it | while read...这条管道命令时,Bash会为管道两侧的命令分别创建子进程。其中ping是一个独立进程,而while循环所在的部分会被Bash启动一个子shell进程来执行——这个子shell就是你看到的PID 3029的进程,它的父进程就是脚本的主进程(PID 3024)。
  • 脚本主进程会一直处于活跃状态,等待管道中的所有子进程(包括ping和子shell)完成,所以你会看到两个./pong.sh的bash进程。

解决方法(消除额外子进程)

如果不想产生额外的bash子进程,可以用进程替换替代管道,让while循环在脚本的主shell中执行:

#!/bin/bash
DIR=/var/tmp/ping-pong
# 简化目录判断逻辑
[ ! -d "$DIR" ] && mkdir -p "$DIR"

# 用进程替换让while在主shell运行
while read pong; do
    echo "$(date): $pong" >> "$DIR/google-ping-$(date +%d-%m-%Y).txt"
done < <(ping google.it)

修改后再执行ps -ef | grep pong,就只会看到一个脚本进程了。

内容的提问来源于stack exchange,提问作者Simal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:35:13