以两个脚本为例,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的调用关系可以用这种调用方法做到。
但要注意,脚本复杂起来后,各自脚本中的变量重名带来的污染。
阅读(2538) | 评论(0) | 转发(0) |