Linux例行工作与系统管理

2023-01-26 19:32:52 浏览数 (1)

Linux 系统的任务是由crond这个系统服务来控制的,Linux系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外,由于使用者自己也可以设置计划任务,所以Linux系统也提供了使用者控制计划任务的命令,crontab,at,等命令,下面的配置我们将逐一说明这些命令的使用方法.

Linux系统例行工作

Linux上例行工作的常用作用

如果你曾经使用过 Linux 一阵子,那么你大概会发现到 Linux 会主动的帮我们进行一些工作,比如:自动升级、自动updatadb更新文件名数据库,自动进行日志文件的分析工作,这些功能的实现其实说白了就是操作系统自己的例行工作.基本上 Linux 系统常见的例行工作有:

● 进行日志文件的轮询(log rotate) Linux系统会主动记录系统所发生的各种信息,这就是日志文件,如果不进行轮询,日志文件会越来越大,因此系统的默认计划任务,会自动帮助我们实现日志的轮询工作.

● 进行日志文件分析任务(logwatch) 如果系统发生了软件问题,硬件错误,绝大多数的错误信息,都会被记录到日志文件中,我们的系统提供了一个程序,logwatch来主动分析日志信息,这也是系统的计划任务的其中一部分.

● 更新文件查询数据库(locate) 当我们使用locate进行文件查找是,是不是感觉速度很快,其实它并没有查询文件目录,而是直接读取/var/lib/mlocate/中的数据,所以查询速度快,我们的系统会在每次开机时自动执行updatedb来更新这个数据库文件.

● whatis数据库的建立 这个数据库与locate数据库类似,whatis数据库是与man page相关的查询命令,不过要使用whatis数据库,需要更新whatis数据库,这个工作也是通过系统的例行工作来完成的.

● RPM日志文件的建立 由于系统可能会常常更新软件,包括软件的安装、升级等,都会造成软件名的差异,为了方便以后的管理工作,系统也帮我们将软件名做个排序并记录下来,有时候系统也会通过系统调度来帮RPM的数据库的生成.

● 删除一些临时文件 当我们的系统运行过一段时间后,会产生很多的系统垃圾,如果不清理,会影响以后的系统维护,系统通过例行工作,在一段时间后执行,tmpwatch的命令来删除这些临时数据的.

其实你的系统会进行的例行性工作与你安装的软件多少有关,如果你安装过多的软件,某些服务功能的软件都会附上分析工具,那么你的系统就会多出一些例行性工作,其实也就增加了系统的负担.

◆at 系统定时任务◆

at命令用于在指定时间执行命令,at允许使用一套相当复杂的指定时间的方法.它能够接受在当天的hh:mm(小时:分钟)式的时间指定.假如该时间已过去,那么就放在第二天执行.当然也能够使用midnight(深夜),noon(中午),teatime(饮茶时间,一般是下午4点),等比较模糊的词语来指定时间.用户还能够采用12小时计时制,即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午.也能够指定命令执行的具体日期,指定格式为month day(月 日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定的日期必须跟在指定时间的后面.

上面介绍的都是绝对计时法,其实还能够使用相对计时法,这对于安排不久就要执行的命令是很有好处的.指定格式为:now count time-units,now就是当前时间,time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期).count是时间的数量,究竟是几天,还是几小时,等. 更有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间.

at 命令的运行方式. 事实上,我们使用 at 这个命令来添加所要运行的工作,并将这个工作以文本格式方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与运行了,就这么简单,不过,并不是所有的人都可以进行 at 定时任务,at命令有以下排除方式.

我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制,加上这两个文件后 at 的工作情况其实是这样的: ● 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at 没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中) ● 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at 而没有在这个 at.deny 文件中的使用者,就可以使用 at ● 如果两个文件都不存在,那么只有 root 可以使用 at 这个命令.

通过上面的说明:我们知道 /etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散.在一般的发行版当中,由于假设系统上的所有用户都是可信任的,因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 命令的意思(您可以自行检查一下该文件).不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的帐号写入 /etc/at.deny 即可.一个帐号写一行.

在介绍命令之前我们首先要说明的是,这个at命令,在精简版的系统中是不存在的,我们首先要先安装一下,并设置为开机自启动.

代码语言:javascript复制
[root@localhost ~]# yum install -y at
[root@localhost ~]# systemctl restart atd
[root@localhost ~]# systemctl enable atd

接着继续来看一下at命令的常用语法吧.

代码语言:javascript复制
[root@localhost ~]# at --help

语法格式:[ at [选项] ]

        -m              #执行结束发送通知邮件(执行此命令的用户)
        atq             #查看计划任务
        atrm            #删除计划任务
        -c 工作号        #查看对应工作号的详细信息

事实上,当我们使用 at 时会进入一个 at shell 的环境来让用户执行工作命令,此时建议你最好使用绝对路径来执行你的命令,由于在at工作调度的使用上,系统会将该项at工作独立出你的bash环境中,直接交给atd程序来接管,也就是说,当我们执行了at命令的时候,就可以立即脱机啦,系统会帮我们执行.

定时1: 在两天后的下午 5 点钟,执行/bin/ls命令

代码语言:javascript复制
[root@localhost ~]# at 5pm 2 days
at> /bin/ls
at> CTRL  D

job 6 at Mon Oct  1 17:00:00 2018

定时2: 在明天17点30分,输出时间到指定文件内

代码语言:javascript复制
[root@localhost ~]# at 17:30 tomorrow
at> date >/root/22018.log
at> CTRL  D

job 7 at Sun Sep 30 17:30:00 2018

atq查询任务: 通过使用 atq 命令查看系统中的计划任务

代码语言:javascript复制
[root@localhost ~]# atq
4       Mon Oct  1 17:00:00 2018 a root
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root

删除at任务: 删除一个已设置的计划任务

代码语言:javascript复制
[root@localhost ~]# atq
4       Mon Oct  1 17:00:00 2018 a root
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root

[root@localhost ~]# atrm 4

[root@localhost ~]# atq
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root

显示指定at任务: 显示指定设置计划的任务内容

代码语言:javascript复制
[root@localhost ~]# atq
6       Mon Oct  1 17:00:00 2018 a root
7       Sun Sep 30 17:30:00 2018 a root

[root@localhost ~]# at -c 7
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
XDG_SESSION_ID=1; export XDG_SESSION_ID
....

其他小例子: 其他定时例子

代码语言:javascript复制
Minute    at now   5 minutes   任务在5分钟后运行
Hour      at now   1 hour      任务在1小时后运行
Days      at now   3 days      任务在3天后运行
Weeks     at now   2 weeks     任务在两周后运行
Fixed     at midnight          任务在午夜运行
Fixed     at 10:30pm           任务在晚上10点30分
Fixed     at 23:59 12/31/2018 任务在2018年12月31号23点59分  

◆jobs 工作管理◆

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务.该命令可以显示任务号及其对应的进程号.其中任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的,一个任务可以对应于一个或者多个进程号.

在Linux系统中执行某些操作时候,有时需要将当前任务暂停调至后台,或有时须将后台暂停的任务重启开启并调至前台,这一序列的操作将会使用到 jobs、bg、和 fg 三个命令以及两个快捷键来完成.

这个工作管理 (job control)是用在 bash 环境下的,也就是说:『当我们登陆系统取得一个shell之后,在单一终端下同时进行多个工作的行为管理 』.举例来说,我们在登陆 bash 后,想要一边复制文件、一边进行数据搜寻、一边进行编译,还可以一边进行 vi 程序编写,这就是实现了在一个终端的情况下进行多个工作任务.

假设我们只有一个终端,因此在可以出终端提示符让你操作的环境就称为前台(foreground),其他工作就可以让你放入后台(background)去暂停或者运行,这里要注意的是,放入后台的工作想要运行的话,它必须不能与用户交互.而放入后台的工作无法使用Ctrl C来终止.

总之要进行bash的job control管理必须注意以下限制: ● 这些工作所触发的进程必须来自于你的shell的子进程 ● 前台:当前终端正在进行标准输出到显示器上的工作 ● 后台:不用将命令执行过程标准输出到显示器的工作 ● 后台中:后台中的进程是正在运行的,不能使用强制终止 ● 当前终端的工作只能当前终端管理,其它终端不能管理 ● 放入后台的工作必须是能持续运行的,否则程序会被暂停

那么如何将工作放到后台 ? 通过命令 & 可以将工作转到后台,并持续运行 通过热键 ctrl z 可以将工作放到后台,并暂停执行

说了这么多理论,下面说一下jobs命令的语法,以及常用参数

代码语言:javascript复制
[root@localhost ~]# jobs --help

语法格式:[ jobs [选项] ]

        -l 			#显示工作进程PID
        -r 			#列出后台正在运行的工作
        -s 			#列出后台暂停的工作

命令放入后台: 通过 & 符号将vim编辑器放入后台

代码语言:javascript复制
[root@localhost ~]# vim lyshark.sh &
[1] 1294

[root@localhost ~]#
[1]   Stopped                 vim lyshark.sh

[root@localhost ~]# jobs -l
[1]   1294 Stopped (tty output)    vim lyshark.sh

杀死后台任务: 终止序号是[1]的那个后台任务

代码语言:javascript复制
[root@localhost ~]# jobs -l
[1]   1294 Stopped (tty output)    vim lyshark.sh

[root@localhost ~]# kill -9 %1
[1]   Stopped                 vim lyshark.sh
[1]   Killed                  vim lyshark.sh

[root@localhost ~]# jobs -l

恢复暂停工作: 使用fg命令,将后台暂停的工作恢复到前台,继续执行

代码语言:javascript复制
[root@localhost ~]# jobs -l
[1]   1296 Stopped (tty output)    vim lyshark.sh
[2]-  1297 Stopped (tty output)    vim lyshark.sh
[3]   1298 Stopped (tty output)    vim lyshark.sh

[root@localhost ~]# fg %1
vim lyshark.sh

激活后台工作: 使用bg让后台工作脱离终端运行,就是激活工作

代码语言:javascript复制
[root@localhost ~]# jobs -l
[2]-  1297 Stopped (tty output)    vim lyshark.sh
[3]   1298 Stopped (tty output)    vim lyshark.sh

[root@localhost ~]# bg %2
[2]- vim lyshark.sh &

[2]   Stopped                 vim lyshark.sh

◆crond 例行工作◆

crontab命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务,相对于 at 是仅运行一次的工作,循环运行的例行性工作的调度则是由 crond 这个系统服务来控制的,这个系统服务是默认启动的.

用户如果想添加计划任务的话,可以使用crontab命令设置,不过为了安全性的问题,与at命令类似我们也可以通过配置文件限制用户列表,下面我们先来看一下他的两个配置文件吧.

● /etc/cron.allow 此配置文件记录可以使用crontab任务的用户,若不在这个文件内的用户则不可以使用crontab

● /etc/cron.deny 此配置文件记录了不可以使用crontab设定计划任务的用户列表

同样的,以优先顺序来说 /etc/cron.allow/etc/cron.deny 要优先,而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可,免得影响自己在配置上面的判断,一般来说,系统默认是保留 /etc/cron.deny 这个配置文件的,你可以将不想让他运行 crontab 的那个使用者写入 /etc/cron.deny 当中,书写格式是一个帐号一行.

另外当使用者使用 crontab 这个命令来新建工作调度时,该项任务就会被纪录到 /var/spool/cron/ 里面去,而且是以帐号来作为判断依据的,cron 运行的每一项工作都会被纪录到 /var/log/cron 这个文件里,所以如果你的 Linux 不知道是否被植入木马时,也可以搜寻一下 /var/log/cron 这个文件,查看一些.

Linux下的任务调度分为两类:系统任务调度和用户任务调度

系统任务调度: 系统周期性所要执行的工作,比如写缓存数据到硬盘,日志清理等,在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件,也就是说,如果我想让所有用户都执行这些任务,可以将此任务写入 /etc/crontab 这个文件里,这样一来无论使用那个用户登录,都会执行这些任务.

/etc/crontab文件包括下面几行:

代码语言:javascript复制
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=""HOME=/

# run-parts
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置crond任务运行的环境变量 第一行:SHELL变量指定了系统要使用哪个shell,这里是bash 第二行:PATH变量指定了系统执行命令的路径 第三行:MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户 第四行:HOME变量指定了在执行命令或者脚本时使用的主目录

用户任务调度: 用户定期要执行的工作,比如用户数据备份、定时邮件提醒等,用户可以使用 crontab 工具来定制自己的计划任务,所有用户定义的crontab文件都被保存在/var/spool/cron目录中,其文件名与用户名一致,使用者权限文件如下:

代码语言:javascript复制
/etc/cron.deny     该文件中所列用户不允许使用crontab命令
/etc/cron.allow    该文件中所列用户允许使用crontab命令
/var/spool/cron/   所有用户crontab文件存放的目录,以用户名命名

crontab文件的含义: 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

代码语言:javascript复制
--------------------------------------------------------------------------------------
[分钟]     [小时]   [天]      [月]     [周]    [执行命令]
--------------------------------------------------------------------------------------
minute     hour     day      month     week   command         顺序:分 时 日 月 周
--------------------------------------------------------------------------------------
0-59       0-23     1-31      1-12     0-7    command         范围:数字范围
--------------------------------------------------------------------------------------

	minute            表示分钟,(1-59)
	hour              表示小时,(1-23)
	day               表示日期,(1-31)
	month             表示月份,(1-12)
	week              表示星期几(0-7)
	command           要执行的命令
--------------------------------------------------------------------------------------
在以上的各个字段中,还可以使用以下特殊字符:

	星号  *           代表所有可能的值
	逗号  ,           可以用逗号隔开的值指定一个列表范围
	中杠  -           可以用整数之间的中杠表示一个整数范围
	正斜线 /          可以用正斜线指定时间的间隔频率
--------------------------------------------------------------------------------------

光说不练等于零,下面是crontab命令的语法,以及常用参数,紧接着我来举几个小例子吧.

代码语言:javascript复制
[root@localhost ~]# crontab --help

语法格式:[ crontab [选项] ]

        -e          #编辑计划任务
        -l          #查看已存在的计划任务
        -r          #删除计划任务
        -u<用户名>   #指定用户

实例1: 周一到周五每天17:00,执行任务

代码语言:javascript复制
0 17 * * 1-5 echo "1" > /proc/sys/vm/drop_caches

实例2: 每周一、三、五的8点30分,执行任务

代码语言:javascript复制
30 8 * * 1,3,5 echo "1" > /proc/sys/vm/drop_caches

实例3: 8点到18点之间每隔2小时执行一次

代码语言:javascript复制
0 8-18/2 * * * echo "1" > /proc/sys/vm/drop_caches

实例4: 每隔3天执行一次计划任务

代码语言:javascript复制
0 * */3 * * echo "1" > /proc/sys/vm/drop_caches

实例5: 每分钟执行一次,计划任务

代码语言:javascript复制
* * * * * echo "1" > /proc/sys/vm/drop_caches

实例6: 每小时第3,和第15分钟执行一次

代码语言:javascript复制
3,15 * * * * echo "1" > /proc/sys/vm/drop_caches

实例7: 在上午8点到11点的,第3和第15分钟执行

代码语言:javascript复制
3,15 8-11 * * * echo "1" > /proc/sys/vm/drop_caches

实例8: 每隔两天的,上午8点到11点,的第3和第15分钟执行

代码语言:javascript复制
3,15 8-11 */2 * * echo "1" > /proc/sys/vm/drop_caches

实例9: 每个星期一的上午8点到11点的第3和第15分钟执行

代码语言:javascript复制
3,15 8-11 * * 1 echo "1" > /proc/sys/vm/drop_caches

实例10: 每月1、10、22日的4 : 45重启smb

代码语言:javascript复制
45 4 1,10,22 * * /etc/init.d/smb restart

Linux系统进程管理

一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为程序(process).程序是操作系统上非常重要的概念,所有系统上面跑的数据都会以程序的类型存在.在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID 称为 PID,同时依据触发这个进程的相关用户与相关属性关系,给予这个 PID 一组有效的权限设置』 从此以后这个 PID 能够在系统上面进行的动作,就与这个 PID 的权限有关了.

什么是程序? 如何产生一个程序? 我们通过执行一个程序或一个命令,就可以产生一个事件从而取得一个PID,我们的系统只认识二进制文件,当我让系统工作时当然就需要触发二进制文件,那个被触发的东西就叫做程序(program).通俗地说,能够代替人管理操作系统,完成特定任务,解决特定问题的一段代码的集合就是程序.

什么是进程? 如何产生一个进程? 程序一般是放在磁盘中的,当我们的程序被触发后,执行者的权限与属性,都会被加载到内存,操作系统并给予这个内存单元一个标识符(PID),可以这么说,进程就是一个正在运行的程序.

关于系统的子进程与父进程? 子进程与父进程是相互依存的,而父进程所产生的子进程,其权限也是父进程的权限所给予的,打个比方:当我们登陆系统后会取得一个BASH接口,然后我们使用这个接口,去执行另一个命令,则这个BASH接口就是父进程,而执行的那个命令,是从父进程中衍生出来的,其权限也是父进程给予的,我们把这种进程称作子进程.

关于常驻内存的进程? 常驻内存的进程通常都是负责一些系统所提供的功能以服务各种用户的任务,通常我们把这些常驻进程称作服务,而这些服务,一旦被启动他就会一直持续不断的运行着,我们把这种狗皮膏药叫做,常驻内存进程.

其实我们了解并学会使用系统进程管理,对我们的日常维护大有好处,一个称职的管理员,必须要熟练进程的管理才行,否则系统发生问题时很难去解决,接下来我们就来学习一下,进程管理当中的查询,终止,重启,以及调节进程优先级等操作吧:

◆进程的查看◆

❤ PS-静态查询进程

ps命令用于报告当前系统的进程状态,可以搭配kill指令随时中断,删除不必要的程序,ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等,总之大部分信息都是可以通过执行该命令得到的,静态查看系统中的进程,查询的是命令执行一瞬间的进程的状态.

紧接着,我们先来看一下PS命令的常用参数吧,后期我们会分别说明各种参数和显示结果的说明.

代码语言:javascript复制
[root@localhost ~]# ps --help

语法格式:[ ps [选项] [PID] ]

        aux             #以BSD操作系统的格式输出
        ajfx            #以树形格式输出
        le              #以Linux标准格式输出

        -a              #显示一个终端的所有进程
        -u              #显示进程的归属用户及内存的使用情况
        -x              #显示没有控制终端的进程
        -l              #长格式显示,更加详细的信息
        -j              #工作格式显示
        -f              #做一个更完整的输出
        -e              #显示所有进程,与a的作用一致

通过PS -l 仅查看自己的bash相关进程

系统整体运行的进程是非常多的,但如果使用 ps -l 则仅列出与你的操作环境(bash)有关的进程而已,即最上层的父进程会是你自己的 bash 而没有延伸到 init 这个进程上去.

代码语言:javascript复制
[root@localhost ~]# ps -l
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD

4 S     0   1381   1377  0  80   0 - 28859 do_wai pts/0    00:00:00 bash
0 R     0   1401   1381  0  80   0 - 38300 -      pts/0    00:00:00 ps

参数解释环节

F:代表进程标志,说明这个进程的权限 若为4:表示此进程权限为root 若为1:表示此进程可以被复制fork

S:代表进程的状态(STAT),进程的主要状态有: R(Running):运行中 S(Sleep):睡眠中 D:不可被唤醒的 T(Stop):停止状态 Z(Zombie):僵尸进程

UID/PID/PPID:代表进程号: PID:进程的PID号 UID:用户身份标识 PPID:父进程的PID号

C:代表CPU的使用率,单位是百分比 PRI/NI:进程CPU执行优先级

ADDR/SZ/WCHAN:内存参数,主要有: ADDR:该进程在内存的那个部分 SZ:代表次进程用掉多少内存 WCHAN:目前进程是否运行中,-代表运行

TTY:代表执行的终端编号 TIME:进程使用掉的CPU时间 CMD:终端执行的命令

通过PS aux 查看系统所有进程

此命令,是unix通用命令,在Linux下同样保留了下来,此命令可以用来查看系统的所有进程,默认也是使用人数最多的一个查询命令.

代码语言:javascript复制
[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root          1  0.9  2.2 193500  5136 ?        Ss   08:41   0:01 /usr/lib/systemd/systemd
root          2  0.0  0.0      0     0 ?        S    08:41   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    08:41   0:00 [ksoftirqd/0]
root          4  0.0  0.0      0     0 ?        S    08:41   0:00 [kworker/0:0]
....省略....

关于ps aux命令,参数解释环节 USER:该进程的运行用户 PID:进程的PID号 %CPU:进程占用的cpu的百分比 %MEM:进程占用物理内存的百分比 VSZ:占用的虚拟内存的大小(KB) RSS:占用物理内存的大小(KB) tty:登录终端(Alt F1-F6) stat:进程执行状态 START:进程启动时间 TIME:进程运行的时间(总时间),非系统时间 COMMAND:产生此进程的命令

STAT 进程常用状态 D:无法中断的休眠状态(通常 IO 的进程) R:正在运行的进程 S:处于休眠状态 T:停止或被追踪 W:进入内存交换(从内核2.6开始无效) X:死掉的进程(基本很少见) Z:僵尸进程 <:优先级高的进程 N:优先级较低的进程 L:被锁进内存的进程 s:进程的领导者(在它之下有子进程) l:多进程的 :位于后台的进程组

❤ TOP-动态查询进程

top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具,通过top命令所提供的互动式界面,用热键可以管理,使用方便,事实性高.

废话不多说,先看一下常用参数吧.

代码语言:javascript复制
[root@localhost ~]# top --help

语法格式:[ top [选项] [PID] ]

[常用选项]

        -d 秒数	        #指定刷新频率
        -b              #使用批处理模式,和-n结合将top的结果重定向到文本
        -n 次数	        #指定top次数和-b结合
        -p              #指定查看某的PID的进程
        -s              #使top在安全模式下运行,避免在交互模式下出现错误
        -u 用户名        #只查看(监听)某一个用户的进程

------------------------------------------------------------------------------
[交互模式命令]

        P               #按照CPU使用率排序
        M               #按照内存使用率排序
        N               #按照PID号排序
        T               #按照cpu运算时间排序
        k               #按照PID号给予某一个进程信发送指令,可用于杀死进程
        r               #按照PID给某个进程重设优先级(Nice)值
        q               #退出交互模式

关于 top 命令的输出信息的解释,与汉化.

代码语言:javascript复制
[root@localhost ~]# top

   [系统当前时间]   [运行时间]   [当前用户数]           [系统平均负载1,5,15分钟]
top - 21:32:00     up 14 min,  2 users,       load average: 0.00, 0.01, 0.05

      [系统总进程数]    [运行中]       [睡眠进程]        [停止的进程]     [僵尸进程]
Tasks:  94 total,      1 running,    93 sleeping,      0 stopped,      0 zombie

[CPU百分比]    [用户模式]   [系统模式]   [改变优先级百分比]  [空闲CPU]   [输入输出]  [硬中断]  [软中断]
%Cpu(s):       0.0 us,     5.9 sy,     0.0 ni,          94.1 id,     0.0 wa,    0.0 hi,  0.0 si

[物理内存KB]    [总量]             [剩余]        [已使用]        [缓冲/缓存]
KiB Mem :      223836 total,     3388 free,   119024 used,   101424 buff/cache

[交换内存KB]    [总量]              [剩余]        [已使用]    [缓存交换分区大小]
KiB Swap:      1048572 total,     1048564 free,  8 used.    67412 avail Mem


 [进程ID]   [执行用户]  [优先级]  [Nice]    [虚拟内存]   [常驻内存]  [共享内存]
   PID        USER      PR       NI        VIRT        RES        SHR S %CPU %MEM     TIME  COMMAND
  1317        root      20        0        161840      2140       1532 R  5.9  1.0   0:00.01 top
     1        root      20        0        125312      3780       2564 S  0.0  1.7   0:01.20 systemd
....省略....

◆进程的管理◆

程序之间是可以互相控制的,举例来说,你可以关闭、重新启动服务器软件,服务器软件本身是个程序,你既然可以让她关闭或启动,当然就是可以控制该程序啦,那么程序是如何互相管理的呢,其实是通过给予该程序一个信号(signal)去告知该程序想要让他做什么操作,因此这个信号就很重要啦,默认情况下我们可以使用kill -l命令来查询系统支持的信号,但是常用的信号,无非就一下几种.

信号数字

信号名称

信号内容

1

SIGHUP

启动被终止的进程,可让该PID重新读取自己的配置文件,类似重启

2

SIGINT

相当于使用Ctrl C 来中断一个进程

9

SIGKILL

强制杀死一个进程的执行

15

SIGTERM

已正常的结束进程来终止该进程的执行

17

SIGSTOP

相当于使用Ctrl Z 来暂停一个进程

上面仅是常见的 signal 而已,如果想知道更多关于信号的东西,请自行 man 7 signal 吧,一般来说你只要记得 『1,9,15』 这三个号码的意义即可,那么我们如何传送一个信号给某个程序呢? 就是通过 kill 或 killall 下面我们分别来看看:

❤ Kill命令-杀死指定进程

kill命令用来删除执行中的程序或工作,kill可将指定的信息送至程序,预设的信息为SIGTERM(15),可将指定程序终止,若仍无法终止该程序,可使用SIGKILL(9)信号尝试强制删除程序,程序或工作的编号可利用ps指令或job指令查看.

下面是kill命令的常用格式,和基本参数

代码语言:javascript复制
[root@localhost ~]# kill --help

语法格式:[ kill [选项][信号] [PID] ]

        -a              #当处理当前进程时,不限制命令名和进程号的对应关系
        -l 信号         #若不加<信号>选项,则查看kill 所支持的信号
        -p              #只打印相关进程的进程号,而不发送任何信号
        -s 信号         #指定要送出的信息
        -u              #指定用户

[常用信号]

        1               #复位,重新加载配置
        2               #中断(同 Ctrl   C) 
        15              #终止(正常退出)
        9               #强制终止
        18              #继续(与STOP相反) 
        19              #暂停(同 Ctrl   Z)

重启进程: 使用kill -1重启一个syslog程序

代码语言:javascript复制
[root@localhost ~]# ps aux | grep "syslog" | grep -v "grep" | awk '{print $2}'
1103

[root@localhost ~]# kill -1 $(ps aux | grep "syslog" | grep -v "grep" | awk '{print $2}')

强制终止指定程序: 使用kill -9强制终止一个VIM程序

代码语言:javascript复制
[root@localhost ~]# ps aux | grep "vim"
root      11207  0.2  2.0 148792  4620 pts/1    S    09:28   0:00 vim
root      11222  0.0  0.4 112704   976 pts/0    R    09:29   0:00 grep --color=auto vim

[root@localhost ~]# ps aux | grep "vim" | grep -v "grep"
root      11207  0.2  2.0 148792  4620 pts/1    S    09:28   0:00 vim

[root@localhost ~]# ps aux | grep "vim" | grep -v "grep" | awk '{print $2}'
11207

[root@localhost ~]# kill -9 $(ps aux | grep "vim" | grep -v "grep" | awk '{print $2}')
[root@localhost ~]# ps aux | grep "vim" | grep -v "grep" | awk '{print $2}'

强制终止Jobs任务: 使用Kill -9 %命令,强制结束一个jobs工作

代码语言:javascript复制
[root@localhost ~]# jobs
[1]   Stopped                 vim lyshark.sh

[root@localhost ~]# kill -9 %1; jobs  #结束指定计划任务
[1]   Stopped                 vim lyshark.sh

[root@localhost ~]# jobs

❤ Killall命令-杀进程

由于 kill 后面必须要加上 PID (或者是 job number)所以,通常 kill 都会配合 ps,pstree 等命令,因为我们必须要找到相对应的那个程序的PID号码,才能够去结束它,但是这样的话很是麻烦,那么我们的killall命令可以直接通过进程名称来操作指定程序,不过这个包默认是没有安装的,您需要执行yum install -y psmisc先来安装一下,下面我们就一起来学习一下吧.

代码语言:javascript复制
[root@localhost ~]# killall --help

语法格式:[ killall [选项][信号] [PID] ]

        -i              #交互模式,终止前提示用户
        -e              #exact的意思,但整个完整的命令
        -I              #命令名称(可能含参数)忽略大小写

总之,要终止某个程序,我们可以使用 PID 或者是启动该程序的命令名称,而如果要终止某个服务呢,最简单的方法就是利用 killall 因为他可以将系统当中所有以某个命令名称启动的服务全部终止.

❤ pkill命令-剔除终端

pkill命令可以按照进程名杀死进程,pkill和killall应用方法差不多,也是直接杀死运行中的程序.如果您想杀掉单个进程,请用kill来杀掉.下面演示一下,通过pkill命令,下线一个终端

代码语言:javascript复制
[root@localhost ~]# who
root     tty1         2018-09-28 22:03
root     pts/0        2018-09-28 22:01 (192.168.1.6)

[root@localhost ~]# pkill -9 -t tty1

[root@localhost ~]# who
root     pts/0        2018-09-28 22:01 (192.168.1.6)

◆调节优先级◆

我们知道 Linux 是多任务,多用户的工作环境,由 top 的输出结果我们也发现,系统同一时间内有非常多的进程在运行中,只是绝大部分的进程都在休眠(sleeping)状态而已,想一想,如果所有的进程同时被唤醒,那么 CPU 应该要先处理那个进程呢,这就得要考虑到进程的优先运行序(Priority)与CPU 调度问题了.CPU调度指的是每个程序被 CPU 运行的运算规则,而例行性工作则是将某个任务安排在某个时间再交由系统运行,CPU调度与操作系统较具有相关性.

在介绍命令之前我们先来看一下关于PRI与NICE值的问题,Linux系统给每一个进程分配了一个PRI进程优先级,不过这个PRI值是由内核动态调整的,用户无法直接调整PRI的值,先来看看它的格式吧.

代码语言:javascript复制
[root@localhost ~]# ps -l

F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0   1409   1405  0  80   0 - 28859 do_wai pts/0    00:00:00 bash
0 R     0   1502   1409  0  80   0 - 38300 -      pts/0    00:00:00 ps

上面我们可以看到PRI的存在,由于 PRI 是由内核动态调整的,我们使用者也无权去干涉 PRI ,那如果你想要调整程序的优先运行序时,就得要通过 Nice 值了,Nice 值就是上表的 NI 字段内容,一般来说 PRI 与 NI 的相关性如下:

代码语言:javascript复制
PRI(new) = PRI(old)   Nice

不过我们要注意的是,Nice值有正负之分,Nice可调整的范围是(-20-19),系统会将PRI的值和Nice相加,得到的结果越小,优先值就越高.

关于Nice值的注意事项: 1.nice值的范围是-20-19 2.root可随意调整自己或他人的Nice值 3.一般用户只可以调整自己的Nice值 4.一般用户只可以调高nice不能减小

使用nice: 新执行vim程序,并赋予-5的权限

代码语言:javascript复制
[root@localhost ~]# nice -n -5 vim &
[1] 1591

[root@localhost ~]# top -bn1 | grep vim
  1591 root      15  -5  148872   4520   2316 T  0.0  2.0   0:00.01 vim

使用renice: 使用renice,给一个已经运行的进程修改nice值

代码语言:javascript复制
[root@localhost ~]# jobs
[1]   Stopped                 vim lyshark.sh

[root@localhost ~]# top -bn1 | grep vim
  1595 root      20   0  148872   4544   2340 T  0.0  2.0   0:00.01 vim

[root@localhost ~]# renice -5 1595
1595 (process ID) old priority 0, new priority -5

[root@localhost ~]# top -bn1 | grep vim
  1595 root      15  -5  148872   4544   2340 T  0.0  2.0   0:00.01 vim

Linux系统资源管理

除了系统的程序之外,我们还必须就系统的一些资源进行检查,举例来说,我们使用 top 可以看到很多系统的资源,那么还有没有其他的工具可以查阅的?当然有,下面这些工具命令可以玩一玩

◆free 查看内存使用◆

Linux 系统为了要加速系统效能,所以会将最常使用到的或者是最近使用到的文件数据缓存 (cache) 下来,这样未来系统要使用该文件时,就直接由内存中搜寻取出,而不需要重新读取硬盘,速度上面当然就加快了,因此实体内存被用光是正常的喔

代码语言:javascript复制
[root@localhost ~]# free --help

语法格式:[ free [选项] ]

        -b              #以kb为单位显示
        -h              #以常用单位显示
        -t              #输出显示实体内存
代码语言:javascript复制
[root@localhost ~]# free -h

              [总量]       [已使用]    [剩余]    [共享内存]    [缓冲/缓存]    
              total        used        free      shared      buff/cache   available
[物理内存]
Mem:           218M        121M        5.4M        5.0M         91M         61M
[交换内存]
Swap:          1.0G        520K        1.0G

#提示:我们可以使用 echo "1" > /proc/sys/vm/drop_caches 释放缓冲

◆uname 查系统版本◆

这个东西我们前面使用过很多次了,uname 可以列出目前系统的内核版本、 主要硬件平台以及 CPU 类型等.

代码语言:javascript复制
[root@localhost ~]# uname --help

语法格式:[ uname [选项] ]

        -a              #所有系统相关参数
        -s              #系统名称
        -r              #内核的版本
        -m              #本系统的硬件名称,例如 i686 或 x86_64 等
        -p              #CPU 的类型,与 -m 类似,只是显示的是 CPU 的类型
        -i              #硬件的平台 (ix86)

◆uptime 查系统负载◆

uptime命令能够打印系统总共运行了多长时间和系统的平均负载,uptime命令可以显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载.

代码语言:javascript复制
[root@localhost ~]# uptime
 22:59:34 up 25 min,  1 user,  load average: 0.00, 0.01, 0.05

◆vmstat 检测系统资源◆

如果你想要动态的了解一下系统资源的运行,那么这个 vmstat 确实可了解一下,vmstat 可以检测『 CPU / 内存 / 磁盘输入输出状态 』等

代码语言:javascript复制
[root@localhost ~]# vmstat --help

语法格式:[ vmstat [选项] ]

        -a              #使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出
        -f              #启动到目前为止,系统复制 (fork) 的程序数
        -s              #将一些事件 (启动至目前为止) 导致的内存变化情况列表说明
        -S              #后面可以接单位,让显示的数据有单位,例如 K/M 取代 bytes 的容量
        -d              #列出磁盘的读写总量统计表
        -p              #后面列出分区,可显示分区的总量
代码语言:javascript复制
[root@localhost ~]# vmstat 1 3


procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0    520  24400      0  74864    0    0    68     4   73  143  0  0 99  1  0
 0  0    520  24400      0  74864    0    0     0     0   39   39  0  0 100  0  0
 0  0    520  24400      0  74864    0    0     0     0   39   37  0  0 100  0  0

------------------------------------------------------------------------------------
[参数解释]

Procs(进程):
		r: 	运行队列中进程数量
		b:	阻塞的进程

Memory(内存):
		swpd: 	虚拟内存已使用的大小
		free: 	空闲的物理内存的大小
		buff: 	用作缓冲的内存大小(系统)
		cache: 	用作缓存的内存大小(被调用资源)

Swap:
	si:  	每秒从磁盘读入虚拟内存的大小
	so: 	每秒虚拟内存写入磁盘的大小
注:如果这个值大于0,表示物理内存不够用

IO:	(现在的Linux版本块的大小为1024bytes)
	bi: 	每秒读取的块数
	bo: 	每秒写入的块数

系统:
	in: 	每秒CPU中断数,包括时钟中断。
	cs: 	每秒上下文切换数(资源调用的次数,如:函数)。

CPU(以百分比表示):
	us: 	用户进程执行消耗cpu时间(user time)
	sy: 	系统进程消耗cpu时间(system time)
	id: 	空闲时间(包括IO等待时间)
	wa: 	等待IO时间
	st:	虚拟机偷取时间(不为0则代表cpu被其他虚拟机所调用)
------------------------------------------------------------------------------------

◆dmesg 分析启动数据◆

系统在启动的时候,核心会去侦测系统的硬件,你的某些硬件到底有没有被捉到,那就与这个时候的侦测有关.dmesg命令被用于检查和控制内核的环形缓冲区,kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看.开机信息保存在/var/log/dmesg文件里.

代码语言:javascript复制
[root@localhost ~]# dmesg

◆lsof 查进程打开文件◆

lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP).找回/恢复删除的文件,是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行.

代码语言:javascript复制
[root@localhost ~]# lsof --help

语法格式:[ lsof [选项] ]

        -a              #列出打开文件存在的进程
        -c [进程名]      #列出指定进程所打开的文件
        -g              #列出GID号进程详情
        -p [进程号]      #列出指定进程号所打开的文件
        -u              #列出UID号进程详情

实例: 列出进程打开或正在使用的文件信息

代码语言:javascript复制
[root@localhost ~]# lsof
[root@localhost ~]# lsof -p	进程号  #查看某进程运行所调用的资源
[root@localhost ~]# lsof -u        #查看用户运行的进程调用了哪些文件

Linux系统网络管理

本小结内容将具体介绍几个常用的网络测试命令的使用,在日常工作中,网络方面的命令还是要经常使用的,比如排查网络故障等操作,下面我们就来介绍几个常用的网络管理命令吧.

◆ping 测试网络连通性◆

ping命令用来测试主机之间网络的连通性,执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没问题,就会回应该信息,因而得知该主机运作正常.

代码语言:javascript复制
[root@localhost ~]# ping --help
ping: invalid option -- '-'

语法格式:[ ping [选项] [IP或网址] ]

        -c [次数]        #探测时指定次数
        -S [大小]        #探测时指定数据包大小
        -i [秒数]        #探测时指定秒数
        -l [数值]        #设置在送出要求信息之前,先行发出的数据包
        -f               #极限检测模式
        -R               #探测时记录路由过程
        -q               #不显示指令执行过程

指定探测次数: 通过使用-c可以指定要探测的次数,默认是一直探测下去.

代码语言:javascript复制
[root@localhost ~]# ping -c 3 www.baidu.com

PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=1 ttl=55 time=21.0 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=2 ttl=55 time=21.4 ms
64 bytes from 61.135.169.125 (61.135.169.125): icmp_seq=3 ttl=55 time=20.8 ms

--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2009ms
rtt min/avg/max/mdev = 20.805/21.088/21.456/0.319 ms

启用极限检测: 通过使用-f参数,一直检测下去.

代码语言:javascript复制
[root@localhost ~]# ping -f www.baidu.com
PING www.a.shifen.com (61.135.169.125) 56(84) bytes of data.
.....

使用安静模式: 非交互模式ping一个主机,写脚本用.

代码语言:javascript复制
[root@localhost ~]# ping -q www.baidu.com > /dev/null
[root@localhost ~]# echo $?
0

◆ifconfig 查询网络信息◆

ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数,用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在.要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了,这里需要注意的是,精简模式的Linux下没有这个命令,请执行 yum install -y net-tools 安装.

代码语言:javascript复制
[root@localhost ~]# ifconfig --help

语法格式:[ ifconfig [选项] [参数列表] [IP或网址] ]

        add [地址]        #设置网络设备IPv6的ip地址
        del [地址]        #删除网络设备IPv6的IP地址
        up                #启动指定的网络设备
        down              #关闭指定的网络设备
        io_addr [I/O地址] #设置网络设备的I/O地址
        netmask [掩码]    #设置网络设备的子网掩码
        tunnel [地址]     #建立IPv4与IPv6之间的隧道通信地址

启动/关闭指定网卡:

代码语言:javascript复制
[root@localhost ~]# ifconfig eth0 up   或者 ifup eth0
[root@localhost ~]# ifconfig eth0 down 或者 ifdown eth0

临时分配一个IP地址:

代码语言:javascript复制
[root@localhost ~]# ifconfig eth0 192.168.1.10
[root@localhost ~]# ifconfig eth0 192.168.1.10 netmask 255.255.255.0
[root@localhost ~]# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 broadcast 192.168.1.255

临时分配一个子网口:

代码语言:javascript复制
[root@localhost ~]# ifconfig eth0:0 192.168.1.10
[root@localhost ~]# ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0

为网卡配置和删除IPv6地址:

代码语言:javascript复制
[root@localhost ~]# ifconfig eth0 add 33ffe:3240:800:1005::2/64    #为网卡eth0配置IPv6地址
[root@localhost ~]# ifconfig eth0 del 33ffe:3240:800:1005::2/64    #为网卡eth0删除IPv6地址

启动/关闭ARP协议:

代码语言:javascript复制
[root@localhost ~]# ifconfig eth0 arp    #开启网卡eth0 的arp协议
[root@localhost ~]# ifconfig eth0 -arp   #关闭网卡eth0 的arp协议

设置最大传输单元:

代码语言:javascript复制
[root@localhost ~]# ifconfig eth0 mtu 1500    #设置能通过的最大数据包大小为 1500 bytes

◆netstat 查网络连接状态◆

Netstat是控制台命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息.Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况,netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况.

代码语言:javascript复制
[root@localhost ~]# netstat --help

语法格式:[ netstat [选项] ]

        -t              #列出TCP协议端口
        -u              #列出UPD协议端口
        -n              #使用IP地址和端口显示
        -l              #仅列出在监听状态网络服务
        -a              #列出所有的网络连接
        -r              #列出路由列表(route)
        -c              #持续列出网络状态
        -g              #显示多重广播功能群组组员名单
        -i              #显示网络接口列表
        -n              #直接使用ip地址,而不通过域名服务器
        -s              #显示网络工作信息统计表

列出所有端口(包括监听和未监听的)

代码语言:javascript复制
[root@localhost ~]# netstat -a        #列出所有端口
[root@localhost ~]# netstat -at       #列出所有tcp端口
[root@localhost ~]# netstat -au       #列出所有udp端口
[root@localhost ~]# netstat -antp     #列出所有tcp端口
[root@localhost ~]# netstat -anup     #列出所有udp端口
[root@localhost ~]# netstat -autp     #列出所有tcp/udp端口

列出所有处于监听状态的Sockets

代码语言:javascript复制
[root@localhost ~]# netstat -l        #只显示监听端口
[root@localhost ~]# netstat -lt       #只列出所有监听 tcp 端口
[root@localhost ~]# netstat -lu       #只列出所有监听 udp 端口
[root@localhost ~]# netstat -lx       #只列出所有监听 UNIX 端口

显示每个协议的统计信息

代码语言:javascript复制
[root@localhost ~]# netstat -s        #显示所有端口的统计信息
[root@localhost ~]# netstat -st       #显示TCP端口的统计信息
[root@localhost ~]# netstat -su       #显示UDP端口的统计信息

在netstat输出中显示 PID 和进程名称

代码语言:javascript复制
[root@localhost ~]# netstat -pt
[root@localhost ~]# netstat -i

◆traceroute 追踪数据包◆

traceroute用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节,通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径.当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的.

traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间.一条路径上的每个设备traceroute要测3次.输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址,注意精简模式的Linux下没有这个命令,请执行 yum install -y traceroute 安装.

代码语言:javascript复制
[root@localhost ~]# traceroute --help

语法格式:[ traceroute [选项] [网址或IP] ]

        -q [次数]       #指定每次的追踪次数
        -d              #使用Socket层级的排错功能
        -f[存活数值]     #设置第一个检测数据包的存活数值TTL的大小
        -I              #使用ICMP回应取代UDP资料信息

测试与百度的路由次数

代码语言:javascript复制
[root@localhost ~]# traceroute -q 1 www.baidu.com
traceroute to www.baidu.com (61.135.169.121), 30 hops max, 60 byte packets
 1  gateway (192.168.1.1)  1.002 ms
 2  39.85.88.1 (39.85.88.1)  3.322 ms
 3  124.130.190.49 (124.130.190.49)  593.163 ms
 4  27.200.59.129 (27.200.59.129)  8.084 ms
 5  219.158.21.89 (219.158.21.89)  18.701 ms
 6  123.126.0.126 (123.126.0.126)  16.885 ms
 7  124.65.62.118 (124.65.62.118)  17.802 ms

◆route 查询与设置路由◆

route命令用来显示并设置Linux内核中的网络路由表,route命令设置的路由主要是静态路由.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.

在Linux系统中设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的ip地址设置为Linux机器的默认路由.要注意的是,直接在命令行下执行route命令来添加路由,不会永久保存,当网卡重启或者机器重启之后,该路由就失效了,可以在/etc/rc.local中添加route命令来保证该路由设置永久有效.

代码语言:javascript复制
[root@localhost ~]# route --help

语法格式:[ route [选项] [地址] ]

        -A             #设置地址类型
        -C             #打印将Linux核心的路由缓存
        -v             #详细信息模式
        -n             #不执行DNS反查,以IP地址显示
        -e             #netstat格式显示路由表
        -net           #指定网络的路由表
        -host          #指定主机的路由表

        Add            #增加指定的路由记录
        Del            #删除指定的路由记录
        Target         #目的网络或目的主机
        gw             #设置默认网关
        mss            #设置TCP的最大区块长度(MSS)单位MB
        window         #指定通过路由表的TCP连接的TCP窗口大小
        dev            #路由记录所表示的网络接口

显示当前路由: 使用route命令显示当前路由表.

代码语言:javascript复制
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32

其中Flags为路由标志,标记当前网络节点的状态,Flags标志说明: U ————-> (Up)表示此路由当前为启动状态 H ————-> (Host)表示此网关为一主机 G ————-> (Gateway)表示此网关为一路由器 R ————-> (Reinstate Route)使用动态路由重新初始化的路由 D ————-> (Dynamically)此路由是动态性地写入 M ————-> (Modified)此路由是由路由守护程序或导向器动态修改 ! ————-> (false)表示此路由当前为关闭状态

添加网关/设置网关: 增加一条到达192.168.10.0的路由.

代码语言:javascript复制
[root@localhost ~]# route add -net 192.168.10.0 netmask 255.255.255.0 dev ens32
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.10.0    0.0.0.0         255.255.255.0   U     100    0        0 ens32

屏蔽一条路由: 增加一条屏蔽的路由,目的地址为192.168.10.0将被拒绝.

代码语言:javascript复制
[root@localhost ~]# route add -net 192.168.10.0 netmask 255.255.255.0 reject
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32
192.168.10.0    -               255.255.255.0   !     0      -        0 -

删除路由记录: 删除192.168.10.0这条路由记录.

代码语言:javascript复制
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32
192.168.10.0    -               255.255.255.0   !     0      -        0 -
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 ens32

[root@localhost ~]# route del -net 192.168.10.0 netmask 255.255.255.0
[root@localhost ~]# route del -net 192.168.10.0 netmask 255.255.255.0 reject

[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32

添加网关: 添加设置默认网关.

代码语言:javascript复制
[root@localhost ~]# route add default gw 192.168.1.1
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 ens32
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32

删除网关: 删除设置默认网关.

代码语言:javascript复制
[root@localhost ~]# route del default gw 192.168.1.1
[root@localhost ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 ens32
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 ens32

◆Nmcli 管理网络配置◆

RHEL7与CentOS7中默认的网络服务由NetworkManager提供,这是动态控制及配置网络的守护进程,它用于保持当前网络设备及连接处于工作状态,同时也支持传统的ifcfg类型的配置文件.NetworkManager在RHEL系统中也叫nmcli,经常使用ifconfig的用户应该在RHEL中避免使用ifconfig了,nmcli的功能要强大、复杂的多.

查询网络连接: 通过nmcli命令查询网络连接详情.

代码语言:javascript复制
[root@localhost ~]# nmcli connection show          #显示所有网络连接
[root@localhost ~]# nmcli connection show ens32    #显示指定网卡的详情
[root@localhost ~]# nmcli dev status               #显示网络设备连接状态
[root@localhost ~]# nmcli dev show                 #显示所有网络设备的详情

启用与禁止网络连接: 下面的命令用来启动和禁止连接网络.

代码语言:javascript复制
[root@localhost ~]# nmcli connection up ens32      #启动ens32网卡
[root@localhost ~]# nmcli connection down ens32    #停止ens32网卡
[root@localhost ~]# nmcli connection del ens32     #删除网络连接的配置文件
[root@localhost ~]# nmcli connection reload ens32  #重新加载配置网络配置文件

[root@localhost ~]# nmcli net on/off               #启用/关闭所有的网络连接
[root@localhost ~]# nmcli con dis ens32            #禁用网络设备并防止自动激活
[root@localhost ~]# nmcli con add help             #查看添加网络连接配置的帮助

修改网络地址: 修改网络连接单项参数,如下.

代码语言:javascript复制
nmcli con add con-name ens32 type ethernet ifname ens32 动态获取IP方式的网络连接配置
nmcli con add con-name ens32 ifname ens32 autoconnect yes type ethernet ip4 192.168.1.10 gw4 192.168.1.1

[root@localhost ~]# nmcli con mod 网卡名 connection.autoconnect yes                   #修改为自动连接
[root@localhost ~]# nmcli con mod 网卡名 ipv4.method manual                           #dhcp修改IP地址是静态还是DHCP
[root@localhost ~]# nmcli con mod 网卡名 ipv4.addresses "192.168.1.0/24 192.168.1.1"  #修改IP配置及网关
[root@localhost ~]# nmcli con mod 网卡名 ipv4.gateway 192.168.1.1                     #修改默认网关
[root@localhost ~]# nmcli con mod 网卡名  ipv4.addresses 192.168.1./24                #添加第二个IP地址
[root@localhost ~]# nmcli con mod 网卡名 ipv4.dns 114.114.114.114                     #添加dns1
[root@localhost ~]# nmcli con mod 网卡名  ipv4.dns  8.8.8.8                           #添加dns2
[root@localhost ~]# nmcli con mod 网卡名 -ipv4.dns  8.8.8.8                           #删除dns

以上nmcli命令修改所对应的文件条目: nmcli con mod ————-> ifcfg-* 文件 ipv4.method manual ————-> BOOTPROTO=none ipv4.method auto ————-> BOOTPROTO=dhcp connection.id eth0 ————-> NAME=eth0 ipv4.addresses ————-> IPADDR0=192.168.1.10 192.168.1.0/24 ————-> PREFIX0=24 192.168.1.1 ————-> GATEWAY0=192.168.1.1 ipv4.dns 8.8.8.8 ————-> DNS0=8.8.8.8 pv4.dns-search example.com ————-> DOMAIN=example.com pv4.ignore-auto-dns true ————-> PEERDNS=no connection.autoconnect yes ————-> ONBOOT=yes connection.interface-name eth0 ————-> DEVICE=eth0 802-3-ethernet.mac-address... ————-> HWADDR=...

配置一个IPV6地址: 使用上面的方法配置一个IPV6地址.

a.先查看一下网卡名称,看一下名称是否能够匹配.

代码语言:javascript复制
[root@system1 ~]# nmcli connection 
名称 UUID 类型 设备 
eth2 3a73717e-65ab-93e8-b518-24f5af32dc0d 802-3-ethernet eth2 
eth1 9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04 802-3-ethernet eth1 
eth0 5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03 802-3-ethernet eth0

b.紧接着修改管理方式为auto,并配置上IP地址.

代码语言:javascript复制
[root@localhost ~]# nmcli connection modify eth0 ipv6.method auto
[root@localhost ~]# nmcli connection modify eth0 ipv6.address "200e:ac18::e0a/64"
[root@localhost ~]# nmcli connection modify eth0 ipv6.method manual

c.重启服务,并查看配置是否生效inet6 200e:ac18::e0a.

代码语言:javascript复制
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig ens32

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.122.100 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::5054:ff:fe29:8298 prefixlen 64 scopeid 0x20<link>
inet6 200e:ac18::e0a prefixlen 64 scopeid 0x0<global>
ether 52:54:00:29:82:98 txqueuelen 1000 (Ethernet)
RX packets 5483 bytes 466334 (455.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2639 bytes 357765 (349.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

配置聚合网络(拓展): 给本机配置要给聚合网络,并使用eth1eth2接口,实现当eth1失效后自动切换到eth2.

a.拷贝配置文件模板,默认配置模板.

代码语言:javascript复制
[root@localhost ~]# cd /usr/share/doc/teamd-1.9/example_ifcfgs/1
[root@localhost ~]# cp -a * /etc/sysconfig/network-scripts/

b.修改tteam_test0模板.

代码语言:javascript复制
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-team_test0

1 DEVICE="team_test0"
2 NAME=team_test0                  #添加本行
3 DEVICETYPE="Team"
4 ONBOOT="yes"                     #改为yes
5 BOOTPROTO=none
6 NETMASK=255.255.255.0            #修改
7 IPADDR=172.168.11.25             #修改
8 TEAM_CONFIG='{"runner": {"name": "activebackup"}}'  #修改成activebackup

d.修改eth1网卡,修改两处位置即可.

代码语言:javascript复制
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1 

1 DEVICE="eth1"
2 NAME="eth1"                    #添加
3 DEVICETYPE="TeamPort"
4 ONBOOT="yes"                   #修改yes
5 TEAM_MASTER="team_test0"

d.修改eth2网卡,修改两处位置即可.

代码语言:javascript复制
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth2

1 DEVICE="eth2"
2 NAME="eth2"                    #添加
4 DEVICETYPE="TeamPort"
5 ONBOOT="yes"                   #修改yes
6 TEAM_MASTER="team_test0"

e.重启网络看效果,到此聚合配置完毕.

代码语言:javascript复制
[root@localhost ~]# systemctl restart network
[root@localhost ~]# ifconfig team_test0

team_test0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 
inet 172.168.11.25 netmask 255.255.255.0 broadcast 172.168.11.255
inet6 fe80::5054:ff:feb2:5545 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:b2:55:45 txqueuelen 0 (Ethernet)
RX packets 21 bytes 2819 (2.7 KiB)
RX errors 0 dropped 36 overruns 0 frame 0
TX packets 27 bytes 3792 (3.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

0 人点赞