我创建了一个 bash
脚本,用于计算自身启动的实例。
这是它的代码(在这个示例中,我展示了实例而不是使用 wc -l
计数):
#!/bin/bash
nb=`ps -aux | grep count_itself.sh`
echo "$nb"
sleep 20
(当然,我的脚本名为
count_itself.sh
)在执行时,我期望它返回两行,但它返回了三行:
root@myserver:/# ./count_itself.sh
root 16225 0.0 0.0 12400 1176 pts/0 S+ 11:46 0:00 /bin/bash ./count_itself.sh
root 16226 0.0 0.0 12408 564 pts/0 S+ 11:46 0:00 /bin/bash ./count_itself.sh
root 16228 0.0 0.0 11740 932 pts/0 S+ 11:46 0:00 grep count_itself.sh
使用 &
标志运行它(即在后台),并手动执行 ps -aux
部分,它返回两个,这正是我想要的:
root@myserver:/# ./count_itself.sh &
[1] 16233
root@myserver:/# ps -aux | grep count_itself.sh
root 16233 0.0 0.0 12408 1380 pts/0 S 11:48 0:00 /bin/bash ./count_itself.sh
root 16240 0.0 0.0 11740 944 pts/0 S+ 11:48 0:00 grep --color=auto count_itself.sh
我的问题是:为什么在脚本中执行
ps -aux
命令会比预期多返回一行?换句话说,为什么在我的第一个示例中创建了进程ID为
16226
的进程?编辑(因为大多数人似乎误解了我的问题):
我想知道为什么
bash
执行会返回两个/bin/bash ./count_itself.sh
实例,而不是为什么会返回grep count_itself.sh
。第二次编辑:
当然,我正在寻找避免这种情况并使脚本只返回一次
/bin/bash ./count_itself.sh
的方法。
\
ps -aux | grep count_itself.sh`是在子shell中执行的,也就是在一个子进程中执行。因此,执行您的脚本的shell被分叉,子进程然后运行
ps -aux | grep count_itself.sh` 命令。 - Leonps -aux | grep count_itself.sh
命令时,你的 grep 命令会将其本身也计算在内,就像是 count_itself 的一个实例。你需要改进你的正则表达式。 - Stargateur