Chinaunix

标题: bash的一点小疑惑 [打印本页]

作者: cyaln    时间: 2009-01-16 17:16
标题: bash的一点小疑惑
下面这个命令大家都看的明白的啦,可是我在不同平台实验的时候出现的结果不一样啊!!!

AIX最稳定,一直是这个数据:
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root 172120 458814   0 15:15:43  pts/1  0:00 awk {print $0}
    root 458814 417860   3 15:14:20  pts/1  0:00 bash

HP-UX/Solaris/Suse上面多运行几次,出现好多个bash,谁可以解释一下呢~~~~
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  8681  3312  0 01:14:53 pts/0     0:00 bash
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
    root  8682  3312  0 01:14:53 pts/0     0:00 bash
    root  8683  3312  0 01:14:53 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
    root  8688  3312  1 01:14:54 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  1 18:07:03 pts/0     0:00 bash
    root  8693  3312  0 01:14:55 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  8698  3312  1 01:14:55 pts/0     0:00 awk {print $0}
    root  3312  3299  1 18:07:03 pts/0     0:00 bash
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  8700  3312  0 01:14:56 pts/0     0:00 bash
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
    root  8702  3312  0 01:14:56 pts/0     0:00 bash
    root  8703  3312  0 01:14:56 pts/0     0:00 awk {print $0}
    root  8701  3312  1 01:14:56 pts/0     0:00 bash
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  1 18:07:03 pts/0     0:00 bash
    root  8708  3312  0 01:15:02 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
    root  8713  3312  1 01:15:03 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  1 18:07:03 pts/0     0:00 bash
    root  8718  3312  1 01:15:03 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
    root  8723  3312  0 01:15:04 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
    root  8733  3312  1 01:15:06 pts/0     0:00 awk {print $0}
bash-3.2# ps -fe | grep $$ | grep -v ps  | grep -v grep | awk '{print $0}'
    root  3312  3299  0 18:07:03 pts/0     0:00 bash
    root  8738  3312  0 01:15:08 pts/0     0:00 bash
作者: todayhero    时间: 2009-01-16 17:20
understand $$  in detail
作者: cyaln    时间: 2009-01-16 17:23
how about $$ ? can you explain it ?
作者: terryno1    时间: 2009-01-16 17:24
跟$$没有关系吧?
作者: welcome008    时间: 2009-01-16 17:35
原帖由 cyaln 于 2009-1-16 17:23 发表
how about $$ ? can you explain it ?



ppid
作者: waker    时间: 2009-01-16 17:37
因为unix是多人多工的
作者: cyaln    时间: 2009-01-16 17:46
原帖由 waker 于 2009-1-16 17:37 发表
因为unix是多人多工的



那为什么suse也会!!!!就AIX不会出现啊~~~~~
作者: cyaln    时间: 2009-01-16 17:47
ps -fe | grep $$ | grep -v ps  | grep -v grep


如果是这样的话,所有的平台都是正常的~~~

可能问题出在awk那里!有谁给点帮助啊!!!
作者: bend    时间: 2009-01-16 17:50
我觉得是不是楼主测试的机器上,登录的用户不同,造成结果不一样?
你可以先用who查一下谁在线,再试试?
作者: waker    时间: 2009-01-16 17:54
原帖由 cyaln 于 2009-1-16 17:46 发表



那为什么suse也会!!!!就AIX不会出现啊~~~~~

会不会都是正常的
作者: seeLnd    时间: 2009-01-16 18:56
没有你的环境,我猜下吧:

管道会产生sub shell,然后sub shell才去exec 具体的命令,可能搂主的 ps 命令正好钻到这个空子中去了,
我所说的空子就是 当前交互shell  fork出好几个sub shell后, 还没开始exec具体的命令如 grep, awk,
此时 ps 执行了,所以ps看到的是bash,  倘若sub shell 在ps执行之前已经 exec 命令了,
ps 结果中看到的就是awk(看不到grep是因为被过滤了), 模拟下我的想法:

这个至少能看到2个bash,有一个一定可以看到的就是当前交互shell,
另一个能看到是因为ps执行的时候,第一个grep还没被执行,sub shell还在等sleep执行完,还没变身成grep呢:
  1. ps -fe | (sleep 3;exec grep $$) | grep -v ps | grep -v grep | awk '{print $0}'
复制代码



这个只会看到1个bash,仅仅只有那个一定能看到的当前交互shell,
具体是因为 ps 一直迟迟得不到执行,等3秒后开始执行了,其他的sub shell都已经变身成功,不是bash了:
  1. (sleep 3; exec ps -fe) | grep $$ | grep -v ps | grep -v grep | awk '{print $0}'
复制代码


所以楼主的情况是OS不同,甚至硬件不同,执行结果也是看到不一样,我用sleep,只是强制(理论上也不完全是强制,但做实验是可以的) 保证了 ps 的执行时机

BTW: 有个概念必须清楚,不然可能不容易看懂上面的,
         管道看起来好像是顺序执行的,其实bash只管一个个统统fork出来,他们的执行顺序是随机的,只靠IO来同步的,
         也就是说你一敲下回车,立刻会有好多sub shell 被 fork 出来,取决于你管道的数量

[ 本帖最后由 seeLnd 于 2009-1-16 19:14 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2