脚本的不同执行方式是否会开启子shell
父Shell概念
(1)pstree查看父进程
如下命令安装pstree
yum install -y psmisc
sshd--sshd--bash--pstree
- 第一个sshd为操作系统自己启动的监听sshd服务的程序
- 第二个sshd是shell连接过来启动的shell
- 每次调用bash都会开启一个shell,因此调用pstree会启动一个新shell bash 运行完命令就销毁新shell,返回sshd的shell
[root@localhost ~]# pstree systemd─┬─ ├─polkitd───6*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd─┬─bash───pstree #此为当前执行pstree的终端shell │ ├─bash───top │ ├─bash───sleep │ └─sftp-server
(2)通过ps -ef 查看父进程 PPID可以明显看出他的父进程是哪个
-e 显示出PID、PPID、UID信息
-f 列出所有进程信息
--forest 树
[root@localhost ~]# ps -ef --forest UID PID PPID C STIME TTY TIME CMD root 1014 1 0 17:29 ? 00:00:00 /usr/sbin/sshd -D root 11461 1014 0 21:01 ? 00:00:30 \_ sshd: root@pts/0,pts/1 root 11465 11461 0 21:01 pts/0 00:00:00 \_ -bash root 98282 11465 0 22:35 pts/0 00:00:00 | \_ ps -ef --forest root 11478 11461 0 21:01 pts/1 00:00:00 \_ -bash root 11544 11478 0 21:01 pts/1 00:00:05 | \_ top root 11480 11461 0 21:01 ? 00:00:00 \_ /usr/libexec/openssh/sftp-server root 98263 11461 0 22:35 ? 00:00:00 \_ bash -c export LANG="en_US";export LANGUAGE="en_US";export LC_ALL="en_US";free;echo finalshell_separator;uptim root 98270 98263 0 22:35 ? 00:00:00 \_ sleep 1
子shell概念
sh、bash命令 会进入一个子shell
[root@localhost ~]# bash [root@localhost ~]# pstree systemd─┬─ ├─sshd───sshd─┬─bash───bash───pstree │
多个子shell
多次执行sh 、bash进入子shell 。
只要是通过bash执行脚本,一定会开启一个子shell,脚本执行完毕自动退出子shell;
输入exit退出子shell
创建进程列表(创建子shell执行命令)
为什么学习子shell
耗时操作,如果在当前shell运行会阻塞,开启子shell去异步运行。
检测是否在子shell环境中
BASH_SUBSHELL可能为0,可能为1/2/3等。 代表在当前shell的第几层子shell 运行的命令。