Linux的进程计数差异

时间:2013-04-29 10:43:09

标签: linux shell scripting

以下是一个脚本:

$ cat test.sh
#!/bin/sh
echo ------------------------
date
OCCURANCE=`ps -ef|grep "test.sh" | grep -vc grep`
ps -ef|grep "test.sh" | grep -vc grep
ps -ef|grep "test.sh" | grep -v grep
echo $OCCURANCE

Linux中的输出:

------------------------
Mon Apr 29 10:36:38 GMT 2013
1
tmon 15565  7469  0 10:36 pts/0    00:00:00 /bin/sh ./test.sh
2

SunOS中的输出:

------------------------
Monday, April 29, 2013 10:33:47 AM GMT
1
tmon 21248 17305   0 10:33:48 pts/7       0:00 /bin/sh ./test.sh
1

根据代码,2个数值应该相同。 但是,为什么SunOS和Linux都是假的呢?

2 个答案:

答案 0 :(得分:1)

在Linux中,反引号生成的子shell在ps的输出中有一个包含字符串test.sh的条目。在Sun上,它没有。

答案 1 :(得分:1)

Linux系统上的

/bin/sh可能是bash的符号链接。您的脚本正在启动子shell,导致另一个进程。

另一方面,ksh中的子shell不要求单独的过程。尝试在ksh中运行代码,您将看到预期的输出。

同样,在SunOS上使用的shell可能不是bash。如果您尝试在Solaris上使用bash,您会注意到与Linux类似的行为。