免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2824 | 回复: 6
打印 上一主题 下一主题

关于shell脚本执行方式的探讨 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-15 11:58 |只看该作者 |倒序浏览
写了一个小脚本做测试
  1. #! /usr/bin/ksh
  2. subFun() {
  3. echo "It's a sub Funcation"
  4. sleep 10
  5. }

  6. clear
  7. echo "It's a father process"
  8. sleep 5
  9. subFun
  10. echo "It's end"
  11. exit 0
复制代码
使用
  1. while true
  2. do
  3. ps -ef|grep pts/4
  4. sleep 1
  5. echo
  6. done
复制代码
监控进程的变化

第一次使用 #sh /tmp/test.sh来执行小脚本
进程监控内容如下:
root  1679548 15286324   0 11:37:16  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh

    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 31772756 15286324   0 11:37:17  pts/0  0:00 grep pts/4

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383440 15286324   0 11:37:18  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070818  1679554   0 11:37:18  pts/4  0:00 sleep 5

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 31772762 15286324   0 11:37:20  pts/0  0:00 grep pts/4
    root 41070818  1679554   0 11:37:18  pts/4  0:00 sleep 5

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383446 15286324   0 11:37:21  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070818  1679554   0 11:37:18  pts/4  0:00 sleep 5

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 31772768 15286324   0 11:37:22  pts/0  0:00 grep pts/4
    root 41070818  1679554   0 11:37:18  pts/4  0:00 sleep 5

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383452 15286324   0 11:37:23  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070818  1679554   0 11:37:18  pts/4  0:00 sleep 5

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 32567502 15286324   0 11:37:24  pts/0  0:00 grep pts/4
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383460 15286324   0 11:37:25  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 32567508 15286324   0 11:37:26  pts/0  0:00 grep pts/4
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383466 15286324   0 11:37:27  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 32567514 15286324   0 11:37:28  pts/0  0:00 grep pts/4
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383472 15286324   0 11:37:29  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 32567520 15286324   0 11:37:30  pts/0  0:00 grep pts/4
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383478 15286324   0 11:37:31  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 32567526 15286324   0 11:37:32  pts/0  0:00 grep pts/4
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679554  3678372   0 11:37:18  pts/4  0:00 /usr/bin/ksh ./tmp/test.sh
    root  3383484 15286324   0 11:37:33  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070820  1679554   0 11:37:23  pts/4  0:00 sleep 10

    root  1679556 15286324   0 11:37:34  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh

    root  3383490 15286324   0 11:37:35  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh

第二次使用#.  /tmp/test.sh来执行
进程监控内容如下:
root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070604 15286324   0 11:37:50  pts/0  0:00 grep pts/4

    root  1679606 15286324   0 11:37:51  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh

    root  3383506 15286324   0 11:37:52  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070612  3678372   0 11:37:51  pts/4  0:00 sleep 5

    root  1679612 15286324   0 11:37:53  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070612  3678372   0 11:37:51  pts/4  0:00 sleep 5

    root  3383512 15286324   0 11:37:54  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070612  3678372   0 11:37:51  pts/4  0:00 sleep 5

    root  1679362 15286324   0 11:37:55  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070612  3678372   0 11:37:51  pts/4  0:00 sleep 5

    root  3383518 15286324   0 11:37:56  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10

    root  1679368 15286324   0 11:37:57  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10

    root  3383524 15286324   0 11:37:58  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10

    root  1679374 15286324   0 11:37:59  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10

    root   557138 15286324   0 11:38:00  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10

    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10
    root 48349296 15286324   0 11:38:01  pts/0  0:00 grep pts/4

    root   557144 15286324   0 11:38:02  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10

    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10
    root 48349302 15286324   0 11:38:03  pts/0  0:00 grep pts/4

    root   557150 15286324   0 11:38:04  pts/0  0:00 grep pts/4
    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10

    root  3678372 32579786   0 11:34:51  pts/4  0:00 -ksh
    root 41070614  3678372   0 11:37:56  pts/4  0:00 sleep 10
    root 48349308 15286324   0 11:38:05  pts/0  0:00 grep pts/4

    root 32579788 15286324   0 11:38:06  pts/0  0:00 grep pts/4

    root 48349314 15286324   0 11:38:07  pts/0  0:00 grep pts/4

使用sh /tmp/test.sh是由ksh进程创建了/usr/bin/ksh ./tmp/test.sh进程,再由/usr/bin/ksh ./tmp/test.sh进程创建了subFun函数体的子进程sleep 10

使用. /tmp/test.sh则所有的进程全部是由ksh进程创建的。

再观察root的 .sh_history文件,发现如下现象
第一次执行在.sh_history中能记录到sh /tmp/test.sh命令
第二次执行在.sh_history中能记录到
. /tmp/test.sh
echo "It's a sub Funcation"
sleep 10
}

现在的问题就是,为什么当脚本中的函数体直接由ksh进程创建时会将函数体中的命令记录到.sh_history中呢?
望有高手来指教一下。

论坛徽章:
0
2 [报告]
发表于 2010-04-15 13:15 |只看该作者
第一种方式使用 #sh 脚本名 的方式是比较容易理解的,父进程创建了“脚本名”的进程,所以该“脚本名”能被ksh记录到.sh_history中,脚本中的命令及函数体都是由该脚本创建,因此无法被ksh记录到.sh_history中。

但是第二种方式使用 #. 空格 脚本名 的方式,脚本中所有的命令,包括函数体都是由父进程ksh创建出来的,理论上应该都能被记录到.sh_history中啊,为什么单单只有函数体内{以后的命令能被记录到.sh_history中呢?

论坛徽章:
0
3 [报告]
发表于 2010-04-16 11:42 |只看该作者
只有人看,没有人回。
只能自己顶一下了。

论坛徽章:
0
4 [报告]
发表于 2010-04-19 16:32 |只看该作者
自己再顶一次,我的问题难道很深奥吗?为什么没有人能回答呢?

论坛徽章:
0
5 [报告]
发表于 2010-06-03 11:02 |只看该作者
顺便再补充一下运行环境,是AIX上的ksh,不是普通linux上用的ksh93或pdksh

论坛徽章:
0
6 [报告]
发表于 2010-09-25 14:54 |只看该作者
隔了那么久都无人回答?

论坛徽章:
0
7 [报告]
发表于 2010-09-25 15:59 |只看该作者
不懂 ksh  我只会bash
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP