1.相关概念:
shell :命令解释器,其实就是一个脚本语言解释器,有很多种(bash,ash,tcsh等),最常用的是bash.
job(作业): 是相对shell 来说的,在shell中执行一条命令,实际上就是提交了一个job,只不过有的job需要运行很长时间,有的job很快就结束。
进程:命令经过shell解析后,交给系统内核执行,会fork出很多进程,他们同属于登录shell的进程组,如下图。
所以作业是shell里面的一个概念,jobs命令只能查看当前shell自己的job,不同的shell 之间相互隔离。我们在shell里执行一条命令的时候就开启了一个作业,一个作业对应着系统中的一个进程组,如果作业中的某个进程又创建了子进程,则子进程不属于作业。
如何理解子进程不属于作业呢?其实很简单:
shell脚本自己也有语法,shell 脚本本身的运算都是作业内容,但是shell脚本中开启其他进程则不是。
$: sleep 10000 && echo "====" &
以上代码中&&前后两条shell语句执行结束,则作业结束。
2.作业的分类。
作业可以分为前台作业和后台作业。
前台作业:需要占用终端的输入、输出。
后台作业:命令后面加&,后台job不占用shell的输入输出。例如: java Test &
一个shell在某一时刻可以同时运行一个前台作业和多个后台作业。
3.作业的操作:
对正在运行的前台作业:
ctl+z : 暂停前台(终端窗口中)正在运行job
ctl+c: 终止前台(终端窗口中)正在运行job
因为前台正在运行的作业只有一个,一个作业对应一个进程(jobs -l 可以查看进程ID),所以ctl+z ctl+z 实际上是对当前前台job对应的进程发送信号。
job的其他操作:
jobs: 显示当前所有的job,包括正在运行的和暂停的。
fg+N : 让暂停的job在前台运行,N=jobs 命令查询的的job号
bg+N : 让暂停的job在后台运行,N=jobs 命令查询的的job号
kill %N : 终止job(与kill 进程不一样,这里有%),N=jobs 命令查询的的job号
扩展参考资料:
https://www.cnblogs.com/JohnABC/p/4079669.html
https://my.oschina.net/u/2467198/blog/619071
https://unix.stackexchange.com/questions/9082/difference-between-process-group-and-job
https://askubuntu.com/questions/506510/what-is-the-difference-between-terminal-console-shell-and-command-line
更多内容:http://skycity.today/?thread-192.htm