zoukankan      html  css  js  c++  java
  • 系统管理之资源与定时任务

    一、系统资源查看相关命令

    1、vmstat 命令监控系统资源
    [root@centos ~]# 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
     0  0      0 329960  21424  49564    0    0   324    34   84  140  1  2 91  6  0	
     0  0      0 329928  21424  49560    0    0     0     0   26   29  0  0 100  0  0	
     0  0      0 329928  21424  49560    0    0     0     0   27   32  0  0 100  0  0
    procs:进程信息字段:
     r:等待运行的进程数,数量越大,系统越繁忙。
     b:不可被唤醒的进程数量,数量越大,系统月繁忙
    memory:内存信息字段:
     swpd:虚拟内存的使用情况,单位 KB。
     free:空闲的内存容量,单位 KB。
     buff:缓冲的内存容量,单位 KB。
     cache:缓存的内存容量,单位 KB。
    swap:交换分区的信息字段:
     si:从磁盘中交换到内存中数据的数量,单位 KB。
     so:从内存中交换到磁盘中数据的数量,单位 KB。此两个数越大,证明数据需要经常在磁盘和内存之间交换,系统性能越差。
    io:磁盘读写信息字段:
     bi:从块设备读入数据的总量,单位是块。
     bo:写到块设备的数据的总量,单位是块。此两个数越大,代表系统的 I/O 越繁忙。 
    system:系统信息字段:
     in:每秒被中断的进程次数。
     cs:每秒钟进行的事件切换次数。此两个数越大,代表系统与接口设备的通信非常繁忙。
    CPU:CPU 信息字段:
     us:非内核进程消耗 CPU 运算时间的百分比。
     sy:内核进程消耗 CPU 运算时间的百分比。
     id:空闲 CPU 的百分比。
     wa:等待 I/O 所消耗的 CPU 百分比。
     st:被虚拟机所盗用的 CPU 占比	
    
    2、dmesg 显示开机时内核检测信息
    #dmesg 输出的信息很多,需要自己过滤
    [root@centos ~]# dmesg | grep "eth0"       #网卡相关信息
    
    [root@centos ~]# dmesg | grep "cpu"        #cpu信息
    
    
    3、free 命令查看内存使用状态
    [root@centos ~]# free 选项
    选项:
    -b: 以字节为单位显示  
    -k: 以 KB 为单位显示,默认就是以 KB 为单位显示  
    -m: 以 MB 为单位显示  
    -g: 以 GB 为单位显示
    -h:  友好显示 
    
    [root@centos ~]# free -h
                 total       used       free     shared    buffers     cached
    Mem:          474M       152M       322M       228K        20M        48M
    -/+ buffers/cache:        83M       391M
    Swap:         1.9G         0B       1.9G
    
    第一行       总内存       已使用      空闲     多进程共享    缓冲        缓存
    第二行        used-buffers-cached    free+buffers+cached
    第三行       总量         已使用       空闲
    
    4、查看 CPU 信息

    CPU 的主要信息保存在/proc/cpuinfo 这个文件当中,我们只要查看这个文件,就可以知道 cpu 的相关信息。

    [root@centos ~]# cat /proc/cpuinfo 
    processor	: 0
    vendor_id	: GenuineIntel
    cpu family	: 6
    model		: 94
    ......
    
    5、查看本机登陆用户信息

    如果我们想要知道 Linux 服务器上目前已经登录的用户信息,可以使用 w 或 who 命令来进行查询。

     15:48:51 up 23 min,  1 user,  load average: 0.01, 0.02, 0.05
    当前时间   开机时间    一个用户   过去,5 ,10,15 min 的负载
    USER     TTY      FROM              LOGIN@       IDLE       JCPU   PCPU     WHAT
    用户     登录终端  从哪里登录         登陆时间     用户闲置时间                 当前在做什么
    root     pts/0    100.100.100.1    15:28          0.00s     0.04s  0.00s      w
    
    JCPU   指的是和该终端连接的所有进程占用的 CPU 运算时间。这个时间里并不包括过去 的后台作业时间,但却包括当前正在运行的后台作业所占用的时间。
    PCPU   是指当前进程所占用的 CPU 运算时间。
    
    6、查看系统与内核相关信息
    [root@centos ~]# uname [选项] 选项:  
    -a: 查看系统所有相关信息;  
    -r: 查看内核版本;  
    -s: 查看内核名称
    
    #可以通过 file 命令来判断系统文件(主要是系统命令)的位数来推断系统的位数
    [root@centos ~]# file /bin/ls
    /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
    

    二、定时任务

    使用 at 命令 设置执行一次的定时任务。
    1、at 服务管理与访问控制

    at 命令要想正确执行,需要 atd 服务的支持。atd 服务是独立的服务,需要保证服务已经正常启动。

    [root@centos ~]# service atd start #一般情况下服务默认启动
    [root@centos ~]# chkconfig atd on  #设置开机自启
    [root@centos ~]# chkconfig --list | grep 'atd'
    atd            	0:off	1:off	2:on	3:on	4:on	5:on	6:off
    

    atd 服务启动之后,at 命令才可以正常使用,不过我们还需要了解下at 命令的访问控制。这里的访问控制指的是允许哪些用户使用 at 命令设定定时任务,或者不允许哪些用户使用 at 命令,at 的访问控制是依靠/etc/at.allow 文件(白名单)和/etc/at.deny 文件(黑名单)这两个文件来实现的。

    • 如果系统中有/etc/at.allow 文件,那么只有写入/etc/at.allow 文件(白名单)中的用户可以使用 at 命令,其他用户不能使用 at 命令(/etc/at.deny 文件会被忽略,也就是说同一个用户既写入/etc/at.allow 文件,也写入/etc/at.deny 文件,那么这个用户是可以使用 at 命令的,因为/etc/at.allow 文件优先级更高。
    • 如果系统中没有/etc/at.allow 文件,只有/etc/at.deny 文件,那么写入/etc/at.deny 文件 (黑名单)中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
    • 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 命令。 系统中默认时只有/etc/at.deny 文件,而且这个文件是空的,这样的话系统中所有的用户都可以 使用 at 命令。不过如果我们打算控制用户的 at 命令权限,把用户写入/etc/at.deny 文件即可 /etc/at.allow 文件的权限更高,如果/etc/at.allow 文件存在,则/etc/at.deny 文件失效。 /etc/at.allow 管理行为更加严格,因为只有写入这个文件的用户才能使用 at 命令,如果需要禁用 at 命令的用户较多,则可以把少数用户写入这个文件。/etc/at.deny 文件的管理较为松散,如果允许使用 at 命令的用户较多,则可以把禁用的用户写入这个文件。不过这两个文件都不能对 root 用户生效。
    2、at命令
    [root@centos ~]# at [选项] 时间 
    选项:  
    -m:   当 at 工作完成后,无论是否命令有输出,都用 email 通知执行 at 命令的用户  
    -c 工作号:  显示该 at 工作的实际内容
    时间:   at 支持的时间格式如下:  
    HH:MM    在指定的“小时:分钟”执行命令,例如:02:30  
    HH:MM YYYY-MM-DD 在指定的“小时:分钟 年-月-日”执行,例如 02:30 2018-07-25  
    HH:MM[am|pm] [month] [date]  在指定的“小时:分钟[上午|下午][月][日]”执行,例如 02:30 July 25  
    HH:MM[am|pm] + [minutes|hours|days|weeks] 在指定的时间“再加多久执行”,例如 now + 5 minutes,05am +2 hours 
    

    at 命令只要指定正确的时间,就可以输入需要在指定时间执行的命令了,这个命令可以是系统命令,也可以是 shell 脚本。

    例子 1:在五分钟后执行hello脚本
    [root@centos ~]# cat 1.sh 
    #!/bin/bash
    echo "hello"
    
    [root@centos ~]# at now +2 minutes 
    at> /bin/bash /root/1.sh
    at> <EOT>  ctrl + d 保存任务
    job 2 at 2019-12-10 16:21
    
    例子 2: #在三点执行重启操作
    [root@centos ~]# at 15:00 2019-12-12
    at> /bin/sync                 
    at> /sbin/shutdown -r now
    at> <EOT>
    job 3 at 2019-12-12 15:00
    
    
    3、at管理命令
    1)查询 atq
    [root@centos ~]# atq
    3	2019-12-12 15:00 a root
    
    2)删除 atrm  [工作号] 
    [root@centos ~]# atrm 3
    
    多次执行的定时任务crontab
    1、crond 服务管理与访问控制 crontab 命令是需要 crond 服务支持的,所以要保证其正常运行。
    [root@centos ~]# service crond start #启动 crond 服务
    [root@centos ~]# chkconfig crond on # 设定 crond 服务为开机自启动  crond 服务默认是自启动的。
    

    crontab 命令和 at 命令类似,也是通过/etc/cron.allow 和/etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。

    • 当系统中有/etc/cron.allow 文件时,只有在此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样如果有此文件,/etc/cron.deny 文件会被忽略。
    • 当系统中只有/etc/cron.deny 文件时,则写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。 这个规则基本和 at 的规则一直,同样/etc/cron.allow 文件的优先级比/etc/cron.deny 文件的优先级高,Linux 中默认只有/etc/cron.deny 文件。
    2、crontab 单用户设置
    [root@localhost ~]# crontab [选项] 
    选项:  
    -e:  编辑 crontab 定时任务  
    -l:  查询 crontab 任务  
    -r:  删除当前用户所有的 crontab 任务,如果有多个任务,只想删除一个,可以所以用“crontab -e”  
    -u 用户名: 修改或删除其他用户的 crontab 任务。只有 root 可用 
    
    [root@centos ~]# crontab -e #针对当前用户的crontab任务编辑界面
    第一个“*” 一小时当中的第几分钟 0-59 
    第二个“*” 一天当中的第几小时 0-23 
    第三个“*” 一个月当中的第几天 1-31 
    第四个“*” 一年当中的第几月 1-12 
    第五个“*” 一周当中的星期几 0-7(0 和 7 都代表星期日)
    
    * 代表任何时间。比如第一个“*”就代表一小时中每分钟都执行一次的意思。
    , 代表不连续的时间。比如“0 8,12,16 * * * 命令”,就代表在 每天的 8 点 0 分,12 点 0 分,16 点 0 分都执行一次命令 
    - 代表连续的时间范围。比如“0 5 * * 1-6 命令”,代表在周一到周六的凌晨 5 点 0 分执行命令 
    */n 代表每隔多久执行一次。比如“*/10 * * * * 命令”,代表每隔 10 分钟就执行一遍命令
    

    crontab 例子

    0 5 * * * /sbin/shutdown -r now   #每天凌晨五点执行重启操作
    0 5 * * 6  mysqldump  -u root -p123456 info > /root/info.dump #每周6凌晨5点备份info数据库
    
    3、在书写 crontab 定时任务时,需要注意几个注意事项
    • 六个选项都不能为空,必须填写。如果不确定使用“*”代表任意时间。
    • crontab 定时任务,最小有效时间是分钟,最大时间范围是月。像 2019 年某时执行,3 点 30 分 30 秒这样的时间都不能识别.
    • 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都是以天作为单位, 非常容易让管理员混乱
    • 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都是用绝对路径。
    4、系统的 crontab 设置

    “crontab -e”是每个用户执行的命令,也就是说不同的用户身份可以执行自己的定时任务。可 是有些定时任务需要系统执行,这时我们就需要编辑/etc/crontab 这个配置文件了。当然,并不是说 写入/etc/crontab 配置文件中的定时任务执行时,不需要用户身份,而是“crontab -e”命令定义定 时任务时,默认用户身份是当前登录用户。而修改/etc/crontab 配置文件时,定时任务的执行着身份 是可以手工指定的。这样定时任务的执行会更加灵活,修改起来也更加方便。

    [root@centos ~]# vim /etc/crontab
    SHELL=/bin/bash    #指定shell
    PATH=/sbin:/bin:/usr/sbin:/usr/bin  # 指定 PATH 环境变量
    MAILTO=root  # 如果有报错输出,或命令结果有输出,会向 root 发信息
    HOME=/  # 标示主目录
    
    # For details see man 4 crontabs  #出现失败时,可以查看 crontabs 4等级的帮助
    
    # Example of job definition:
    # .---------------- minute (0 - 59)
    # |  .------------- hour (0 - 23)
    # |  |  .---------- day of month (1 - 31)
    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
    # |  |  |  |  |
    # *  *  *  *  * user-name command to be executed
    
    

    1)crontab配置方法

    • 把你需要定时执行的工作写成脚本程序,并赋予执行权限,然后直接把这个脚本复制到/etc/cron.{daily,weekly,monthly}目录中的任意一个。比如我需要让某个脚本每周执行,那么就把这个脚本复制到/etc/cron.weekly/目中。这样这个脚本就会每周执行一次,具体的执行时间要参考 anacron 的配置。
    • 第二种方法就是修改/etc/crontab 这个配置文件,自己加入自己的定时任务,不过需要注意指定脚本的执行者身份。
    6、anacron

    anacron 是用来干什么的呢?我们的 Linux 服务器如果不是 24 小时开机的,那么刚好在关机的时间段之内有系统定时任务(cron)需要执行,那么这些定时任务是不会执行的。也就是说,假设我们需要在凌晨 5 点 05 分执行系统的日志备份,但是我们的 Linux 服务器不是 24 小时开机的,在晚上需要关机,白天才会再次开机。这个定时任务的执行时间我们的服务器刚好没有开机,那么这个任务就不会执行了。anacron 就是用来解决这个问题的。
    anacron 会使用一天,七天,一个月作为检测周期,用来判断是否有定时任务在关机之后没有执行,如果有这样的任务,anacron 会在特定的时间重新执行这些定时任务。在系统的/var/spool/anacron/ 目录中存在 cron.{daily,weekly,monthly}文件,

    [root@centos ~]# vim /var/spool/anacron/cron.
    cron.daily    cron.monthly  cron.weekly
    

    这些文件中都保存着 anacron 上次执行时的时间。anacron 会去读取这些文件中的时间,然后和当前时间做比较,若果两个时间的差值超过了 anacron 的指定时间差值(一般是 1 天,7 天和一个月),就说明有定时任务漏掉了没有被执行,这时 anacron 会介入而执 行这个漏掉的定时任务,从而保证在关机时没有被执行的定时任务不会被漏掉。在 CentOS 6.x 中,我们使用 cronie-anacron 取代了 vixie - cron 软件包。而且在原先的 CentOS 版本中 /etc/ cron.{daily,weekly,monthly}这些目录中的定时任务会同时被 cron 和 anacron 调用, 这样非常容易出现重复执行同一个定时任务的错误。
    在现在的 CentOS 6.x 中, /etc/cron.{daily,weekly,monthly}目录中的定时任务程序只会被 anacron 调用,从而保证这些定时任务只会在每天、每周或每月被定时执行一次,而不会重复。

    [root@centos ~]# anacron [选项] [工作名] 
    选项:  
    -s: 开始 anacron 工作,依据/etc/anacrontab 文件中的设定的延迟时间执行  
    -n: 立即执行/etc/anacrontab 中所有的工作,忽略所有的延迟时间  
    -u: 更新/var/spool/anacron/cron.{daily,weekly,monthly}文件中的时间戳,但不执行任何工作 
    参数:  工作名: 是依据/etc/anacrontab 文件中定义的工作名
    

    anacron的配置文件为 /etc/anacrontab

    # /etc/anacrontab: configuration file for anacron
    
    # See anacron(8) and anacrontab(5) for details.
    
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    # the maximal random delay added to the base delay of the jobs
    RANDOM_DELAY=45
    # 最大随机延迟。
    # the jobs will be started during the following hours only
    START_HOURS_RANGE=3-22
    #anacron 的执行时间范围是 3:00 - 22:00
    
    #period in days   delay in minutes   job-identifier   command
    1       5       cron.daily              nice run-parts /etc/cron.daily
    7       25      cron.weekly             nice run-parts /etc/cron.weekly
    @monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
    时间差    推迟执行分钟   工作名称         实际执行命令      
    

    所以crontab中定义的定时任务,从本质上还是依赖 anacron 的配置文件。
    我们用 cron.daily 工作来说明下/etc/anacrontab 的执行过程:

    • 首先读取/var/spool/anacron/cron.daily 中的上一次 anacron 执行的时间
    • 和当前时间比较,如果两个时间的差值超过 1 天,就执行 cron.daily 工作
    • 执行这个工作只能在 03:00-22:00 之间
    • 执行工作时强制延迟时间为 5 分钟,再随机延迟 0-45 分钟时间;
    • 使用 nice 命令指定默认优先级,使用 run-parts 脚本执行/etc/cron.daily 目录中的所有可执行文件。
  • 相关阅读:
    面向对象二 — — static、final、常量的初始化、this和super
    面向对象二 — — 继承、抽象类、接口
    面向对象一基础知识
    JDBC简介及其用Java连接数据库
    Java I/O 几个重要流的应用
    GUI Panel 容器以及布局管理器
    Oracle 数据库一
    Java I/O文件拷贝
    Java I/O文件的过滤 、读取、写入
    简单理解io与nio
  • 原文地址:https://www.cnblogs.com/hjnzs/p/12029116.html
Copyright © 2011-2022 走看看