2017.6.26
ps -f
命令能够表现子shell的嵌套关系。
添加;
来分隔命令可以指定依次运行的一系列命令。
不过这一系列命令并不是进程列表,命令列表想要成为进程列表,这些命令必须包含在括号里。
echo $BASH_SUBSHELL
返回为0表明没有子shell,返回为1或更大的数,说明存在。
子shell用法
探索后台模式
&
字符会让进程被置于后台:
wsx@wsx-ubuntu:/etc$ sleep 3000& # sleep命令会在后台睡眠3000秒
[1] 10469 # 返回两条信息,方括号内是后台作业号,后者显示作业的进程ID
wsx@wsx-ubuntu:/etc$ ps -f # ps命令用来显示各种进程
UID PID PPID C STIME TTY TIME CMD
wsx 10304 10299 0 19:21 pts/0 00:00:00 bash
wsx 10317 10304 0 19:21 pts/0 00:00:00 bash
wsx 10327 10317 0 19:21 pts/0 00:00:00 bash
wsx 10469 10327 0 19:28 pts/0 00:00:00 sleep 3000
wsx 10470 10327 0 19:28 pts/0 00:00:00 ps -f
wsx@wsx-ubuntu:/etc$ jobs # 也可以通过jobs命令来显示后台作业信息
[1]+ 运行中 sleep 3000 &
jobs
命令在方括号内显示出作业号,还显示了作业的当前状态以及对应的命令。
将进程列表置于后台
wsx@wsx-ubuntu:/etc$ (sleep 2; echo $BASH_SUBSHELL; sleep 2) &
[2] 10729
wsx@wsx-ubuntu:/etc$ 1
[2]+ 已完成 ( sleep 2; echo $BASH_SUBSHELL; sleep 2 )
在CLI中运行子shell的创造性方法之一就是将进程列表置于后台模式。既可以在子shell中进行繁重的处理工作,同时也不会让子shell的I/O受制于终端。
协程
协程可以同时做两件事。它在后台生成一个子shell,并在这个子shell中执行命令。
要进行协程处理,得使用coproc
命令,还有要在子shell中执行的命令。比如
wsx@wsx-ubuntu:/etc$ coproc sleep 10
[2] 11026
除了会创建子shell之外,协程基本上就是将命令置入后台模式。jobs
可以显示作业信息。
可以将协程与进程列表结合起来产生嵌套的子shell。
wsx@wsx-ubuntu:~$ coproc ( sleep 10; sleep 2 )
[1] 3438
wsx@wsx-ubuntu:~$ jobs
[1]+ 运行中 coproc COPROC ( sleep 10; sleep 2 ) &
wsx@wsx-ubuntu:~$ ps --forest
PID TTY TIME CMD
3420 pts/1 00:00:00 bash
3438 pts/1 00:00:00 \_ bash
3439 pts/1 00:00:00 | \_ sleep
3440 pts/1 00:00:00 \_ ps