这篇文章翻译自: http://linuxcommand.org/lts0080.phpphp
上一课咱们看到了Linux做为一个多用户系统的复杂之处(权限), 这一课咱们来学习Linux的多任务特性和在命令行界面的操做方法.linux
如任何多任务系统同样, Linux执行的是多个同步的进程. 好吧, 它们只是看上去同步罢了. 实际上, 一个单处理器电脑在同一时间只能运行一个进程, 但Linux内核想办法给每一个进程都有时间片轮流执行, 这样看上去它们就是同步的了.shell
咱们有几个控制进程的命令:小程序
ps
- 把进程系统的列出 (注: 只有ps -A
能列出系统全部进程, ps
只能列出当前进程和它的子进程)kill
- 发送一个信号给进程 (一般用做杀进程)jobs
- 另外一种方法, 列出你的进程bg
- 将一个进程放到后台执行fg
- 讲一个进程拉到前台执行虽然说这个话题有那么点低级, 可是对于那些长期用图形界面的普通用户来讲是颇有实际意义的. 你可能不知道, 大多(即使不是全部)图形界面程序都能在命令行启动. 例如, 有一个带有X Windows系统的小程序xload
, 它能显示一张图形以表明系统启动. 你能够键入下面这些来启动它:编辑器
shell[me@linuxbox me]$ xload
请留意到xload窗口出现而且显示了图形, 同时也该留意到提示符在程序启动以后再也不出现. shell在等待(wait()
)程序完结, 而后才把控制权交还给你. 若是你关掉xload窗口, xload
程序终止, 提示符从新出现.学习
好, 为了改善生活, 咱们要从新启动xload, 不过此次咱们把它放到后台, 这样提示符就会回来了. 要作到这一点, 这样执行就好:操作系统
shell[me@linuxbox me]$ xload & [1] 1223 [me@linuxbox me]$
在这个例子中, 提示符返回了, 由于程序被放到了后台.命令行
如今想象一下你在执行一个后台的程序时, 把&符号打漏了. DON'T PANIC, 仍是有但愿的. 你先按下 Control-Z, 这样程序挂起. 程序仍是在的, 只不过被闲置着. 要想在后台恢复它的运行, 运行bg
(background的缩写):翻译
shell[me@linuxbox me]$ xload [2]+ Stopped xload [me@linuxbox me]$ bg [2]+ xload &
如今咱们把一个进程放到了后台, 这样列出咱们启动了的进程就变得至关有用. 咱们能够用jobs
或者ps
来完成这一点:code
shell[me@linuxbox me]$ jobs [1]+ Running xload & [me@linuxbox me]$ ps PID TTY TIME CMD 1211 pts/4 00:00:00 shell 1246 pts/4 00:00:00 xload 1247 pts/4 00:00:00 ps [me@linuxbox me]$
设想有个程序无响应了(hmmm...Netscape浮如今脑中 ;-); 怎么把它弄走? 固然, 你能够用kill
命令. 咱们来在xload上试试刀. 首先你得获得那个将被杀的程序的标识. 你能够用ps或者jobs, 用jobs获得job号, 用ps获得进程id (PID). 咱们两个都试一下:
shell[me@linuxbox me]$ xload & [1] 1292 [me@linuxbox me]$ jobs [1]+ Running xload & [me@linuxbox me]$ kill %1 [me@linuxbox me]$ xload & [2] 1293 [1] Terminated xload [me@linuxbox me]$ ps PID TTY TIME CMD 1280 pts/5 00:00:00 shell 1293 pts/5 00:00:00 xload 1294 pts/5 00:00:00 ps [me@linuxbox me]$ kill 1293 [2]+ Terminated xload [me@linuxbox me]$
"kill"命令一般用做杀进程, 而它的的做用实际上是向进程发送一个信号. 大多数时候信号就是告诉程序"好了别再运行了", 而后没有而后了. 程序监听和回应操做系统信号(若是它们写得好), 大多数时候都是为了能有一个更优雅的终止方式(死法). 例如, 一个文本编辑器可能要监听用户是否是要登出, 或者电脑是否是要关机. 当它收到这些信号, 它就得在退出以前保存工做. kill命令能法送一大堆不一样的信号呢, 键入:
shellkill -l
就会列出它支持的信号. 大多都比较晦涩, 不过有几个是蛮经常使用:
Num | Name | Description |
---|---|---|
1 | SIGHUP | 挂起信号. 程序能够监听并决定是否挂起(注: 见nohup命令和Control-Z) |
2 | SIGINT | 中断信号. 这个信号但愿让进程中断的, 固然最终的行为由进程本身决定. 你能够在终端按Control-C(aka, 键盘中断)来发出这个信号. |
15 | SIGTERM | 终止信号. 这个信号但愿让进程终止的, 最终的行为仍由进程本身决定. 这是kill命令默认发出的信号. |
9 | SIGKILL | 杀信号. 这个信号用于当即终止进程. 它由内核发出, 没法监听和处理. |
好如今设想你有一个进程已经毫无但愿地卡在那里了(好比可怜地Netscape), 你要停掉它, 你该这样作:
shell[me@linuxbox me]$ ps x PID TTY STAT TIME COMMAND 2931 pts/5 SN 0:00 netscape [me@linuxbox me]$ kill -SIGTERM 2931 [me@linuxbox me]$ kill -SIGKILL 2931
这个例子中, 我以一个更加形式化的写法来用kill命令. 在实际应用中, 下面这个更经常使用, 由于kill默认发出SIGTERM, -信号也能够用数字而不是名字来代替:
shell[me@linuxbox me]$ kill 2931
若是进程还不终止, 那就用SIGKILL强制终止:
shell[me@linuxbox me]$ kill -9 2931
这在"Learning the shell"系列课程中的最后一个. 下一个系列, "写shell脚本", 咱们将学习如何用shell脚本自动化任务.