Linux任务控制

这篇文章翻译自: 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), 你要停掉它, 你该这样作:

  • 用ps命令获取它地进程号 (PID).
  • 对这个 PID 执行kill.
  • 若是进程拒绝终止(好比它忽略了这个信号), 那么就对它发出更加严厉的信号, 直到它中止了.
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脚本自动化任务.

相关文章
相关标签/搜索