单元一 Linux常用系统命令

本单元的主要学习目标:
(1)会使用Linux系统常用命令来查询系统信息
(2)会使用Linux系统命令查看网络相关信息

1.1 监控系统的状态

主要实现的是查看查看系统负载信息和查看系统内存、网卡、进程等信息:

使用w查看当前系统的负载

[root@localhost ~]# w
 15:43:29 up 3 min,  2 users,  load average: 0.11, 0.23, 0.12
 # 时间,        系统运行时间,登录用户数,平均负载
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
#当前登录的都有哪些用户,以及他们是从哪里登录的等等
root     tty1                      15:40    2:09   0.02s  0.02s -bash
root     pts/0    172.16.51.1      15:43    1.00s  0.02s  0.01s w

其实,在这些信息当中,笔者认为我们最应该关注的应该是第一行中的 ‘load average:’ 后面的三个数值。
第一个数值表示1分钟内系统的平均负载值;
第二个数值表示5分钟内系统的平均负载值;
第三个数值表示15分钟系统的平均负载值。
这个值的意义是,单位时间段内CPU活动进程数。当然这个值越大就说明你的服务器压力越大。一般情况下这个值只要不超过服务器的cpu数量就没有关系。

查看服务器有几个cpu

[root@localhost ~]# cat /proc/cpuinfo |head -n20
processor       : 0
vendor_id       : GenuineIntel
cpu family      : 6
model           : 142
model name      : Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz
stepping        : 10
microcode       : 0xb4
cpu MHz         : 1800.000
cache size      : 6144 KB
physical id     : 0
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 0
initial apicid  : 0
fpu             : yes
fpu_exception   : yes
cpuid level     : 22
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch arat tpr_shadow vnmi ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid rdseed adx smap clflushopt xsaveopt xsavec xsaves

‘/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@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1580880    948 159800    0    0   164    12   96  139  1  3 95  1  0

上面讲的 w 查看的是系统整体上的负载,通过看那个数值可以知道当前系统有没有压力,但是具体是哪里(CPU, 内存,磁盘等)有压力就无法判断了。通过 vmstat就可以知道具体是哪里有压力。vmstat命令打印的结果共分为6部分:procs, memory, swap, io, system, cpu,请重点关注一下r b si so bi bo几列。
1.procs 显示进程相关信息

  • r :表示运行和等待cpu时间片的进程数,如果长期大于服务器cpu的个数,则说明cpu不够用了;
  • b :表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要关注一下了;

2.memory 内存相关信息

  • swpd :表示切换到交换分区中的内存数量 ;
  • free :当前空闲的内存数量;
  • buff :缓冲大小,(即将写入磁盘的);
  • cache :缓存大小,(从磁盘中读取的);

3.swap 内存交换情况

  • si :由交换区写入到内存的数据量;
  • so :由内存写入到交换区的数据量;

4.io 磁盘使用情况

  • bi :从块设备读取数据的量(读磁盘);
  • bo: 从块设备写入数据的量(写磁盘);

5.system 显示采集间隔内发生的中断次数

  • in :表示在某一时间间隔中观测到的每秒设备中断数;
  • cs :表示每秒产生的上下文切换次数;

6.CPU 显示cpu的使用状态

  • us :显示了用户下所花费 cpu 时间的百分比;
  • sy :显示系统花费cpu时间百分比;
  • id :表示cpu处于空闲状态的时间百分比;
  • wa :表示I/O等待所占用cpu时间百分比;
  • st :表示被偷走的cpu所占百分比(一般都为0,不用关注);

以上所介绍的各个参数中,笔者经常会关注r列,b列,和wa列。IO部分的bi以及bo也是要经常参考的对象。如果磁盘io压力很大时,这两列的数值会比较高。另外当si, so两列的数值比较高,并且在不断变化时,说明内存不够了,内存中的数据频繁交换到交换分区中,这往往对系统性能影响极大。
我们使用 vmstat 查看系统状态的时候,通常都是使用下面的形式来查看的,示例代码如下。

[root@localhost ~]# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1565876    948 173844    0    0     6     1   13   17  0  0 100  0  0
 0  0      0 1565876    948 173844    0    0     0     0   55   92  0  0 100  0  0
 0  0      0 1565876    948 173844    0    0     0    41   47   81  0  0 100  0  0
 0  0      0 1565876    948 173844    0    0     0     0   49   78  0  0 100  0  0
 0  0      0 1565876    948 173844    0    0     0    16   64  100  0  0 100  0  0

上面的代码表示,每隔一秒钟打印一次状态,共打印5次。

使用top 显示进程所占系统资源

[root@localhost ~]# top 
top - 18:19:40 up  2:39,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 353 total,   1 running, 352 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1868688 total,  1564392 free,   128536 used,   175760 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1573244 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                       
 10022 root      20   0  146276   2268   1424 R   0.3  0.1   0:00.06 top                           
     1 root      20   0   44512   7140   2596 S   0.0  0.4   0:04.22 systemd                       
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.05 kthreadd                      
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.46 ksoftirqd/0                   
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.25 kworker/u256:0                
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.47 migration/0                   
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                        
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0                       
    10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1   

这个命令用于动态监控进程所占系统资源,每隔3秒变一次。这个命令的特点是把占用系统资源(CPU,内存,磁盘IO等)最高的进程放到最前面。top命令打印出了很多信息,包括系统负载(loadaverage)、进程数(Tasks)、cpu使用情况、内存使用情况以及交换分区使用情况。需要你关注的也就是几项:%CPU, %MEM, COMMAND 这些项目所代表的意义,RES 这一项为进程所占内存大小,而 %MEM 为使用内存百分比。
在 top 状态下,按 “shift + m”, 可以按照内存使用大小排序。按数字 ‘1’ 可以列出各颗cpu的使用状态。
另外,笔者经常用的一个命令 top -bn1 它表示非动态打印系统资源使用情况,示例代码如下:

[root@localhost ~]# top -bn1
top - 18:21:17 up  2:41,  2 users,  load average: 0.00, 0.01, 0.05
Tasks: 354 total,   1 running, 353 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.7 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1868688 total,  1564440 free,   128520 used,   175728 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1573292 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 10024 root      20   0  146272   2092   1352 R  31.2  0.1   0:00.05 top
     1 root      20   0   44512   7140   2596 S   0.0  0.4   0:04.22 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.05 kthreadd
     3 root      20   0       0      0      0 S   0.0  0.0   0:00.47 ksoftirqd/0
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.25 kworker/u256:0
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.47 migration/0
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0
    10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1

和 top 命令唯一的区别就是,它一次性全部把所有信息输出出来而非动态显示。

使用free查看内存使用状况

[root@localhost ~]# free
              total        used        free      shared  buff/cache   available
Mem:        1868688      127704     1565284        8776      175700     1574136
Swap:       2097148           0     2097148                                                           

只需要敲一个 free 然后回车就可以当前系统的总内存大小以及使用内存的情况。系统初始化时,就已经分配出很大一部分内存给缓存,这部分缓存用来随时提供给程序使用,如果程序不用,那这部分内存就空闲。所以,查看内存使用多少,剩余多少请看第二行的数据。另外我们还可以加-m 或者-g选项分别以M或G为单位打印内存使用状况,示例代码如下:

[root@localhost ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:           1824         124        1528           8         171        1537
Swap:          2047           0        2047

使用ps 查看系统进程

在Linux下,其实在上面介绍的top命令就可以,但是不容易看,当然还有专门显示系统进程的命令,示例代码如下:

[root@localhost ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3  44512  7140 ?        Ss   15:40   0:04 /usr/lib/systemd/systemd --switch
root          2  0.0  0.0      0     0 ?        S    15:40   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    15:40   0:00 [ksoftirqd/0]
root          6  0.0  0.0      0     0 ?        S    15:40   0:00 [kworker/u256:0]
root          7  0.0  0.0      0     0 ?        S    15:40   0:00 [migration/0]
root          8  0.0  0.0      0     0 ?        S    15:40   0:00 [rcu_bh]
root          9  0.0  0.0      0     0 ?        S    15:40   0:00 [rcuob/0]
root         10  0.0  0.0      0     0 ?        S    15:40   0:00 [rcuob/1]

下面介绍几个参数的意义。

  • 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命令的使用,笔者经常会连同管道符一起使用,用来查看某个进程或者它的数量,下面介绍几个案例,示例代码如下:

[root@localhost ~]# ps aux |grep -c mingetty
1
[root@localhost ~]# ps aux |grep mingetty
root      10033  0.0  0.0 112644   948 pts/0    S+   18:24   0:00 grep --color=auto mingetty

上面的1不对,需要减掉1,因为使用grep命令时,grep命令本身也算作了一个

使用netstat 查看网络状况

[root@localhost ~]# netstat -ntpl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1472/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2361/master         
tcp6       0      0 :::22                   :::*                    LISTEN      1472/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      2361/master

netstat命令用来打印网络连接状况、系统所开放端口、路由表等信息。笔者最常用的关于netstat的命令就是这个 netstat -lnp (打印当前系统启动哪些端口)以及 netstat -an (打印网络连接状况)这两个命令非常有用,请一定要记住。

[root@localhost ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp        0     52 172.16.51.29:22         172.16.51.1:62633       ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     
raw6       0      0 :::58                   :::*                    7          
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  11     [ ]         DGRAM                    8959     /dev/log
unix  2      [ ACC ]     STREAM     LISTENING     14104    /run/systemd/private

如果你所管理的服务器是一台提供web服务(80端口)的服务器,那么你就可以使用 netstat -an |grep 80 查看当前连接web服务的有哪些IP了。

1.2 Linux网络相关

主要使用Linux网络命令查看网卡信息:
ifconfig类似与windows的ipconfig,不加任何选项和参数只打印当前网卡的IP相关信息(子网掩码、网关等)。在windows下设置IP非常简单,然而在命令窗口下如何设置?这就需要去修改配置文件/etc/sysconfig/network-scripts/ifcfg-eth0了。

多个网卡中,只重启某一个网卡

[root@localhost ~]# ifdown eno16777736; ifup eno16777736

有一点要注意的是,如果我们远程登录服务器,当使用ifdown eth0这个命令的时候,很有可能后面的命令ifup eth0不会被运行,这样导致我们断网而无法连接服务器,所以请尽量使用 service network restart 这个命令来重启网卡。

给一个网卡设定多个IP

在Linux系统中,网卡是可以设定多重IP的,示例代码如下:

[root@localhost ~]#  cd /etc/sysconfig/network-scripts/
[root@localhost ~]#   cp ifcfg-eno16777736 ifcfg-eno16777736\:1

然后编辑ifcfg-eth0:1 这个配置文件,内容如下,一定要注意 DEVICE 这里要写成 “eth0:1”

[root@localhost network-scripts]# vi ifcfg-eno16777736\:1 
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
DEVICE=eno16777736:1
ONBOOT=yes
IPADDR=172.16.51.30
PREFIX=24
GATEWAY=172.16.51.2
DNS1=8.8.8.8

编辑好后,重启网卡,之后再查看网卡ip。

[root@localhost ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:50:56:33:82:6a brd ff:ff:ff:ff:ff:ff
    inet 172.16.51.29/24 brd 172.16.51.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet 172.16.51.30/24 brd 172.16.51.255 scope global secondary eno16777736:1
       valid_lft forever preferred_lft forever
    inet6 fe80::250:56ff:fe33:826a/64 scope link 
       valid_lft forever preferred_lft forever

更改主机名

当装完系统后,默认主机名为localhost,使用hostname就可以知道你的Linux的主机名是什么,示例代码如下:

[root@localhost ~]# hostname
localhost.localdomain

同样使用hostname可以更改你的主机名,示例代码如下:

[root@localhost ~]# hostname linux
[root@localhost ~]# hostname
linux

下次登录时就会把命令提示符 [root@localhost ~] 中的 localhost 更改成 Linux, 不过这样修改只是保存在内存中,下次重启还会变成未改之前的主机名,所以需要你还要去更改相关的配置文件 “/etc/sysconfig/network”,示例代码如下:

[root@localhost ~]#  vim /etc/sysconfig/network
NETWORKING=yes
        HOSTNAME=linux.localdomain

设置DNS

DNS是用来解析域名用的,平时我们访问网站都是直接输入一个网址,而dns把这个网址解析到一个IP。在Linux下面设置dns非常简单,只要把dns地址写到一个配置文件中即可。这个配置文件就是/etc/resolv.conf。

[root@localhost ~]#  vim /etc/resolv.conf
# Generated by NetworkManager
        nameserver 202.106.46.151
        nameserver 8.8.8.8

resolv.conf有它固有的格式,一定要写成 “nameserver IP” 的格式,建议写两个或多个namserver ,默认会用第一个namserver去解析域名,当第一个解析不到时会使用第二个。
在Linux下面有一个特殊的文件/etc/hosts也能解析域名,不过是需要我们手动在里面添加IP+域名这些内容,它的作用是临时解析某个域名,非常有用,示例代码如下:

[root@localhost ~]#  vim /etc/hosts
127.0.0.1  localhost  localhost.localdomain
::1  localhost.localdomain   localhost
10.10.10.10 master

保存后,再ping一下 master就会到 10.10.10.10 了,示例代码如下:

[root@localhost ~]#  ping -c2 master
PING master (10.10.10.10) 56(84) bytes of data.
64 bytes from master (10.10.10.10): icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from master (10.10.10.10): icmp_seq=2 ttl=64 time=0.045 ms
--- master ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2257ms
rtt min/avg/max/mdev = 0.033/0.042/0.048/0.006 ms

/etc/hosts 的格式很简单,每一行作为一条记录,分成两部分,第一部分是IP,第二部分是域名。关于hosts文件,有几点需要你注意:
1.一个IP后面可以跟多个域名,可以是几十个甚至上百个;
2.每行只能有一个IP,也就是说一个域名不能对应多个IP;
3.如果有多行中出现相同的域名(前面IP不一样),会按最前面出现的记录来解析。

Linux的防火墙

SeLinux是Redhat/CentOS系统特有的安全机制。不过因为这个东西限制太多,配置也特别繁琐所以几乎没有人去真正应用它。所以装完系统,我们一般都要把seLinux关闭,以免引起不必要的麻烦。关闭seLinux的方法为,使 “SELinux=disabled”, 默认为 enforcing,示例代码如下:

[root@localhost ~]# vi /etc/sysconfig/selinux 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

保存该配置文件后,重启机器方可生效,临时关闭seLinux的命令,可以使用setenforce 0.我们可以使用getenforce命令获得当前seLinux的状态,示例代码如下。

[root@localhost ~]# getenforce 
Enforcing

seLinux关闭成功会显示“Disabled”,默认会输出 “enforcing” , 当使用 setenforce 0 这个命令后,再 getenforce 会输出 “permissive”。

1.3 Linux系统任务计划

主要使用crontab工具来定时处理脚本或任务
其实大部分系统管理工作都是通过定期自动执行某一个脚本来完成的,那么如何定期执行某一个脚本呢?这就要借助Linux的cron功能了。
关于cron任务计划功能的操作都是通过crontab这个命令来完成的。其中常用的选项有:

  • -u :指定某个用户,不加-u选项则为当前用户;
  • -e :制定计划任务;
  • -l :列出计划任务;
  • -r :删除计划任务。

使用 crontab -e 进行编写任务计划

[root@localhost ~]# crontab -e
no crontab for root - using an empty one

这实际上是使用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@localhost ~]# crontab -l
 01 10 05 06 3 echo "ok" > /root/cron.log

使用crontab -r命令删除计划任务

[root@localhost ~]# crontab -r
[root@localhost ~]# crontab -l
no crontab for root

1.4 Linux系统数据备份

主要使用rsync工具来备份数据
在Linux系统下数据备份的工具很多,但笔者就只用一种那就是rsync. 从字面上的意思你可以理解为remote sync (远程同步)这样可以让你理解的更深刻一些。rsync不仅可以远程同步数据,当然还可以本地同步数据,rsync不像cp/scp一样会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同,只有不同时才会把不同的部分覆盖掉。

安装rsync工具

yum install -y rsync
下面笔者先举一个例子,然后再详细讲解rsync的用法,示例代码如下:

[root@localhost ~]# rsync -av sync.txt /tmp/
sending incremental file list
sync.txt

sent 80 bytes  received 31 bytes  222.00 bytes/sec
total size is 4  speedup is 0.04

上面例子表示把当前目录下的sync.txt同步到/tmp/目录下,也可以更改目标文件的名字, rsync -av sync.txt /tmp/newsync.txt, 如果是远程拷贝的话就是这样的形式了: IP:path (如:10.0.2.34:/root/),示例代码如下:

[root@localhost ~]# rsync -av sync.txt 172.16.51.18:/tmp/cpsync.txt
[email protected]'s password: 
sending incremental file list

sent 33 bytes  received 12 bytes  18.00 bytes/sec
total size is 1723  speedup is 38.29

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. 第三种格式是从远程目录同步数据到本地。第四种以及第五种格式使用了两个冒号,这种方式和前面的方式的不同在于验证方式不同,稍后详细介绍。

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), 请熟记他们吧。

1.5 Linux系统日记

本任务主要使用Linux系统自带的日记系统来判定系统状况
日志主要的功能有:审计和监测,还可以实时的监测系统状态,监测和追踪侵入者等等。

了解日志文件:/var/log/message

笔者常查看的日志文件为/var/log/message, 它是核心系统日志文件包含了系统启动时的引导消息,以及系统运行时的其他状态消息。IO错误、网络错误和其他系统错误都会记录到这个文件中。另外其他信息,比如某个人的身份切换为root以及用户自定义安装的软件(apache)的日志也会在这里列出。
通常,/var/log/messages是在做故障诊断时首先要查看的文件。那你肯定会说了,这么多日志都记录到这个文件中,那如果服务器上有很多服务岂不是这个文件很快就会写的很大,没错,但是系统有一个日志轮询的机制,每星期切换一个日志,变成message.xxxxxxxx, message.xxxxxxxx, … messages.xxxxxxxx 连同messages一共有5个这样的日志文件。这里的xxxxxxxx就是按照日期的格式生成的文件,在CentOS5里,这个后缀并不是日期而是数字1,2,3,4. 这是通过logrotate工具的控制来实现的,它的配置文件是/etc/logrotate.conf如果没有特殊需求请不要修改这个配置文件
/var/log/messages是由syslogd这个守护进程产生的,如果停掉这个服务则系统不会产生/var/log/messages,所以这个服务不要停。Syslogd服务的配置文件为/etc/syslog.conf这个文件定义了日志的级别,具体详细的东西笔者不再阐述,因为若没有特殊需求是不需要修改这个配置文件的,请使用 man syslog.conf 获得更多关于它的信息。

使用dmesg命令显示系统的启动信息

如果你的某个硬件有问题(比如说网卡)用这个命令也是可以看到的,示例代码如下:

[root@localhost ~]# dmesg | less
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.10.0-327.el7.x86_64 ([email protected]) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015
[    0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-327.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8
[    0.000000] Disabled fast string operations
[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[    0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[    0.000000] BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000007fedffff] usable
[    0.000000] BIOS-e820: [mem 0x000000007fee0000-0x000000007fefefff] ACPI data

安全方面的日志

“/var/log/wtmp”查看登录Linux历史信息

[root@localhost ~]# last |head
#账户名称、登录终端、登录客户端ip、登录日期及时长
root     pts/0        172.16.51.1      Tue Sep  8 18:18   still logged in   
root     pts/0        172.16.51.1      Tue Sep  8 15:43 - 17:57  (02:14)    
root     tty1                          Tue Sep  8 15:40   still logged in   
reboot   system boot  3.10.0-327.el7.x Tue Sep  8 15:40 - 18:57  (03:17)    
reboot   system boot  3.10.0-327.el7.x Sat Jun 20 16:26 - 18:57 (80+02:31)  
root     pts/0        172.16.51.1      Sat Jun 20 05:41 - crash  (10:45)    
root     tty1                          Sat Jun 20 05:40 - crash  (10:45)    
reboot   system boot  3.10.0-327.el7.x Sat Jun 20 05:40 - 18:57 (80+13:17)  
root     tty1                          Thu Jun 18 08:51 - crash (1+20:48)   
reboot   system boot  3.10.0-327.el7.x Thu Jun 18 08:51 - 18:57 (82+10:06) 

last命令输出的信息实际上是读取了二进制日志文件/var/log/wtmp, 只是这个文件不能直接使用cat, vim, head, tail等工具查看。

“/var/log/secure”记录验证和授权等方面的信息

另外一个和登陆信息有关的日志文件为/var/log/secure,比如ssh登陆系统成功或者失败,都会把相关信息记录在这个日志里。
以后在你日常的管理工总中要养成多看日志的习惯,尤其是一些应用软件的日志,比如apache, mysql, php等常用的软件,看它们的日志(错误日志)可以帮助你排查问题以及监控它们的运行状况是否良好。

1.6 Linux命令xargs与exec用法

主要使用Linux中xargs与exec工具结合其他命令来实现业务需求

xargs命令

[root@localhost ~]# echo "111222" > 123.txt
[root@localhost ~]# ls 123.txt |xargs cat
111222

它的作用就是把管道符前面的输出作为xargs后面的命令的输入。它的好处在于可以把本来两步或者多步才能完成的任务简单一步就能完成。xargs常常和find命令一起使用,比如,查找当前目录创建时间大于10天的文件,然后再删除, 示例代码如下:

[root@localhost ~]# find . -mtime +10 |xargs rm

这种应用是最为常见的,xargs后面的rm 也可以加选项,当是目录时,就需要-r选项了。在笔者看来xargs的这个功能不叫什么,它的另一个功能才叫神奇。现在我有一个这样的需求,查找当前目录下所有.txt的文件,然后把这些.txt的文件变成.txt_bak。正常情况下,我们不得不写脚本去实现,但是使用xargs就一步,示例代码如下:

[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
[root@localhost test]# touch 1.txt 2.txt 3.txt 
[root@localhost test]# ls
1.txt  2.txt  3.txt
[root@localhost test]# ls *.txt |xargs -n1 -i{} mv {} {}_bak
[root@localhost test]# ls
1.txt_bak  2.txt_bak  3.txt_bak
[root@localhost test]# 

xargs -n1 –i{} 类似for循环,-n1意思是一个一个对象的去处理,-i{}把前面的对象使用{}取代,mv {} {}_bak 相当于 mv 1.txt 1.txt_bak。你刚开始接触这个命令时也许有点难以理解,多练习一下你就会熟悉了,笔者建议你记住这个应用,很实用。

exec命令

使用find命令时,经常使用一个选项就是这个-exec了,可以达到和xargs同样的效果。比如,查找当前目录创建时间大于10天的文件并删除,示例代码如下:

[root@localhost ~]#  find . -mtime +10 -exec rm -rf {}\;

这个命令中也是把{}作为前面find出来的文件的替代符,后面的 \ 为 ; 的脱意符,不然shell会把分号作为该行命令的结尾。这个-exec有时候也挺实用的,它同样可以实现刚刚上面批量更改文件名的需求.

执行任务如何不中断

有时候,我们也许会有这样的需求,要执行一个命令或者脚本,但是需要几个小时甚至几天。这就要考虑一个问题,就是中途断网或出现其他意外情况,执行的任务中断了怎么办?你可以把命令或者脚本丢到后台运行,不过也不保险。笔者下面就介绍两种方法来避免这样的问题发生。

1.使用nohup

[root@localhost ~]#  cat  /usr/local/sbin/sleep.sh
#!/bin/bash
sleep 1000
[root@localhost ~]# nohup sh /usr/local/sbin/sleep.sh&
[1] 10730
[root@localhost ~]# nohup: ignoring input and appending output to ‘nohup.out’

上列代码中直接加一个 ‘&’ 虽然丢到后台了,但是当退出该终端时很有可能这个脚本也会退出的,而在前面加上 nohup 就没有问题了,nohup的作用就是不挂断地运行命令。

2.screen工具的使用

简单来说,screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的SSH连接窗口那样。下面笔者介绍screen的一个简单应用。
1)打开一个会话,直接输入screen命令然后回车,进入screen会话窗口。如果你没有screen命令,请用 yum install -y screen 安装,示例代码如下:

[root@localhost ~]#  screen

2)screen -ls 查看已经打开的screen会话,示例代码如下:

[root@localhost ~]# screen -ls
There is a screen on:
        10747.pts-0.linux       (Detached)
1 Socket in /var/run/screen/S-root.

3)Ctrl +a 再按d退出该screen会话,只是退出,并没有结束。结束的话输入Ctrl +d 或者输入exit

4)退出后还想再次登录某个screen会话,使用sreen -r [screen 编号],

[root@localhost ~]# screen -r 10747

这个编号就是上例中那个10747. 当只有一个screen会话时,后面的编号是可以省略的。当你有某个需要长时间运行的命令或者脚本时就打开一个screen会话,然后运行该任务。按ctrl +a 再按d退出会话,不影响终端窗口上的任何操作。

猜你喜欢

转载自blog.csdn.net/zhang_ZERO/article/details/109052883