工作控制(Job Control)

来自MagicLinux 百科
Sejishikong讨论 | 贡献2021年12月20日 (一) 20:11的版本 (创建页面,内容为“==<center>工作控制</center>== ===[http://mlwiki.maihaohui.com/index.php/Linux%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B9%8B%E8%8F%9C%E9%B8%9F%E5%AD%A6%E4%B9%A0%E7%AF%87 返回目录]=== ===[http://www.linuxcommand.org/lts0080.php 原文链接 : http://www.linuxcommand.org/lts0080.php]=== 在上一课中,我们了解到linux作为多用户操作系统的含义. 本课中, 我们将验证linux的多任务天性及如何通过命令行界面来实现这一功能. 同…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

工作控制

返回目录

原文链接 : http://www.linuxcommand.org/lts0080.php

在上一课中,我们了解到linux作为多用户操作系统的含义. 本课中, 我们将验证linux的多任务天性及如何通过命令行界面来实现这一功能.

同其它多任务操作系统一样,linux可同时执行多个进程. 啊,至少他们看起来是同步的. 实事上,单一进程的计算机一次只能执行一个进程,但是linux内核在处理器上为每个进程排序, 第一个进程看起来像在同时运行.

有多个命令可以 用于控制进程. 它们是:

  • ps - 列举系统中运行的进程
  • kill - 向一个或一个以上的进程发送信息(常用于杀死进程)
  • jobs - 通过交互方式列举进程
  • bg - 将一进程置于后台运行
  • fg - 将一进程置于前台运行

一个实例

虽然本主题的内容较为晦涩难懂,但对于习惯于工作在图形用户界面的普通用户来说,是很实用的。你对此或许并不了解, 但绝大多数的图形化程序均可通过命令行启动.下面是一个例子:有一个被x 视窗系统支持的小程序叫xload - 用图形来表示系统加载的过程.你可以用下述命令来运行这个程序:

  • [me@linuxbox me]$ xload

注意,一个小xload窗口出现并开始显示系统加载的图形. 同样应注意到,在该程序启动后,提示符没有再出现. 在将控制权交给你之前, shell程序一直在等待xload程序结束. 如果你关闭xload 窗口, xload程序终止,提示符重又出现.

将一程序置于后台运行

现在, 为了让界面更加简洁, 我们将再次启动xload程序,但是这一次我们将其置于后台运行以便提示符能够及时出现. 故此,我们执行如下xload命令:

  • [me@linuxbox me]$ xload &
  • [1] 1223
  • [me@linuxbox me]$

在这个例子中,提示符因进程被置于后台运行得以重现.

现在想一下,如果我们忘记使用"&"符号将程序置于后台运行的情况. 我们仍有希望来实现这一效果. 你可以同时按下 ctrl 和 z 键使进程中止. 进程虽仍存在, 却被闲置起来. 要继续后台的进程,输入 bg 命令(backgroud的缩写). 举例如下:

  • [me@linuxbox me]$ xload
[2]+ Stopped xload
  • [me@linuxbox me]$ bg
[2]+ xload &

列举进程

现在,我们有一个进程在后台运行, 列举出已启动的进程供参考是很有用的. 要实现这一目的, 我们可以使用jobs 命令或功能更为强大的ps命令.

  • [me@linuxbox me]$ jobs
[1]+ Running xload &
  • [me@linuxbox me]$ ps
PID TTY TIME CMD
1211 pts/4 00:00:00 bash
1246 pts/4 00:00:00 xload
1247 pts/4 00:00:00 ps
  • [me@linuxbox me]$

杀死进程

假设有一个程序反应迟钝(啊,想起了Netscape这个程序 ) ,如果把它关掉呢? 当然, 你可以使用kill 命令. 让我们在启动xload命令时实践一下. 首先, 你必须确定你想杀死的进程号. 你可以用jobs 或 ps命令来查看. 如果你使用jobs 命令,你将得到一个job号. 调用ps, 你将得到一个进程号(PID) 以下将分别调用:

  • [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 bash
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命令被用于杀死进程时,其真实目的是用进程送出信号. 大多数情况下, 这一信号是指示进程停止运行, 但其内容不仅限于此. 当程序经过恰当的编写,用于监听从操作系统发出的信号并对此做出反应, 通常允许程序从容的中止.例如, 一个文本编辑器也许用于监听任何表示用户正在退出或计算机正在关闭的信号.当其收到该信号时, 在其退出前,保存进程的工作. Kill 命令能够向进程发出各种信号. 输入:

  • kill -l

将列出它所支持的信号. 大多数较为难懂, 但掌握以下几个非常有用:

-----------------------------------------------------------------------
信号#      名称      描述
-----------------------------------------------------------------------
1         SIGHUP  挂起信号.程序监听此信号并据此做出反应
-----------------------------------------------------------------------
2         SIGHNT  中断信号.该信号指示进程中断.程序处理此信号并据此做出反应. 
                  在程序运行的终端窗口,你可以通过按下ctrl和c 键来直接调用
-----------------------------------------------------------------------
15       SIGTERM  终止信号.该信号用于终止进程.程序处理此信号并据此做出反应.
                  在程序运行的终端窗口,你可以通过按下ctrl和c 键来直接调用.
                  在没有规定kill的信号下, 此为kill的默认信号.
-----------------------------------------------------------------------
9        SIGKILL  杀死信号.该信号通过linux 内核直接立即终止信号. 
                   程序不能监听此信号.
-----------------------------------------------------------------------

现在让我假设,你有一个程序--如Netscape--不能被挂起, 需要关掉它. 可按如下步骤操作:

1.用 ps 命令获取你想终止进程的进程号.
2 根据进程号调用kill命令.
3.如果该进程拒绝终止(如,它怱略该信号),发送高强制性信号直至其终止.
  • [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,同时kill接受用信号号码代替信号名称,通常使用下面的格式:

  • [me@linuxbox me]$ kill 2931

接下来, 如果进程没有终止, 用SIGKILL信号来强制其终止:

  • [me@linuxbox me]$ kill -9 2931

到此为止

shell学习入门系列到此结束.在下一系列"编写shell脚本"中,我们将探究如何用shell自行执行任务.


© 2000-2006, William Shotts, Jr. Verbatim copying and distribution of this entire article is permitted in any medium, provided this copyright notice is preserved.

Linux® is a registered trademark of Linus Torvalds.