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
相关产品推荐
相关产品推荐

