(1)Shell 脚本的执行进程
2016-09-19 16:28
274 查看
# 当前login-shell的进程PID. root@37C:~# echo $$ 3016
# 测试脚本: root@37C:~# cat run.sh #!/bin/bash # 获取执行shell脚本的非交互shell的PID. echo $$ ###### echo "test1:-------------------------" ps -ef | grep `echo $$` echo "test2:()-----------------------" ( pwd;echo $$; ps -ef|grep `echo $$`; ) echo "test3:{}-----------------------" { pwd; echo $$; ps -ef | grep `e 4000 cho $$`; }
# 脚本执行结果: root@37C:~# ./run.sh # 或者 root@37C:~# bash run.sh 11299 test1:----------------------- root 11299 3016 0 15:26 pts/4 00:00:00 /bin/bash ./run.sh root 11300 11299 0 15:26 pts/4 00:00:00 ps -ef root 11301 11299 0 15:26 pts/4 00:00:00 grep 11299 test2:()----------------------- /root 11299 root 11299 3016 0 15:26 pts/4 00:00:00 /bin/bash ./run.sh root 11303 11299 0 15:26 pts/4 00:00:00 /bin/bash ./run.sh root 11305 11303 0 15:26 pts/4 00:00:00 grep 11299 test3:{}----------------------- /root 11299 root 11299 3016 0 15:26 pts/4 00:00:00 /bin/bash ./run.sh root 11307 11299 0 15:26 pts/4 00:00:00 ps -ef root 11308 11299 0 15:26 pts/4 00:00:00 grep 11299
结果分析:
1). 交互式login-shell的进程ID为:3016。
2). login-shell(3016)派生出非交互式的shell执行进程(11299),该进程负责解释run.sh脚本里面的命令并执行。
3). 11299(脚本执行进程)负责逐行执行脚本:遇到内置命令直接在当11299进程中执行,遇到可执行程序就fork出新的子进进程来执行。
4). test1的结果:进程 ps(11300 ) 和 grep (11301 )都是执行shell 11299 进程派生的子进程。
5). 11299(脚本执行进程)扫描到( cmd1;cmd2;) 语句群时,会再派生一个ID为11303 子shell负责执行( cmd1;cmd2;)内的命令和语句:11303 逐行扫描()中的语句,按照步骤3的规则进行处理:进程号11305 (grep),还有另一个进程(ps),都是11303 派生出的子进程,ps子进程此处没有显示出来。
6). 11299(脚本执行进程)扫描到{ cmd1;cmd2;} 语句时,不会新派生子shell,直接使用当前进程11299进行负责逐行解释执行脚本。
采用source方式执行脚本:
root@37C:~# echo $$ 11389 # 可以看到,并不会派生子shell解释脚本。 # 而是直接使用login-shell进行解释。 root@37C:~# source run.sh # 或者 root@37C:~# . run.sh 11389 test1:----------------------- root 11389 11388 0 15:54 pts/4 00:00:00 -su root 11451 11389 0 16:15 pts/4 00:00:00 ps -ef root 11452 11389 0 16:15 pts/4 00:00:00 grep --color=auto 11389 test2:()----------------------- /root 11389 root 11389 11388 0 15:54 pts/4 00:00:00 -su root 11454 11389 0 16:15 pts/4 00:00:00 -su root 11456 11454 0 16:15 pts/4 00:00:00 grep --color=auto 11389 test3:{}----------------------- /root 11389 root 11389 11388 0 15:54 pts/4 00:00:00 -su root 11458 11389 0 16:15 pts/4 00:00:00 ps -ef root 11459 11389 0 16:15 pts/4 00:00:00 grep --color=auto 11389
总结:
1):在当前shell中执行内部命令不会派生子shell。
2):在当前shell中执行外部命令或脚本时会派生子shell,所以这时命令的执行不会影响当前shell环境。
3):要想在当前shell中执行脚本,而不派生子shell,可以使用 . 和source 命令 执行,会影响当前shell的环境。
4):./run.sh = bash ./run.sh 当前shell会派生子shell执行脚本文件,脚本的执行不会影响到当前shell环境。
5):. ./command.sh = source ./command.sh 直接在当前shell中执行脚本,脚本的执行回影响到当前shell环境。
相关文章推荐
- linux 远端执行shell脚本 批量结束各个远端节点进程
- 通过进程检测服务时脚本文件名不要起要检测的服务名字命名 shell程序从上到下执行若定义函数或引用系统函数需先定义 kill -USR2
- shell脚本执行查找进程,然后查杀进程
- Shell脚本之监视指定进程的执行状态
- shell脚本不暂停进程,暂停几秒执行下一条shell命令
- 执行杀死进程的shell脚本时出错
- shell 脚本里启动多进程执行
- 执行杀死进程的shell脚本时出错
- 以Android L读取系统所有logcat并写入文件为例分析Android 以添加系统进程的方式申请selinux的权限执行shell脚本,以及avc:dined应该怎么申请权限
- shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
- shell 脚本监控程序是否正在执行, 如果没有执行, 则自动启动该进程
- shell脚本是否作为单独的一个进程执行?
- Shell写的一个进程监视脚本
- 手记06之shell如何执行脚本
- 执行shell脚本的三种不同情况
- Shell脚本执行软件安装
- 自己编写的一个查找Linux进程的Shell脚本
- shell中确保只有一个进程在执行
- 如何用shell脚本杀死指定名称的进程
- 使用Shell脚本查找程序对应的进程ID,并杀死进程