shell脚本的调用方法和进程关系

2590阅读 0评论2015-06-26 polejo
分类:LINUX

以两个脚本为例,father.sh调用son.sh
son.sh
    #!/bin/sh
    pid=$$
    name=`ps aux |grep -w $pid | grep -v grep | awk '{for(i=11;i<=NF;i++) printf("%s ", $i)}'`
    echo -e "    son process, pid=$pid, cmd=$name\n"
    sleep 100000
    exit

father.sh
    #!/bin/sh 
    pid=$$
    name=`ps aux |grep -w $pid | grep -v grep | awk '{for(i=11;i<=NF;i++) printf("%s ", $i)}'`
    echo -e "\n father process, pid=$pid, cmd=$name"
    sh son.sh #### 调用方法
    exit

调用son.sh方法有多种,对比它们的执行结果
1. sh son.sh
 father process, pid=3129, cmd=sh father.sh
    son process, pid=3135, cmd=sh son.sh
这种调用方式与 ./son.sh   /bin/son.sh是完全相同的。可见这种调用方法是fork出了一个完全的子进程来运行son.sh。

2. exec son.sh
 father process, pid=3153, cmd=sh father.sh
    son process, pid=3153, cmd=/bin/sh /bin/son.sh
这种方法并没有子进程,PID没有变化,而在当前进程中用son.sh代替了father.sh的进程cmd。


3. source son.sh
 father process, pid=3176, cmd=sh father.sh
    son process, pid=3176, cmd=sh father.sh
. son.sh,这种办法自始至终只有一个进程存在,包括PID和cmd都没有变化,只是把son.sh的脚本读取到当前进程环境下执行。所以要跟踪son.sh的调用关系可以用这种调用方法做到。
但要注意,脚本复杂起来后,各自脚本中的变量重名带来的污染。
上一篇:用ipset配置linux防火墙
下一篇:windows8 64位系统安装python环境以及paramiko