您的位置:首页 > 运维架构 > Linux

Linux进程操作命令

2015-10-29 10:59 483 查看
Linux 内核通过使用进程,来管理多任务。

通过进程,Linux 安排不同的程序等待使用 CPU。

Linux中有关进程的命令:

ps – 报告当前进程快照

top – 显示任务

jobs – 列出活跃的任务

bg – 把一个任务放到后台执行

fg – 把一个任务放到前台执行

kill – 给一个进程发送信号

killall – 杀死指定名字的进程

shutdown – 关机或重启系统

进程是怎样工作的

当系统启动的时候,内核先把一些它自己的程序初始化为进程,然后运行一个叫做 init 的程序。

依次地,再运行一系列的称为 init 脚本的 shell 脚本(位于/etc),它们可以启动所有的系统服务。

其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户接口。 这样,即使我们没有登录系统,至少系统也在忙于执行一些例行事务。

一个程序可以发动另一个程序,这个事实在进程方案中,表述为一个父进程创建了一个子进程。

内核维护每个进程的信息,以此来保持事情有序。例如,系统分配给每个进程一个数字,这个数字叫做 进程 ID 或 PID

PID 号按升序分配,init 进程的 PID 总是1。

内核也对分配给每个进程的内存进行跟踪。

像文件一样,进程也有所有者和用户 ID,有效用户 ID,等等。

查看进程

查看进程,最常使用的是ps。ps程序有许多选项,它最简单地使用形式是这样的:

[me@linuxbox ~]$ ps
PID TTY           TIME CMD
5198 pts/1    00:00:00 bash
10129 pts/1   00:00:00 ps


上例中,列出了两个进程,进程 5198 和进程 10129,各自代表命令 bash 和 ps。

默认情况下,ps 不会显示很多进程信息,只是列出与当前终端会话相关的进程。

TTY 是 “Teletype” 的简写,是指进程的控制终端

TIME 字段表示 进程所消耗的 CPU 时间数量。正如我们所看到的,这两个进程使计算机工作起来很轻松。

如果给 ps 命令加上“x”选项:

[me@linuxbox ~]$ ps x
PID TTY   STAT   TIME COMMAND
2799 ?    Ssl    0:00 /usr/libexec/bonobo-activation-server –ac
2820 ?    Sl     0:01 /usr/libexec/evolution-data-server-1.10 --
…


加上 “x” 选项,告诉 ps 命令,展示所有进程,不管它们由什么终端控制。

在 TTY 一栏中出现的 “?” ,表示没有控制终端。使用这个 “x” 选项,可以看到我们所拥有的每个进程的信息。

因为系统中正运行着许多进程,所以 ps 命令的输出结果很长。这经常很有帮助,要是把 ps 的输出结果管道到 less 命令,借助 less 工具,更容易浏览。

输出结果中,新添加了一栏,标题为 STAT 。STAT 是 “state” 的简写,它揭示了进程当前状态:



另一个流行的选项组合是 “aux”, 这个选项组合,能够显示属于每个用户的进程信息:

[me@linuxbox ~]$ ps aux
USER   PID  %CPU  %MEM     VSZ    RSS  TTY   STAT   START   TIME  COMMAND
root     1   0.0   0.0    2136    644  ?     Ss     Mar05   0:31  init
root     2   0.0   0.0       0      0  ?     S<     Mar05   0:00  [kt]

...


用 top 命令动态查看进程

为了看到更多动态的信息,我们使用 top 命令:

[me@linuxbox ~]$ top


top 程序连续显示系统进程更新的信息(默认情况下,每三分钟更新一次),top 程序是用来查看系统中“顶端”进程的。

top 显示结果由两部分组成: 最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。

top 程序接受一系列从键盘输入的命令:

h,显示程序的帮助屏幕,q, 退出 top 程序。

控制进程

打开 xlogo 小程序,作为我们的实验品。

这个 xlogo 程序是 X 窗口系统提供的实例程序,这个实例简单地显示一个大小可调的包含X 标志的窗口。

首先,我们需要知道测试的主题:

[me@linuxbox ~]$ xlogo


命令执行之后,一个包含 X 标志的小窗口应该出现在屏幕的某个位置上。

通过调整它的窗口大小,我们能够证明 xlogo 程序正在运行。

注意,为什么我们的 shell 提示符还没有返回?

这是因为 shell 正在等待这个程序结束,就像到目前为止我们用过的其它所有程序一样。关闭 xlogo 窗口,shell提示符就返回了。

中断一个进程

我们再运行 xlogo 程序一次,观察一下发生了什么事。首先,执行 xlogo 命令,并且 证实这个程序正在运行。下一步,回到终端窗口,按下 Ctrl-c

[me@linuxbox ~]$ xlogo
[me@linuxbox ~]$


在一个终端中,输入 Ctrl-c,中断一个程序。

输入 Ctrl-c 之后,xlogo 窗口关闭,shell 提示符返回。

通过这个技巧,许多(但不是全部)命令行程序可以被中断。

把一个进程放置到后台(执行)

启动一个程序,让它立即在后台运行,我们在程序命令之后,加上”&”字符:

[me@linuxbox ~]$ xlogo &
[1] 28236
[me@linuxbox ~]$


执行命令之后,这个 xlogo 窗口出现,并且 shell 提示符返回,同时打印一些数字。

这条信息是 shell 特性的一部分,叫做工作控制

通过这条信息,shell 告诉我们,已经启动了 工作号为1(“[1]”),PID 为28236的程序。如果我们运行 ps 命令,可以看到我们的进程:

[me@linuxbox ~]$ ps
PID TTY         TIME   CMD
10603 pts/1   00:00:00   bash
28236 pts/1   00:00:00   xlogo
28239 pts/1   00:00:00   ps


工作控制,这个 shell 功能可以列出从终端中启动的任务。

执行 jobs 命令,我们可以看到这个输出列表:

[me@linuxbox ~]$ jobs
[1]+ Running            xlogo &


结果显示我们有一个任务,编号为“1”,它正在运行,并且这个任务的命令是 xlogo &。

进程返回到前台

一个在后台运行的进程对一切来自键盘的输入都免疫,也不能用 Ctrl-c 来中断它。使用 fg 命令,让一个进程返回前台执行:

[me@linuxbox ~]$ jobs
[1]+ Running        xlogo &
[me@linuxbox ~]$ fg %1
xlogo


fg 命令之后,跟随着一个百分号和工作序号(叫做 jobspec)。如果我们只有一个后台任务,那么 jobspec 是可有可无的。输入 Ctrl-c 来终止 xlogo 程序。

停止一个进程

有时候,我们想要停止一个进程,而没有终止它。这样会把一个前台进程移到后台等待。

输入 Ctrl-z,可以停止一个前台进程。让我们试一下。在命令提示符下,执行 xlogo 命令, 然后输入 Ctrl-z:

[me@linuxbox ~]$ xlogo
[1]+ Stopped                 xlogo
[me@linuxbox ~]$


停止 xlogo 程序之后,通过调整 xlogo 的窗口大小,我们可以证实这个程序已经停止了。

使用 fg 命令,可以恢复程序到前台运行,或者用 bg 命令把程序移到后台。

[me@linuxbox ~]$ bg %1
[1]+ xlogo &
[me@linuxbox ~]$


和 fg 命令一样,如果只有一个任务的话,jobspec 参数是可选的。

为什么要从命令行启动一个图形界面程序呢?

第一,你想要启动的程序,可能 没有在窗口管理器的菜单中列出来(比方说 xlogo)。

第二,从命令行启动一个程序, 你能够看到一些错误信息,如果从窗口系统中运行程序的话,这些信息是不可见的。

Signals

kill 命令被用来“杀死”程序。这样我们就可以终止需要杀死的程序。这里有一个实例:

[me@linuxbox ~]$ xlogo &
[1] 28401
[me@linuxbox ~]$ kill 28401
[1]+ Terminated               xlogo


首先,我们在后台启动 xlogo 程序。shell 打印出 jobspec 和这个后台进程的 PID。下一步,我们使用 kill 命令,并且指定我们想要终止的进程 PID。也可以用 jobspec(例如,“%1”)来代替 PID。

这个 kill 命令不是确切地“杀死”程序,而是给程序 发送信号。

信号是操作系统与程序之间进行通信,所采用的几种方式中的一种。我们已经看到 信号,在使用 Ctrl-c 和 Ctrl-z 的过程中。当终端接受了其中一个按键组合后,它会给在前端运行 的程序发送一个信号。在使用 Ctrl-c 的情况下,会发送一个叫做 INT(中断)的信号;当使用 Ctrl-z 时,则发送一个叫做 TSTP(终端停止)的信号。程序,反过来,倾听信号的到来,当程序 接到信号之后,则做出响应。

通过 kill 命令给进程发送信号

kill 命令被用来给程序发送信号。它最常见的语法形式看起来像这样:

kill [-signal] PID...


如果在命令行中没有指定信号,那么默认情况下,发送 TERM(终止)信号。kill 命令被经常用来发送以下命令:



让我们实验一下 kill 命令:

[me@linuxbox ~]$ xlogo &
[1] 13546
[me@linuxbox ~]$ kill -1 13546
[1]+ Hangup         xlogo


在这个例子里,我们在后台启动 xlogo 程序,然后通过 kill 命令,发送给它一个 HUP 信号。

注意,既可以用号码,也可以用名字,不过要在名字前面 加上字母“SIG”,来指定所要发送的信号。

进程,和文件一样,拥有所有者,所以为了能够通过 kill 命令来给进程发送信号, 你必须是进程的所有者(或者是超级用户)。

除了上表列出的 kill 命令最常使用的信号之外,还有一些系统频繁使用的信号。以下是其它一些常用信号列表:



通过下面的命令可以得到一个完整的信号列表:

[me@linuxbox ~]$ kill -l


通过 killall 命令给多个进程发送信号

也有可能通过 killall 命令,给匹配特定程序或用户名的多个进程发送信号。下面是 killall 命令的语法形式:

killall [-u user] [-signal] name...


为了说明情况,我们启动一对 xlogo 程序的实例,然后再终止它们:

[me@linuxbox ~]$ xlogo &
[1] 18801
[me@linuxbox ~]$ xlogo &
[2] 18802
[me@linuxbox ~]$ killall xlogo
[1]- Terminated                xlogo
[2]+ Terminated                xlogo


记住,和 kill 命令一样,你必须拥有超级用户权限才能给不属于你的进程发送信号。

其他进程相关的命令

因为监测进程是一个很重要的系统管理任务,所以有许多命令与它相关。



知识来源:http://billie66.github.io/TLCL/book/zh/chap11.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: