Linux常用系统命令
监控系统的状态
- 使用w查看当前系统的负载
- [root@VM_10_10_centos ~]# w
相信所有的Linux管理员最常用的命令就是这个w了,该命令显示的信息还是蛮丰富的。第一行从左面开始显示的信息依次为:时间,系统运行时间;登录用户数,平均负载。第二行开始以及下面所有的行,告诉用户的信息是,当前登录的都有哪些用户,以及是从哪里登录的等等。其实,在这些信息当中,最应该关注的应该是第一行中的“load average:”后面的三个数值。
第一个数值表示1分钟内系统的平均负载值;第二个数值表示5分钟内系统的平均负载值;第三个数值表示15分钟系统的平均负载值。这个值的意义是,单位时间段内CPU活动进程数。当然这个值越大就说明用户的服务器压力越大。一般情况下这个值只要不超过服务器的CPU数量就没有关系,如果服务器CPU数量为8,那么这个值若小于8,就说明当前服务器没有压力,否则就要关注一下了。
- 查看服务器有几个CPU
[root@VM_10_10_centos ~]# cat /proc/cpuinfo |head -n20
proc/cpuinfo这个文件记录了CPU的详细信息。目前市面上的服务器通常都是2颗4核CPU,在Linux看来,它就是8个CPU。查看这个文件时则会显示类似上述代码样子的8段信息,而最后一段信息中processor: 7,所以查看当前系统有几个CPU,可以使用这个命令: grep -c ‘processor’ /proc/cpuinfo。而如何看几颗物理CPU呢,需要查看关键字physical id, 由于此处的虚拟机只有一个CPU所以并未显示关于physical id的信息。
- 使用 vmstat 监控系统的状态
- [root@VM_10_10_centos ~]# vmstat
上面讲的 w 查看的是系统整体上的负载,通过看那个数值可以知道当前系统有没有压力,但是具体是哪里(CPU、内存、磁盘等)有压力就无法判断了。通过vmstat就可以知道具体是哪里有压力。vmstat命令打印的结果共分为6部分:procs、memory、swap、io、system、 cpu. 请重点关注一下r、b、si、so、bi、bo几列。
-
procs显示进程相关信息
● r:表示运行和等待CPU时间片的进程数,如果长期大于服务器CPU的个数,则说明CPU不够用了;
● b:表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要关注一下了。 -
memory内存相关信息
● swpd:表示切换到交换分区中的内存数量 ;
● free:当前空闲的内存数量;
● buff:缓冲大小,(即将写入磁盘的);
● cache:缓存大小,(从磁盘中读取的)。 -
swap内存交换情况
● si:由交换区写入到内存的数据量;
● so:由内存写入到交换区的数据量。 -
io磁盘使用情况
● bi:从块设备读取数据的量(读磁盘);
● bo:从块设备写入数据的量(写磁盘)。 -
system显示采集间隔内发生的中断次数
● in:表示在某一时间间隔中观测到的每秒设备中断数;
● cs:表示每秒产生的上下文切换次数。 -
CPU 显示CPU的使用状态
● us:显示了用户下所花费CPU时间的百分比;
● sy:显示系统花费CPU时间百分比;
● id:表示CPU处于空闲状态的时间百分比;
● wa:表示I/O等待所占用CPU时间百分比;
● st:表示被偷走的CPU所占百分比(一般都为0,不用关注)。
以上所介绍的各个参数中,需要经常会关注r列、b列和wa列,这3列代表的含义在上边说得已经很清楚。IO部分的bi以及bo也是要经常参考的对象。如果磁盘io压力很大时,这两列的数值会比较高。另外当si、 so两列的数值比较高,并且在不断变化时,说明内存不够了,内存中的数据频繁交换到交换分区中,这往往对系统性能影响极大。
- 使用vmstat查看系统状态的时候,通常都是使用这样的形式,示例代码如下。
[root@VM_10_10_centos ~]# vmstat 1 5
上面的代码表示,每隔一秒钟打印一次状态,共打印5次。
- top 显示进程所占系统资源
[root@VM_10_10_centos ~]# top
这个命令用于动态监控进程所占系统资源,每隔3秒变一次。这个命令的特点是把占用系统资源(CPU、内存、磁盘IO等)最高的进程放到最前面。top命令打印出了很多信息,包括系统负载(loadaverage)、进程数(Tasks)、CPU使用情况、内存使用情况以及交换分区使用情况。其实上面这些内容可以通过其他命令来查看,所以用top重点查看的还是下面的进程使用系统资源详细状况。这部分东西反映的东西还是比较多的,不过需要关注的也就是几项:%CPU、%MEM和COMMAND 这些项目所代表的意义,不用介绍相信用户也能看懂吧,RES这一项为进程所占内存大小,而%MEM为使用内存百分比。在 top 状态下,按Shift +M键可以按照内存使用大小排序。按数字“1”键可以列出各颗CPU的使用状态。
- 另外,经常会用的一个命令top -bn1。它表示非动态打印系统资源使用情况,示例代码如下:
[root@VM_10_10_centos ~]# top -bn1
和 top 命令唯一的区别就是,它一次性全部把所有信息输出出来而非动态显示。
- free查看内存使用状况
[root@VM_10_10_centos ~]# free
只需要输入一个 free 然后按Enter键就可以当前系统的总内存大小以及使用内存的情况。从上例中可看到当前系统内存总大小为8059000(单位是k)已经使用7808688, 剩余250312。其实真正剩余并不是这个250312,而是第二行的2145536,真正使用的也是第二行的5913464,这是因为系统初始化时,就已经分配出很大一部分内存给缓存,这部分缓存用来随时提供给程序使用,如果程序不用,那这部分内存就空闲。所以,查看内存使用多少,剩余多少请看第二行的数据。
-
另外我们还可以加-m 或者-g选项分别以M或G为单位打印内存使用状况,示例代码如下:
[root@VM_10_10_centos ~]# free -m
-
ps 查看系统进程
作为系统管理员,一定要知道所管理的系统都有那些进程在运行,在Windows下只要打开任务管理器即可查看。在Linux下呢?其实在上面介绍的top命令就可以,但是不容易查看,当然还有专门显示系统进程的命令,示例代码如下:
[root@VM_10_10_centos ~]# ps aux
也有人喜欢用ps -elf命令,其实都大同小异,显示的信息基本上是一样的。ps命令还有更多的用法,此处不再做介绍,因为只要会用这个命令就足够了,请使用man命令查看一下用户手册。
- 下面介绍几个参数的意义。
● PID:进程的id,这个id很有用,在Linux中内核管理进程就得靠pid来识别和管理某一个程,比如想终止某一个进程,则用kill 进程的pid 有时并不能终止进程,则需要加一个-9选项:kill -9 进程pid。
● STAT:表示进程的状态,进程状态分为以下几种(不要求记住,但要了解):
● D:不能中断的进程(通常为IO)。
● R:正在运行中的进程。
● S:已经中断的进程,通常情况下,系统中大部分进程都是这个状态。
● T:已经停止或者暂停的进程,如果正在运行一个命令,比如说sleep 10如果按Ctrl +Z键让它暂停,那么用ps查看就会显示T这个状态。
● W:从内核2.6xx以后,表示为没有足够的内存页分配。
● X:已经死掉的进程(这个好像从来不会出现)。
● Z:僵尸进程,终止不掉的垃圾进程,占系统一小点资源,不过没有关系。如果太多,就有问题了。一般不会出现。
● <:高优先级进程。
● N:低优先级进程。
● L:在内存中被锁了内存分页。
● S:主进程。
● L:多线程进程。
● +:代表在前台运行的进程。
这个ps命令是在工作中用得非常多的命令之一,所以请记住它吧。关于ps命令的使用,经常会连同管道符一起使用,用来查看某个进程或者它的数量。 - 下面介绍几个案例,示例代码如下:
[root@VM_10_10_centos ~]# ps aux |grep -c mingetty
[root@VM_10_10_centos ~]# ps aux |grep mingetty
使用grep命令时,grep命令本身也算作了一个。
- netstat 查看网络状况
[root@VM_10_10_centos ~]# netstat -lntp
netstat命令用来打印网络连接状况、系统所开放端口、路由表等信息。最常用的关于netstat的命令就是这个 netstat -lnp (打印当前系统启动哪些端口)以及 netstat -an (打印网络连接状况)。这两个命令非常有用,请一定要记住。
[root@VM_10_10_centos ~]# netstat -an
Linux网络相关
- ifconfig类似与windows的ipconfig,不加任何选项和参数只打印当前网卡的IP相关信息(子网掩码、网关等)。在Windows下设置IP非常简单,然而在命令窗口下如何设置?这就需要去修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0了,如果是eth1那么配置文件是/etc/sysconfig/network-scripts/ifcfg-eth1。
如果Linux上有多个网卡,而只想重启某一个网卡的话,可以使用这个命令,示例代码如下:
[root@VM_10_10_centos ~]# ifdown eth0; ifup eth0
ifdown 即停掉网卡,ifup即启动网卡。有一点要提醒你的是,如果我们远程登录服务器,当使用ifdown eth0这个命令的时候,很有可能后面的命令ifup eth0不会被运行,这样导致我们断网而无法连接服务器,所以请尽量使用 service network restart 这个命令来重启网卡。 - 更改主机名
当装完系统后,默认主机名为localhost,使用hostname就可以知道你的Linux的主机名是什么,示例代码如下:
[root@VM_10_10_centos ~]# hostname
同样使用hostname可以更改你的主机名,示例代码如下:
[root@VM_10_10_centos ~]# hostname Linux
[root@VM_10_10_centos ~]# hostname
下次登录时就会把命令提示符 [root@localhost ~] 中的 localhost 更改成 Linux, 不过这样修改只是保存在内存中,下次重启还会变成未改之前的主机名,所以需要你还要去更改相关的配置文件 /etc/sysconfig/network,示例代码如下:
[root@VM_10_10_centos ~]# vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=Linux.localdomain
- 设置DNS
DNS是用来解析域名用的,平时我们访问网站都是直接输入一个网址,而DNS把这个网址解析到一个IP。关于DNS的概念,如果你很陌生的话,那就去网上查一下吧。在Linux下面设置DNS非常简单,只要把DNS地址写到一个配置文件中即可。这个配置文件就是/etc/resolv.conf。
[root@VM_10_10_centos ~]# vim /etc/resolv.conf
;generated by /sbin/dhclient-script
nameserver 202.106.46.151
resolv.conf有它固有的格式,一定要写成 nameserver IP 的格式,上面那行以“;”为开头的行是一行注释,没有实际意义,建议写两个或多个namserver ,默认会用第一个namserver去解析域名,当第一个解析不到时,会使用第二个。在Linux下面有一个特殊的文件/etc/hosts也能解析域名,不过是需要我们手动在里面添加IP+域名这些内容,它的作用是临时解析某个域名,非常有用。示例代码如下:
[root@VM_10_10_centos ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain
::1 localhost.localdomain localhost
10.10.10.10 master root
保存后,再ping一下 master就会跳转到 10.10.10.10 了,示例代码如下:
[root@VM_10_10_centos ~]# ping master
- /etc/hosts 的格式很简单,每一行作为一条记录,分成两部分,第一部分是IP,第二部分是域名。关于hosts文件,有几点需要注意:
① 一个IP后面可以跟多个域名,可以是几十个甚至上百个;
② 每行只能有一个IP,也就是说一个域名不能对应多个IP;
③ 如果有多行中出现相同的域名(前面IP不一样),会按最前面出现的记录来解析。 - Linux的防火墙
SELinux是Redhat/CentOS系统特有的安全机制。不过因为这个东西限制太多,配置也特别繁琐所以几乎没有人去真正应用它。所以装完系统,一般都要把SELinux关闭,以免引起不必要的麻烦。关闭SELinux的方法为,使 SELINUX=disabled,默认为 enforcing。
[root@VM_10_10_centos ~]# vim /etc/sysconfig/seLinux
保存该配置文件后,重启机器方可生效,临时关闭SELinux的命令,可以使用setenforce 0。我们可以使用 getenforce 命令获得当前SELinux的状态,示例代码如下。
[root@VM_10_10_centos ~]# getenforce
Disabled
如果SELinux早就关闭了,默认会输出enforcing,当使用setenforce 0这个命令后,再使用getenforce命令会输出permissive。
Linux系统任务计划
-
这部分内容太重要了,其实大部分系统管理工作都是通过定期自动执行某一个脚本来完成的,那么如何定期执行某一个脚本呢?这就要借助Linux的cron功能了。(主要使用crontab工具来定时处理脚本或任务。)
-
关于cron任务计划功能的操作都是通过crontab这个命令来完成的。其中常用的选项有:
● -u:指定某个用户,不加-u选项则为当前用户;
● -e:制定计划任务;
● -l:列出计划任务;
● -r:删除计划任务。
首先要创建第一个任务计划了:
[root@VM_10_10_centos ~]# crontab -e
使用crontab -e来进行编写任务计划,这实际上是使用vim工具打开了crontab的配置文件,写下如下内容:
01 10 05 06 3 echo “ok” > /root/cron.log
每个字段的数字分表表示什么呢?从左到右,依次为:分、时、日、月、周命令行。而上面的例子的含义是:在6月5日(这一天必须是星期3)的10点01分执行命令echo “ok” > /root/cron.log。
crontab -e实际上是打开了/var/spool/cron/username(如果是root则打开的是/var/spool/cron/root)这个文件。使用的是vim编辑器,所以要保存的话则在命令模式下输入:wq即可。但是,千万不要直接去编辑那个文件,因为可能会出错,所以一定要使用crontab -e来编辑。 -
查看已经设定的任务计划使用crontab -l命令:
[root@VM_10_10_centos ~]# crontab -l
-
删除计划任务要用 crontab -r,,示例代码如下:
[root@VM_10_10_centos ~]# crontab -r
[root@VM_10_10_centos ~]# crontab -l
cron的内容不算太难,但是需要你牢固掌握。
Linux系统数据备份
-
rsync不仅可以远程同步数据,当然还可以本地同步数据(类似于cp),但rsync不像cp/scp一样会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同,只有不同时,才会把不同的部分覆盖掉。如果Linux没有rsync命令请使用 yum install -y rsync 安装。(本任务主要使用rsync工具来备份数据。)
-
下面先举一个例子,然后再详细讲解rsync的用法,示例代码如下:
[root@VM_10_10_centos ~]# rsync -av sync.txt /tmp
-
上面例子表示把当前目录下的test.txt同步到/etc/tmp/目录下,也可以更改目标文件的名字, rsync -av sync.txt /tmp/newsync.txt,如果是远程拷贝的话就是这样的形式了:IP:path(如:10.0.2.34:/root/)。
[root@VM_10_10_centos ~]# rsync -av sync.txt IP:/tmp/newsync.txt
root@IP’s password:
- 1. rsync的命令格式
rsync [OPTION]… SRC DEST
rsync [OPTION]… SRC [USER@]HOST:DEST
rsync [OPTION]… [USER@]HOST:SRC DEST
rsync [OPTION]… [USER@]HOST::SRC DEST
rsync [OPTION]… SRC [USER@]HOST::DEST
在一开始举的两个例子,第一个例子即为第一种格式,第二个例子即为第二种格式,但不同的是,笔者并没有加user@host。如果不加,默认指的是root。第三种格式是从远程目录同步数据到本地。第4种以及第5种格式使用了两个冒号,这种方式和前面的方式的不同在于验证方式不同,稍后详细介绍。
- rsync常用选项
● -a:归档模式,表示以递归方式传输文件,并保持所有属性,等同于-rlptgoD。-a选项后面可以跟一个–no-OPTION,这个表示关闭-rlptgoD中的某一个。例如 -a–no-l等同于-rptgoD;
● -r:对子目录以递归模式处理,主要是针对目录来说的,如果单独传一个文件不需要加-r,但是传输的是目录必须加-r选项;
● -v:打印一些信息出来,比如速率,文件数量等;
● -l:保留软链接;
● -L:向对待常规文件一样处理软链接,如果是SRC中有软连接文件,则加上该选项后,将会把软连接指向的目标文件拷贝到DST;
● -p:保持文件权限;
● -o:保持文件属主信息;
● -g 保持文件属组信息;
● -D 保持设备文件信息;
● -t:保持文件时间信息;
● --delete:删除那些DST中SRC没有的文件;
● --exclude=PATTERN:指定排除不需要传输的文件,等号后面跟文件名,可以是万用字符模式(如*.txt);
● --progress:在同步的过程中可以看到同步的过程状态,比如,统计要同步的文件数量、同步的文件传输速度等等;
● -u:加上这个选项后将会把DST中比SRC还新的文件排除掉,不会覆盖;
选项确实有点多,不过不用担心,常用的选项页仅仅那么几个: -a、-v、–delete、–exclude,请熟记它们吧。
Linux系统日记
- 用户常查看的日志文件为/var/log/message, 它是核心系统日志文件,包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO错误、网络错误和其他系统错误都会记录到这个文件中。另外其他信息,比如某个人的身份切换为root以及用户自定义安装的软件(Apache)的日志也会在这里列出。通常,/var/log/messages是在做故障诊断时首先要查看的文件。那么读者肯定会说了,这么多日志都记录到这个文件中,那如果服务器上有很多服务,岂不是这个文件很快就会写得很大?没错,但是系统有一个日志轮询的机制,每星期切换一个日志,变成message.xxxxxxxx, message.xxxxxxxx, … messages.xxxxxxxx连同messages一共有5个这样的日志文件。这里的xxxxxxxx就是按照日期的格式生成的文件。这是通过logrotate工具的控制来实现的,它的配置文件是/etc/logrotate.conf。如果没有特殊需求请不要修改这个配置文件。
/var/log/messages是由rsyslog这个守护进程产生的,如果停掉这个服务则系统不会产生/var/log/messages,所以这个服务不要停。rsyslog服务的配置文件为/etc/rsyslog.conf,这个文件定义了日志的级别,具体详细的东西此处不再阐述,因为若没有特殊需求是不需要修改这个配置文件的,请使用man rsyslog.conf获得更多关于它的信息。 - 除了关注/var/log/messages外,还应该多关注一下dmesg这个命令,它可以显示系统的启动信息,如果某个硬件有问题(比如说网卡)用这个命令也是可以看到的,示例代码如下:
[root@VM_10_10_centos ~]# dmesg |less
- 关于安全方面的日志,简单介绍几个命令或者日志。
(1)命令:last
[root@VM_10_10_centos ~]# last |head
last命令用来查看登录Linux历史信息,从左至右依次为账户名称、登录终端、登录客户端IP、登录日期及时长。last命令输出的信息实际上是读取了二进制日志文件/var/log/wtmp,只是这个文件不能直接使用cat、vim、head、tail等工具查看。
另外一个和登陆信息有关的日志文件为/var/log/secure,该日志文件记录验证和授权等方面的信息,比如ssh登陆系统成功或者失败,都会把相关信息记录在这个日志里。
Linux命令xargs与exec用法
-
主要使用Linux中xargs与exec工具结合其他命令来实现业务需求。
-
xargs引用
-
平时使用xargs还是比较多的,示例代码如下:
[root@VM_10_10_centos ~]# echo “121212121212” > 123.txt
[root@VM_10_10_centos ~]# ls 123.txt | xargs cat
它的作用就是把管道符前面的输出作为xargs后面的命令的输入。它的好处在于可以把本来两步或者多步才能完成的任务简单一步就能完成。xargs常常和find命令一起使用,比如,查找当前目录创建时间大于10天的文件,然后再删除,示例代码如下:
[root@VM_10_10_centos ~]# find . -mtime +10 |xargs rm
这种应用是最为常见的,xargs后面的rm也可以加选项,当是目录时,就需要-r选项了。现在有一个这样的需求,查找当前目录下所有.txt的文件,然后把这些.txt的文件变成.txt_bak。正常情况下,不得不写脚本去实现,但是使用xargs就一步,示例代码如下:
[root@VM_10_10_centos ~]# mkdir test
[root@VM_10_10_centos ~]# cd test
[root@VM_10_10_centos ~]# touch 1.txt 2.txt 3.txt 4.txt 5.txt
[root@VM_10_10_centos ~]# ls
[root@VM_10_10_centos ~]# ls *.txt |xargs -n1 -i{} mv {} {}_bak
[root@VM_10_10_centos ~]# ls
xargs -n1 -i{}类似for循环,-n1意思是一个一个对象的去处理,-i{}把前面的对象使用{}取代,mv {} {}_bak相当于mv 1.txt 1.txt_bak。 -
exec应用
使用find命令时,经常使用一个选项就是这个-exec了,可以达到和xargs同样的效果。比如,查找当前目录创建时间大于10天的文件并删除,示例代码如下:
[root@VM_10_10_centos ~]# find . -mtime +10 -exec rm -rf {} ;
这个命令中也是把{}作为前面find出来的文件的替代符,后面的\为;的脱意符,不然Shell会把分号作为该行命令的结尾。这个-exec有时候也挺实用的,它同样可以实现刚刚上面批量更改文件名的需求。 -
screen工具介绍
有时候,会有这样的需求,要执行一个命令或者脚本,但是需要几个小时甚至几天。这就要考虑一个问题,就是中途断网或出现其他意外情况,执行的任务中断了怎么办?可以把命令或者脚本丢到后台运行,不过也不保险。下面就介绍两种方法来避免这样的问题发生。
(1)使用nohup
[root@VM_10_10_centos ~]# cat /usr/local/sbin/sleep.sh
#!/bin/bash
sleep 1000
[root@VM_10_10_centos ~]# nohup sh /usr/local/sbin/sleep.sh&
[1]19997
直接加一个“&”虽然丢到后台了,但是当退出该终端时很有可能这个脚本也会退出的,而在前面加上nohup就没有问题了,nohup的作用就是不挂断地运行命令。
(2)screen工具的使用
简单来说,screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的ssh连接窗口那样。下面将介绍screen的一个简单应用。
① 打开一个会话,直接输入screen命令然后回车,进入screen会话窗口。如果你没有screen命令,请用 yum install -y screen 安装,示例代码如下:
[root@VM_10_10_centos ~]# screen
② screen -ls 查看已经打开的screen会话,示例代码如下:
[root@VM_10_10_centos ~]# screen -ls
There is a screen on:
20990.pts-0.Linux (Attached)
1 Socket in /var/run/screen/S-root.
③ 按Ctrl+A再按D键退出该screen会话,只是退出,并没有结束。结束的话,按Ctrl +D 键或者输入exit。
④ 退出后还想再次登录某个screen会话,使用sreen -r [screen 编号],这个编号就是上例中那个20900。当只有一个screen会话时,后面的编号是可以省略的。当有某个需要长时间运行的命令或者脚本时,就打开一个screen会话,然后运行该任务。按Ctrl+A再按D键退出会话,不影响终端窗口上的任何操作。