Linux探索之旅 | 第三部分第三课:监视系统活动,滴水不漏
《Linux探索之旅》全系列
内容简介
- 第三部分第三课:监视系统活动,滴水不漏
- 第三部分第四课预告:后台运行及合并多个终端
监视系统活动,滴水不漏
经过上一课 Linux探索之旅 | 第三部分第二课:流、管道、重定向,三管齐下 的锤炼,现在大家对Linux的命令行应该有了新的认识,而且水准大概已经提高到了一个不错的档次。如果你还没有,快,快去给我练习去~
上一课算是比较难的,大家都辛苦了。所以这课给大家轻松一下,可以愉快地学完~
放眼现在的操作系统,基本都是多任务操作系统了,Linux当然也不例外。因此,Linux可以管理多个同时运行的程序。
通过之前的课程Linux探索之旅 | 第二部分第五课:用户和权限,有权就任性,我们知道,Linux也是一个多用户的系统。多个用户可以同时在不同地方通过网络连接到同一个Linux系统上进行操作。
多用户多任务的特点有好处,但也有隐患。可能某个用户或者某个任务(其实就是运行着的程序)在某时让Linux系统过载了,就是有点太累了,任务太繁重了。
这时,我们很可能想知道:
到底是哪个“小子”干了这等好事?
是哪个程序胆敢宕我的系统?
如何才能停止一个不再响应的程序?
在Windows系统下,我们可能常听说用超级组合键《Ctrl + Shift + Delete》来调出任务管理器,结束未响应的程序。
在Linux下,我们会用其他工具和别样的技术来处理僵局。这一章我们会学到不少新的Linux命令。
闲话不说,我们开始学习吧。
w命令:都有谁,在做什么?
第一个出场的命令是迄今为止我们遇到过的最短的命令,这个命令只有一个字母:w
就是这么一个很简单的命令,却挺实用,它可以帮助我们快速了解系统中目前有哪些用户登录着,以及他们在干什么。
如果你负责一台Linux服务器,有时候它会过载,变得很慢,这时你可以登录此服务器,然后运行w命令,快速了解到底发生了什么事。
但是对于大部分读者,他们是在自己的个人电脑上学习本课程的,他们的Linux系统一般只登录了一个用户,就是他们自己。所以用w命令之后,只显示个人用户的信息。
如上图所见,目前Linux系统中只有一个用户登录,就是小编自己的用户,名叫oscar。
w命令输出的信息虽然短,但是比较密集,看第一眼并不容易了解到底是什么。但其实w命令给出的信息非常有用。
我们将其分解成不同的部分来解释,按照从上到下,从左到右的顺序。
时间(用date命令也可以做到)
我们看到信息的第一行中有 17:36:13,这就是当前时间:17点36分13秒。
我们之前学过date这个命令,它可以显示当前日期,时间,和时区:
可以看到date命令显示当前时间:Mon Sep 14 17:50:57 CEST 2015
Mon是Monday的缩写,表示《星期一》。
Sep是September的缩写,表示《九月》。
14是日期,表示14日。所以是9月14日。
17:50:57是当前时间。17点50分57秒。
CEST是欧洲中部夏令时间(Central European Summer Time,简称CEST),比世界标准时间(UTC)早两个小时的时区。因为我在法国。
2015是年份,就是2015年。
date命令的输出中的17:50:57就是w命令中的时间那部分。
运行时间(用uptime命令也可以做到)
w命令的输出中,紧跟在当前时间后面的是 up 25 min
up是英语《运行正常的》的意思。min是英语minute的缩写,表示《分钟》。
所以 up 25 min 表示系统已经运行了25分钟了,就是从开机登录到现在经过的时间。
这个信息还是挺有用的,因为一旦系统重启或关机,那么运行时间会重归0。
在Windows中,很多程序一旦安装完成,经常会要求重启系统来完成安装。
但Linux中不需要如此,一般只有系统的内核升级才需要重启系统。这也是Linux被大量用作服务器的原因,因为一般网站的服务器最好能够7天24小时不重启,一直运行。
系统正常运行时间一般就称为uptime,Linux中有一个uptime命令可以显示。
可以看到,uptime的输出其实就是w命令的第一行的内容,一模一样。
很多大型网站的服务器,如果你用uptime命令来获知其正常运行时间,可能会出现令你惊讶的好几百天的结果。
Linux的稳定性和抗病毒性包您满意
负载(同样可以用uptime命令获知)
在w命令的输出的第一行的右边,有三个数值,表示负载:
load average: 0.15, 0.11, 0.09
load是《负载,负荷》的意思,average是《平均值》的意思。负载是系统活动的一个指标:
这三个数值从左到右分别表示:
1分钟以内的平均负载(0.15)。
5分钟之内的平均负载(0.11)。
15分钟之内的平均负载(0.09)。
这些数值具体表示什么呢?
说起来稍微有点复杂。阅读手册,我们可以知道:这些数值表示一段时间内的平均活跃进程数(也就是使用CPU处理器的进程数。进程简单地说就是运行起来的程序)。
由此可知,近1分钟内平均有0.15个进程使用了处理器,也就是说处理器有15%的时间是活跃的。
负载的数值也取决于电脑的处理器的核心数目。一个单核的处理器如果负载超过了1,那就是过载了。双核的处理器如果负载超过了2,那就是过载了。四核的处理器如果负载超过了4,那就是过载。依次类推。
有的服务器过载的时候负载的数值甚至能达到50那么多。
如果负载值在较长的时间中都维持比较大的话,就说明系统出问题了。我们可以用tload命令来绘制随时间变化的负载《曲线》图。
tload
tload命令的输出(随时间变化):
图中横坐标是时间,纵坐标的高低表示负载大小,左边猛然上升的纵坐标值是因为小编打开了火狐浏览器。
登录的用户列表(用who命令也可以做到)
w命令的输出中,除去第一行,下面的行可以归为一个部分,就是登录的用户列表。
这几行信息显示当下系统中连接的用户是哪几位,他们在做什么任务,任务进行多长时间了。
可以看到,有两行都是以oscar开头,我目前是在自己的个人电脑上,所以Linux系统中只有我一个用户登录,那为什么有两行oscar呢?我们先来了解下各列的意义,就会明白了。
USER:用户名(登录名)。user是英语“用户”的意思。
TTY:Linux中默认提供了六个命令行终端和一个图形终端:tty1~tty7。其中tty1~tty6是命令行终端(就是全屏,黑底白字的控制台,以前的Linux探索之旅 | 第二部分第一课:终端Terminal,好戏上场这一课介绍过),tty7是图形终端(也就是平时我们启动Ubuntu桌面版时默认登录的图形用户界面,也是全屏的)。Ubuntu中可以通过Ctrl+Alt+F1~F7切换这7个终端。除了这7个基本的《大环境》终端,我们还可以在tty7中开很多不是全屏的终端,也就是我们平时用来输入命令行的图形终端(ctrl + shift + T快捷键),这些终端的名字是以pts开头的。pts是pseudo terminal slave的缩写,表示“伪终端从属”。如果我新开一个图形终端,那么显示名称为pts/0,如上图中所示。如果我再开一个图形终端,那么它的名字就是pts/1。依次类推。
FROM:用户连接到的服务器的IP地址(或者主机名)。在我们的例子中,我们并没有登录远程服务器,只是在本地自己的电脑上测试,所以FROM那列显示的并不是实际的IP地址。from是英语“从...”的意思
LOGIN@:用户连接系统的时间。login是英语“登录”的意思。
IDLE:用户有多久没活跃了(没运行任何命令)。idle是英语“不活跃的”的意思。
WHAT:当下用户正运行的程序。what是英语“什么”的意思。
在小编的情况,我们看到有两个用户,有两个oscar。第一个oscar对应的是登录Ubuntu系统的用户,也就是我们开机后登录的用户,进入的是Ubuntu的图形用户界面,可以从WHAT那列的信息看出来,这里是gnome-sessi,是gnome session(session是英语“会话”的意思)的缩写,表示Gnome这个桌面系统。第二个oscar对应的是打开当前我们正在操作的这个图形终端的用户,也是oscar,不过TTY那列是pts/0,WHAT那列是w,说明用户运行了w命令。没错啊,因为这些信息就是w命令运行的输出结果。
w命令虽然很有用,但是给出的信息还是不够详尽。我们下面来看看如何获得详细的系统进程的信息。
ps命令和top命令:列出运行的进程
简单说来,进程就是加载到内存中运行的程序。
大多数程序运行时都只在内存中启动一个进程。例如Linux中的OpenOffice这个软件。有的程序运行时却会创建不少进程,例如Google的Chrome浏览器,每开一个标签栏都会创建一个新的进程。
在网络服务器上,一般我们都是用Apache这个软件来发送网页给网民。Apache在运行时就会创建很多进程,分别负责不同的任务。一般的数据库软件,例如MySQL,PostgreSQL也是如此。
因此,假如你发现一个程序创建了好多个进程的话,并没有什么好吃惊的。
在Windows中,我们要查看系统中运行的进程,会使用Ctrl + Alt + Delete快捷键,调出任务管理器,然后点击《进程》这个菜单。
在Linux中,我们有两个命令可以帮助我们查看系统中运行的进程。
ps:进程的静态列表
ps是Process Status的缩写,process是英语《进程》的意思,status是《状态》的意思,所以ps命令用于显示当前系统中的进程。
ps命令显示的进程列表不会随时间而更新,是静态的,只是运行ps命令当时的那个状态,或者说是一个进程的快照,英语称为snapshot,就好像照了一张照片一样。
我们试着不加任何参数直接运行ps命令:
可以看到显示结果有四列:
PID:进程号。pid是process identifier的缩写。每个进程有唯一的进程号。之后我们学习如何结束进程时需要用到进程号。
TTY:进程运行所在的终端。
TIME:进程运行了多久。
CMD:产生这个进程的程序名。如果你在进程列表中看到有好几行都是同样的程序名,那么就是同样的程序产生了不止一个进程(例如MySQL程序)。
在小编的情况,我们运行ps命令时显示了两个进程正在运行,一个是bash,也就是操控当前终端的shell程序。另一个是ps命令自己。
两个进程,这就是全部了?
当然不是。ps命令不带参数使用时只会列出当前运行ps命令的用户在当前这个终端中所运行的进程。有好多进程是root用户运行的,就没列出来。还有的进程,虽然也是当前用户运行的,但不是在当前的终端里,所以也没列出来。
ps命令有很多不同的参数。你可以用man ps来查看。可不要被众多的选项参数吓到。
我们不可能介绍每个参数,下面就介绍一些常用的参数吧。
ps -ef:列出所有进程
-ef参数可以使ps命令列出所有用户在所有终端的所有进程。
ps -ef
可以看到,用了-ef参数,因为列出所有用户的所有进程,所以比刚才不加参数的ps命令多了一些列。
例如第一列UID,是user identifier的缩写,表示《用户名》,也就是运行进程的用户。
ps -efH:以乔木状列出所有进程
ps -efH
比上面的-ef多加了一个H参数,可以使ps命令按照乔木状列出进程。有的进程是某些进程的子进程。
比如上图中,我们可以看到/sbin/init这个程序(进程)就启动了其他的进程,比如udevd --daemon,portmap,smbd -F,等等。
ps -u 用户名:列出此用户运行的进程
ps -u
我们就用当前用户来测试看看:
可以看到有不少进程,单独用ps的时候只有两个进程,那是因为有好多进程不是在pts/0那个终端里运行的。
top:进程的动态列表
ps命令虽然强大,但有一个缺陷:是静态的,只能记录当下那一刻的进程列表。
但事实上,我们的系统是时刻变化的。有些进程这一秒在运行,下一秒可能就被终止了。所以ps命令并不能帮助我们实时监控系统的进程。
怎么才能获取一个随时间一直在变的进程列表呢?就需要用到top命令了。
top
这个列表是交互性的,而且实时更新。
第一行,你可以看到当前时间(04:02:41,就是凌晨4点02分41秒),系统运行时间(3:52,也就是3个小时52分钟),用户数目(2 users,就是“两个用户”),平均负载(load average: 0.50, 0.34, 0.25)。
接下来的几行,我们不过多解释了,因为这涉及到操作系统的一些概念。
在下面,PID,USER,PR,NI,VIRT,RES,SHR,S,%CPU,%MEM,TIME+,COMMAND开始的那个列表就是进程列表了。
但为什么相比之前ps -ef时进程少了这么多呢?
因为top命令无法显示全部的进程。它只显示排在前面的一些进程,为了整个信息区域正好占据终端中一个页面的大小。
默认地,这些进程是按照使用处理器的比率来排序的,从大到小(按照%CPU那一列的数值),最消耗处理器的进程排在最前面。所以如果你觉得自己的系统变慢了,过载了,查看列表中最开始的几个进程是个好主意。
前面说过了,top命令输出的信息页面不但是动态变化的,而且是可交互的。
我们用一些键盘的按键可以控制top的显示结果。
q:退出top
h:显示帮助文档,也就是哪些按键可以使用。按下任意键返回。
B:大写的B,加粗某些信息。
f:在进程列表中添加或删除某些列。
F:改变进程列表排序所参照的列。默认情况下,是按照%CPU那一列来排序。
u:依照用户来过滤显示。可以输入用户名,按回车。
k:结束某个进程。会让你输入要结束的进程的PID。
s:改变刷新页面的时间。默认地,页面每隔3秒刷新一次。
当然了,Linux下有很多优秀的软件,做得比top和ps更好,例如:
Linux中比Top颜值更高的系统监控工具Glances
Ctrl + C和kill命令:停止进程
有时候,系统会卡住。这在Linux中也是会发生的。
在Linux中停止进程有几种方法:
Ctrl + C:停止终端中正在运行的进程
Ctrl + C这个组合快捷键还是需要知道的,因为它可以比较友好地中止终端中正在运行的程序(进程),这个组合键也只在终端中会这样执行,如果在普通的图形界面中,它就是拷贝的快捷键,与Windows下无异。
顺便讲一个Linux下的小技巧,比如我们在终端下,用鼠标选中一段文字,然后按一下鼠标中间的滚轮,就会在终端里黏贴选中的文字。
而在终端中拷贝和黏贴,需要用“Ctrl+Shift+C”和“Ctrl+Shift+V”来执行。
kill命令:结束一个进程
Ctrl + C这个组合键只能作用于当前终端中正在运行的程序,而Linux中,很多进程是你看不到的,在后台运行。
这时候就需要请出kill命令了。
kill是英语《杀死》的意思,虽然有点“小暴力”,但是这个命令却很有用。
kill命令后接需要结束的进程号,也就是之前我们看到过的PID。是一个数字,我们可以通过ps命令或top命令来获知进程的PID。
例如:
kill 8461
我们也可以同时用kill来结束好几个进程,只要用空格隔开它们的PID:
kill 8461 8561 1706
有时候,kill命令虽然作用于一个进程,但是它不终止,卡住了(因为kill命令会很友善地结束进程)。那怎么办呢?有没有比较简单粗暴的方式呢?
是有的,我们可以用kill -9来立即强制结束进程。比如:
kill -9 7291
立即结束PID是7291的进程,非常“野蛮粗暴”。
killall:结束多个进程
记得我们之前提过,同一个程序运行时可能启动多个进程。如果你想一下子结束所有这些进程,怎么做呢?
当然,你可以用kill + PID的方式一个个地结束这些进程,但是我们有一个更快捷的命令:killall。
all是英语《全部》的意思,所以killall命令就是用于结束全部要结束的进程。
不同于kill命令,killall命令后接程序名,而不是PID(进程号)。
假设现在我开了好几个图形终端,在每一个中我都运行find命令进行文件的查找。
这样,我用 ps -u oscar | grep find就可以搜索出好多个find的进程。
如果我要结束所有这些find进程,可以这么做:
killall find
halt命令和reboot命令:停止和重启系统
既然我们刚学了如何用kill命令来结束进程,那么现在我们该来学习一下如何关闭和重启整个Linux系统了吧。
虽然你肯定已经知道如何用图形界面的操作方式来关闭和重启系统了。但是用命令行,也许你还不知道怎么做吧。
halt:关闭系统
需要以root身份才能关闭系统,所以我们可以这么做:
sudo halt
reboot:重启系统
同样地,需要以root身份才能重启系统,我们可以这么做:
sudo reboot
实际上,halt和reboot这两个命令都调用了Linux的另一个命令:shutdown
大家可以阅读shutdown命令的手册,也可以自行去网上搜索一下如何用shutdown命令来实现定时关机或重启(有很多教程)。
算是留给大家的小作业了。
其实还有一个命令:poweroff也可以用于关机,而且非常有效率。
poweroff
总结
Linux是多任务多用户的操作系统。
w命令会显示当下有哪些用户在系统上登录着,在做什么,还可以获知系统时间,持续运行时间,负载等信息。
ps命令显示进程的快照,是静态的。top命令是动态可交互的,会实时更新页面。
组合键Ctrl + C结束当前终端中正在运行的程序。
kill命令用于结束进程,后接进程的PID(一个数字)。如果kill这个比较友好的结束命令不起作用,进程依旧卡住,那么我们可以使用kill -9来强制结束进程。
halt命令关闭系统,reboot命令重启系统。
第三部分第四课预告
今天的课就到这里,一起加油吧!
下一课我们学习:Linux探索之旅 | 第三部分第四课:后台运行及合并多个终端