Linux学习22-作业管理及任务计划

作业管理及任务计划

1. 作业管理

  • Linux的作业控制
    1. 前台作业:通过终端启动,且启动后一直占据终端
    2. 后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)
  • 让作业运行于后台

    1. 运行中的作业:Ctrl+z ,送往后台并处于停止状态
    2. COMMAND&:$ping 172.20.50.160 &
  • 让后台停止的程序继续运行

    1. 发送信号唤醒 ,
      $kill -18 6731 进程编号6731
      killall -18 ping 如果后台程序只有一个,也可以这样写
    2. 使用bg命令
      $jobs <==取得后台程序编号
      [1]+ Stopped ping 172.20.50.160
      $bg 1 <==将后台程序1,在后台继续执行
  • 终止后台作业

    1. fg把指定的后台作业调回前台,再执行终止指令
      $fg 1 <==将后台程序1,唤至前台
    2. kill[%JOB_NUM]:终止指定的作业
      $kill %1 <==1为后台程序编号
  • 后台执行的作业,再次休眠,发送信号19
    $kill -18 6731 进程编号6731
    killall -18 ping

  • 剥离与终端的关系,防止意外中断

    1. 命令nohup

      nohup  ping127.1 &> /dev/null&
      默认情况会将输出结果定向到,当前目录新建的nohup.out文件中
      
    2. 命令screen

      1. $screen        <==执行命令建立会话
      2. $ping 127.1    <==在会话中执行长时间后台任务
      3. 在screen窗口键入C-a d   <==从会话剥离,做别的事情
      4. $screen  -r    <==回到会话,程序依然在进行
      
  • 并行运行
    同时运行多个进程,提高效率

    1. 建立脚本,将多任务都放入脚本中,让其后台执行

      1 :$cat 1.sh 2.sh 3.sh     <=创建3个ping命令脚本
          #FILENAME:  1.sh
          ping 127.1 
          #FILENAME:  2.sh
          ping 127.2
          #FILENAME:  3.sh
          ping 127.3      
      2 :$./1.sh;./2.sh;./3.sh      <=这样做,结果是顺序执行
      3 :$cat  v9.sh                 <=将3个脚本如新建的脚本,并后台执行
          1.sh &
          2.sh &
          3.sh &
      4 :$./v9.sh                    <=多任务并行执行
      
    2. 将脚本单个放入后台执行,创建的是子进程

       $(./1.sh&);(./2.sh&);(./3.sh&);
      
    3. 放在大括号中,实现并行执行

      ${./1.sh&  ./2.sh&  ./3.sh& } 
      

2. 任务计划

2.1 同步时间及启动服务

  • 时间同步
    任务计划前提是时间准确

    1. CentOS6中同步时间

      1. 选择一个服务器作为同步主体,这里以172.20.0.1为例
        $ ntpdate 172.20.0.1
      2. 修改网络时间协议文件,以自动同步时间
        $vim /etc/ntp.conf
      3. 修改文件,增加server 172.20.0.1 iburst

        $vim /etc/ntp.conf  
        ......省略前面部分
        # Use public servers from the pool.ntp.org project.         <==找到这样的说明
        # Please consider joining the pool (http://www.pool.ntp.org/join.html).
        server 172.20.0.1 iburst                 <==增加此行,自动同步服务
        server 0.centos.pool.ntp.org iburst      <==这些为系统连接服务,可以考虑注释掉
        server 1.centos.pool.ntp.org iburst
        server 2.centos.pool.ntp.org iburst
        server 3.centos.pool.ntp.org iburst 
        
      4. 确定开机自动开启服务,chkconfig –list ntpd
        其中的0、1、2、3、4、5、6,表示运行级别runlevel
        off为未启用,on为启用

        $chkconfig  --list ntpd
        ntpd            0:off   1:off   2:off   3:off   4:off   5:off   6:off
        $runlevel 
        N 5
        
      5. 启动开机启动服务:chkconfig ntpd on

        $chkconfig  ntpd   on
        $chkconfig  --list ntpd
        ntpd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
        
      6. 查看当前是否已经启动ntpd服务
        service ntpd status
      7. 启动服务
        service ntpd start
    2. CentOS7中同步时间
      工具chrony
      配置文件/etc/chrony.conf

      1. 首先同步一下时间,以172.20.0.1为例
        $ ntpdate 172.20.0.1
      2. 修改配置文件/etc/chrony.conf

        $vim  /etc/chrony.conf 
        # Use public servers from the pool.ntp.org project.
        # Please consider joining the pool (http://www.pool.ntp.org/join.html).
        server 172.20.0.1 iburst           <==增加行
        server 0.centos.pool.ntp.org iburst   <==pool的公共服务器,可以考虑注释掉
                    ......                    <==省略中间
        # Allow NTP client access from local network.
        #allow 192.168.0.0/16    修改文本网段的地址,允许本网络同步本机
        
        # Serve time even if not synchronized to a time source.
        #local stratum 10        即使不能同步远程服务器,也可以提供对外服务
        
      3. 查看服务是否启动
        $systemctl status atd

      4. 启动服务
        systemctl start ntpd
      5. 查看是否为开机启动
        $systemctl is-enabled ntpd
      6. 如果没有开启开机启动,使用如下命令
        $systemctl enable ntpd
  • 服务器集群之间的系统时间同步
    在生产环境中,可以搭建一台内网时间服务器,然后让所有计算机都到服务端去同步时间即可

    1. CentOS6

      $vim /etc/ntp.conf  
              ......省略前面部分
      # Permit time synchronization with our time source, but do not
      # permit the source to query or modify the service on this system.
      # restrict default kod nomodify notrap nopeer noquery     <==注释掉此项,此项只运行主机同步别人
      restrict -6 default kod nomodify notrap nopeer noquery  
              ......省略中间部分
      # Use public servers from the pool.ntp.org project.
      # Please consider joining the pool (http://www.pool.ntp.org/join.html). 
          server 172.20.0.1 iburst           <==添加本地服务,以和其它主机同步
          server ntp.aliyun.com  iburst      <==添加一个远程时间服务器
      
    2. CentOS7

      $vim  /etc/chrony.conf 
          # Use public servers from the pool.ntp.org project.
          # Please consider joining the pool (http://www.pool.ntp.org/join.html).         
          server 172.20.0.1 iburst           <==添加本地服务,以和其它主机同步
          server ntp.aliyun.com  iburst      <==添加一个远程时间服务器
          #server 0.centos.pool.ntp.org iburst   <==pool的公共服务器,注释掉
                      ......                 <==省略中间
          # Allow NTP client access from local network.
          allow 172.20.0.0/16    <==修改为本网段的地址,允许本网络同步本机
      
          # Serve time even if not synchronized to a time source.
          local stratum 10       <==启用,即使不能同步远程服务器,也可以提供对外服务
      
  • 服务启动总结

    1. CentOS7:以下命令中atd为服务名称,可替换,启动服务通用
      1. 查看当前是否启动:systemctl status atd
      2. 启动命令为:systemctl start atd
      3. 确保服务开机启动:systemctl enable atd
      4. 查看是否为开机启动的:systemctl is-enabled atd
      5. 关闭防火墙:systemctl disable firewalld
    2. CentOS6

      1. 确保服务开机启动:chkconfig –list atd
      2. 修改启动模式:chkconfig atd on|off
      3. 查看当前是否启动:service atd status
      4. 启动服务:service atd start
      5. 关闭防火墙:chkconfig iptables off
    3. 关掉selinux

2.2 未来的某时间点执行一次任务

  • 命令at
    用于在指定时间执行任务,来自at包
    依赖于atd服务,需要启动才能实现at任务
    1. 格式
      at [option] TIME batch 系统空闲时候执行一次任务
    2. 选项
      -V :显示版本信息
      -l :列出指定队列中等待运行的作业;相当于atq
      -d:删除指定的作业;相当于atrm
      -c:查看具体作业任务
      -f /path/file:指定的文件中读取任务
      -m:当任务被完成之后,将给用户发送邮件,即使没有标准输出
      注意:作业执行命令的结果中的标准输出和错误不会在屏幕上输出,以邮件通知给相关用户
    3. 任务存放目录
      1. 队列任务:/var/spool /at/
      2. 用户控制,控制用户是否能执行at任务
        • /etc/at.allow白名单
          默认不存在,需自建,只有该文件中的用户才能执行at命令
        • /etc/at.deny黑名单
          拒绝该文件中用户执行at命令,而at.deny文件外使用者均可执行
        • 如果两个文件都不存在,只有root可以执行at命令
        • 白名单优先级高于黑名单,假设A用户同时存在于2个名单中,仍然可以执行at
        • 白名单存在,而没有添加用户,只有root可以执行
    4. 支持的时间格式
      1. 在今日的HH:MM进行,若该时刻已过,则明天此时执行任务
        HH:MM 02:00
      2. 规定在某年某月的某一天的特殊时刻进行该项任务
        HH:MM YYYY-MM-DD 16:20 2018-09-07
        YYYY-MM-DD HH:MM- t 201809071620
      3. 支持12小时表示,月份为英文单词
        HH:MM [am|pm][Month][Date]
        $at 06pm September 079月7日下午6点
      4. 在某个时间点再加几个时间后才进行该项任务
        HH:MM[am|pm]+number [minutes|hours|days|weeks]
        now +5 min五分钟以后
        02pm +1 weeks一周后下午2点
  • 示例

    1. 用at命令先来创建一个任务

      #at 9:00
       at> echo good good study
       <EOT>                    <==CTRL+d来结束输入
       job 2 at Fri Sep  7 09:00:00 2018
      #ls /var/spool/at
       a000020186b25c  spool    <==会自动在此目录创建一个文件
      
      #cat /var/spool/at/a000020186b25c
       ......前面内容省略
       ${SHELL:-/bin/sh} << 'marcinDELIMITER68f6c111'
       echo good good study     <==将要做的任务,可以编辑修改
       marcinDELIMITER68f6c111
      
      #at -l                    <==查看列队中的任务
       2  Fri Sep  7 09:00:00 2018 a root
      #atq                      <==效果与at  -l相同
       2   Fri Sep  7 09:00:00 2018 a root  
      #at -c 2     <==输出内容与/var/spool/at/任务文件相同,2为atq列出的等待任务编号
      
    2. 在2018年9月7日15点25分,将/data目录做备份

      $at -t 201809071525
      at> tar cvf data.tar /data &>/dev/null    <==不接收输出邮件,导入垃圾箱
      at> <EOT>                                 <==CTRL+d来结束输入
      job 10 at Fri Sep  7 15:25:00 2018
      $at -l
      10  Fri Sep  7 15:25:00 2018 a root
      
    3. 应用于脚本中

      方法一
       #!/bin/bash               <==编写脚本t1.sh
       at 17:35<<EOF
       tar cvf data.tar /data &> /dev/null
       wall "ok!"
       EOF
      
      方法二
      $cat f1                   <==将任务写入文件,管道传给at
      tar cvf data.tar /data &> /dev/null
      wall "ok!"
      #$cat f1|at now +5min
      
      方法三
      $at -f  f1  now +5min     <==应用-f选项,读取文件f1
      

2.3 周期性任务计划cron

  • cron相关程序包

    1. cronie:主程序包,提供crond守护进程及相关辅助工具
      CentOS7: /usr/lib/systemd/system/crond.service 需要启动的守护进程,格式通用
      CentOS6 : /etc/rc.d/inin.d/crond 需要启动的守护进程,格式通用
    2. cronie-anacron:cronie的补充程序,用于监控cronie任务执行情况,如cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务
      后台自动运行程序anacron
    3. crontabs:用于安排程序执行的root crontab文件;cronie等守护进程检查crontab文件查看何时安排执行特定命令。
      /usr/bin/run-parts 这是一个脚本,可以调用某个文件夹里的所有计划任务
  • 计划任务
    1. 确保crond守护处于运行状态,监控用户创建提交的相关计划任务,当条件满足,就会自动执行。
    2. 对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义
    3. root可以修改任何人的计划任务

2.2.1 全局cron任务

系统维护作业,只有root有权限

  • 全局任务相关文件说明

    1. /etc/crontab
      全局配置文件,编辑可建立计划任务
    2. /etc/cron.d/
      相当于子配置文件,可以将计划任务单独建立文件,放在此目录下,用于多用户环境,区分使用,任务创建格式为
      SHELL=/bin/bash
      PATH=/sbin:/bin:/usr/sbin:/usr/bin
      MAILTO=root
      01 * * * * root run-parts /etc/cron.hourly

      1. /etc/cron.d/下0hourly文件
        每小时调用一次/etc/cron.hourly目录下的脚本

                $cat 0hourly 
                # Run the hourly jobs
                SHELL=/bin/bash
                PATH=/sbin:/bin:/usr/sbin:/usr/bin
                MAILTO=root
                01 * * * * root run-parts /etc/cron.hourly
        
        1. 进入脚本/etc/cron.hourly,可以看到脚本0anacron
          脚本作用是,让没有执行的计划任务,在脚本执行后,会查找没有执行的计划任务,自动执行

                  $ls /etc/cron.hourly/
                  0anacron
                  $vim /etc/cron.hourly/0anacron                       
                  /usr/bin/on_ac_power &> /dev/null 判断是否为电池供电  0为电源   非0为电池
          
        2. 类似hourly的系统计划

          1. /etc/cron.hourly/ 脚本
          2. /etc/cron.daily/ 脚本 每天的计划任务
          3. /etc/cron.weekly/ 脚本
          4. /etc/cron.monthly/ 脚本
    3. 日志文件
      日志:/var/log/cron

    4. 周期计划任务文件
      /var/spool/cron
    5. 用户控制文件
      /etc/cron.deny(黑名单)
    6. 管理临时文件

      1. CentOS6使用/etc/cron.daily/tmpwatch定时清除临时文件
      2. CentOS7使用systemd-tmpfiles-setup服务实现清除临时文件

        1. 配置文件为/usr/lib/tmpfiles.d/tmp.conf
        2. 命令:systemd-tmpfiles-clean|remove|create configfile
  • 创建方法: 编辑文件 /etc/crontab

            $vim /etc/crontab
            # 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.定义时间    | 2.定义用户|   3.执行的操作       |<==格式说明
              55 8 * * *        root      wall "hello!"      <==例在每天的8点55广播hello!
    
    1. 定义时间的表示方法:

      1. 特定值
        给定时间点有效取值范围内的值
        59 23 31 12 * 每年的12月31日23:59
      2. *
        给定时间点上有效取值范围内的所有值
        表示“每。。。”
      3. 离散取值 #,#
        表示多个不连续的时段
        30 8 10,20,30 * * 每月的10、20、30号的8点30分
        30 4 1,15 * 5表示1号、15号,以及每个星期五
      4. 连续取值 #-#
        表示多个连续的时段
        30 8-12 10 * *每月10号8点到12点的第30分
      5. 在指定时间范围上,定义步长
        */5 * * * * 每5分钟

      6. 特殊时间格式写法

格式 对应时间参数 含义
@reboot Run once after reboot
@yearly 0 0 1 1 * 每年执行一次在1月1日0点0分
@annually 0 0 1 1 * 每年执行一次在1月1日0点0分
@monthly 0 0 1 * * 每月执行一次在1日0点0分
@weekly 0 0 * * 0 每周执行一次在周日0点0分
@daily 0 0 * * * 每天执行一次在0点0分
@houly 0 * * * * 每小时执行一次在0分
  • 示例

示例1:执行多任务写法,每3小时echo和wall命令,每个任务直接以;隔开

0 */3 * * * centos /bin/echo “howdy”;/usr/bin/wall “welcome to Magedu!”

示例2:破坏性示例:无限重启

# *  *  *  *  * user-name  command to be executed
@reboot root reboot

修复示例2
1. 重启在如下画面中输入e
这里写图片描述
2. 进入如下画面,如图中linux16行尾,加上rd.break字符串(蓝色部分),不要回车
这里写图片描述
3. 组合键CTRL+x,进入特殊模式emergency,输入mount查看挂载情况,如图,根挂载于/sysroot下
这里写图片描述
4. 此时根目录为只读模式,重新挂载为读写模式
mount -o remount,rw/sysroot
5. 将任务计划删除
vim /sysroot/etc/crontab

2.2.1 anacron系统

由/etc/cron.hourly/0anacron执行
当执行任务时,更新/var/spool/anacron/cron.daily文件的时间戳

  • 配置文件:
    /etc/anacrontab:负责执行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly中系统任务
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   <==在此时间范围内,系统才会执行检测到的任务
|       1       |         2        |       3         |    4   |    
#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
  • 内容概要
    1. 字段1:如果在这些日子里没有运行这些任务
    2. 字段2:在重新引导后等待这么多分钟后运行它
    3. 字段3:任务识别器,在日志文件中标识
    4. 字段4:要执行的任务

2.2.1 用户cron任务

  • 每个用户都有专用的cron任务文件
    /var/spool/cron/USERNAME

  • 这个编辑没有颜色,可以执行export EDITOR=vim
    保存,/etc/profile.d/test.sh

  • 控制用户执行 计划任务
    /etc/cron.{allow,deny}

  • 创建计划任务: crontab命令

    1. 格式: crontab [-u user] [-l|r|-e] [-i]
    2. 选项
      -l:列出所有任务
      -e:编辑任务
      -r:移除所有任务
      -i:同-r一同使用,以交互式模式移除指定任务
      -u user:仅root可运行,指定用户管理cron任务
    3. 创建格式
      时间设置+命令,不需要写用户,可以添加多行
      * * * * * wall hello

    4. 示例

      1. 指定v9用户创建计划任务$crontab -u v9 -e
      2. 如何实现每7分钟运行一次任务,/7是除不尽的,任务到后来就不会执行
        将分转换为秒,然后循环执行
      3. 如何在秒级别运行任务?
        执行任务休眠20秒,再执行,再休眠20秒。。。
        *****for min in 0 1 2; do echo ‘hi’; sleep 20; done
        1. sleep命令:
          格式:sleep NUMBER [SUFFIX]
          选项SUFFIX:
          s: 秒,默认,支持0.01秒
          m: 分
          m: 小时
          m: 天
        2. usleep命令
          精确到微妙

batch:系统自行选择空闲时间去执行指定的任务

fuser -v /data 这个命令啥时候学的!!!

猜你喜欢

转载自blog.csdn.net/free050463/article/details/82466505
今日推荐