进程处理
jobs
命令-l
:列出pid
-p
:只列出pid
-n
:只列出和上次比发生变化的作业-r
:正在运行的-s
:被停止的-x
:后面跟一个cmd
,可以用%n
获取pid
- 引用后台作业的方式
引用方式 | 含义 |
---|---|
%N |
作业编号N |
%string |
以string 开始的作业 |
%?string |
命令中包含string 的作业 |
%+ |
最近被调用的作业(%% 同) |
%- |
第二个最近被调用的作业 |
Ctrl+Z
后跟bg
可以将正在前台运行的作业转后台kill
默认动作是发送TERM
信号(-15
)1
2
3$ kill %1
$ kill -QUIT %1 # kill -3 %1
$ kill -KILL %1 # kill -9 %1ps
命令ps
列出所有当前终端的进程(第一行是shell
,最后一行是ps
)ps -a
列出所有终端的进程(包含当前shell
,不包含其它终端的shell
)ps -e
或ps -ax
可以显示所有进程(包括孤儿进程)
trap
命令基本格式:
1
trap cmd sig1 sig2 ...
trap
定义的陷阱可以被覆盖,即使这个覆盖发生在函数中将
cmd
置为空字符串可以忽略信号SIGHUP会在以下3种情况下被发送给相应的进程:
- 终端关闭时,该信号被发送到session首进程以及作为job提交的进程(即用 & 符号提交的进程)
- session首进程退出时,该信号被发送到该session中的前台进程组中的每一个进程
- 若父进程退出导致进程组成为孤儿进程组,且该进程组中有进程处于停止状态(收到SIGSTOP或SIGTSTP信号),该信号会被发送到该进程组中的每一个进程。
系统对SIGHUP信号的默认处理是终止收到该信号的进程。所以若程序中没有捕捉该信号,当收到该信号时,进程就会退出。
语句
trap "" HUP
可以使得脚本脱离终端运行。linux
提供了nohup
命令便于我们更好的使用此功能。将
cmd
置为短线-
可以恢复信号的默认操作
$$
表示当前shell
的pid
,$!
表示最近调用的后台作业的pid
在命令后面加
&
使其在后台运行可以利用系统并行性的特点提高效率。这时可能需要在脚本结束时加上wait
指令避免其称为孤儿进程
子shell
继承的特性
- 当前目录
- 环境变量
fd
- 被忽略的信号
注意
{:.warning}shell
变量和未被忽略的信号处理没有被继承嵌套子
shell
将命令放在
()
中即可和命令块
{}
的区别- 嵌套子shell符合上述继承的特性,还继承了当前shell的变量,子shell中的变量不能被外部引用
- 命令块可以看作继承了当前shell所有特性的子shell,而且其变量修改可以被外部引用
一般原则是:如果代码包含变量定义或信号陷阱,则应该使用嵌套子shell代替命令块,除非效率是需要考虑的关键因素
在
()
前面加>
或<
可做进程替换用。考虑这个例子:有两个程序prog1
和prog2
,要想比较这两个程序的输出,当然可以创建临时文件,但也可以用进程替换:1
$ cmp <(prog1) <(prog2)