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

作业管理及任务计划

1. 作业管理

  • Linux的作业控制

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

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

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

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

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

    1. 命令nohup
      默认情况会将输出结果定向到,当前目录新建的nohup.out文件中,不会在屏幕中打印
    例如:执行ping命令时在其前加nohup,执行后切断网络,过一定时间连接网络,查看进程,或者jobs,剥离后执行的命令不会丢失
    [root@hai7 ~]$nohup  ping127.1 &> /dev/null&	
    
    1. 命令screen
    1. [root@hai7 ~]$screen        <==执行命令建立会话
    2. [root@hai7 ~]$ping 127.1    <==在会话中执行长时间后台任务
    3. 在screen窗口键入C-a d   <==从会话剥离,做别的事情
    4. [root@hai7 ~]$screen  -r    <==回到会话,程序依然在进行
    
  • 并行运行
    同时运行多个进程,提高效率

    1. 建立脚本,将多任务都放入脚本中,让其后台执行
    '创建3个ping命令脚本'
    [root@hai6  ~]$cat 1.sh 2.sh 3.sh    
    #FILENAME:  1.sh
    ping 127.1 
    #FILENAME:  2.sh
    ping 127.2
    #FILENAME:  3.sh
    ping 127.3		
    '在命令行一起执行命令,各命令以;隔开,结果为顺序执行,也就是结束第一个,后续的才能执行'
    [root@hai6  ~]$./1.sh;./2.sh;./3.sh     
    '将创建的脚本1.sh、2.sh、3.sh放入文件其后加&,如下所示'
    [root@hai6  ~]$cat  v9.sh                 <=将3个脚本如新建的脚本,并后台执行
    			1.sh &
    			2.sh &
    			3.sh &
    [root@hai6  ~]$./v9.sh                    <=多任务并行执行
    
    1. 将脚本单个放入后台执行,创建子进程 ,实现并行执行
      (./1.sh&);(./2.sh&);(./3.sh&);
    2. 放在大括号中,实现并行执行
      {./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
      [root@hai6  ~]$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 
      
      1. 确定开机自动开启服务,chkconfig --list ntpd
        其中的0、1、2、3、4、5、6,表示运行级别runlevel
        off为未启用,on为启用
      [root@hai6  ~]$chkconfig  --list  ntpd
      ntpd           	0:off	1:off	2:off	3:off	4:off	5:off	6:off
      [root@hai6  ~]$runlevel 
      N 5
      
      1. 启动开机启动服务:chkconfig ntpd on
      [root@hai6  ~]$chkconfig  ntpd   on
      [root@hai6  ~]$chkconfig  --list ntpd
      ntpd           	0:off	1:off	2:on	3:on	4:on	5:on	6:off
      
      1. 查看当前是否已经启动ntpd服务
        service ntpd status
      2. 启动服务
        service ntpd start
    2. CentOS7中同步时间
      工具:chrony
      配置文件:/etc/chrony.conf

      1. 首先同步时间,以172.20.0.1为例
        ntpdate 172.20.0.1
      2. 修改配置文件/etc/chrony.conf
      [root@hai6  ~]$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        <==即使不能同步远程服务器,也可以提供对外服务
      
      1. 查看服务是否启动
        $systemctl status atd
      2. 启动服务
        systemctl start ntpd
      3. 查看是否为开机启动
        $systemctl is-enabled ntpd
      4. 如果没有开启开机启动,使用如下命令
        $systemctl enable ntpd
  • 服务器集群之间的系统时间同步
    在生产环境中,可以搭建一台内网时间服务器,然后让所有计算机都到服务端去同步时间即可

    1. CentOS6
    [root@hai6  ~]$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      <==添加一个远程时间服务器
    
    1. CentOS7
    [root@hai6  ~]$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. 查看防火墙状态:firewall-cmd --state
      6. 关闭防火墙:systemctl stop firewalld
      7. 禁止开机启动:systemctl disable firewalld
    2. CentOS6

      1. 确保服务开机启动:chkconfig --list atd
      2. 修改启动模式:chkconfig atd on|off
      3. 查看当前是否启动:service atd status
      4. 启动服务:service atd start
      5. 查看防火墙状态:service iptables status
      6. 关闭防火墙:chkconfig iptables off
      7. 开机自启防火墙:chkconfig iptables on
    3. 关掉selinux
      编辑/etc/selinux/config文件
      找到行并改为:SELINUX=disabled

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

  • 命令:batch
    系统空闲时候执行一次任务

  • 命令at
    用于在指定时间执行任务,来自at包
    依赖于atd服务,需要启动才能实现at任务

    1. 格式
      at [option] TIME
      作业执行命令的结果中的标准输出和错误不会在屏幕上输出,以邮件通知给相关用户
    2. 选项
    选项作用
    -V显示版本信息
    -l列出指定队列中等待运行的作业;相当于atq
    -d删除指定的作业;相当于atrm
    -c查看具体作业任务
    -f /path/file指定的文件中读取任务
    -m当任务被完成之后,将给用户发送邮件,即使没有标准输出
    -t在指定时间执行任务,格式[[CC]YY]MMDDhhmm[.ss]
    1. 任务存放目录
      1. 队列任务:/var/spool /at/
      2. 用户控制,控制用户是否能执行at任务
        • /etc/at.allow白名单
          默认不存在,需自建,只有该文件中的用户才能执行at命令
        • /etc/at.deny黑名单
          拒绝该文件中用户执行at命令,而at.deny文件外使用者均可执行
        • 如果两个文件都不存在,只有root可以执行at命令
        • 白名单优先级高于黑名单,假设A用户同时存在于2个名单中,仍然可以执行at
        • 白名单存在,而没有添加用户,只有root可以执行
    2. 支持的时间格式
      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命令先来创建一个任务

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

    [root@hai7 ~]$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
    [root@hai7 ~]$at -l
    10	Fri Sep  7 15:25:00 2018 a root
    
  3. 应用于脚本中

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

2.3 周期性任务计划cron

  • cron相关程序包

    1. cronie:主程序包,提供crond守护进程及相关辅助工具
      1. CentOS7: /usr/lib/systemd/system/crond.service
      2. 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 脚本,可以调用/etc/cron.daily;/etc/cron.hourly;/etc/cron.monthly;/etc/cron.weekly里的所有计划任务,定期执行
  • 计划任务

    1. 确保crond守护处于运行状态,监控用户创建提交的相关计划任务,当条件满足,就会自动执行。
    2. 对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义,将%放置于单引号中,则可不用转义
    3. root可以修改任何人的计划任务

2.2.1 全局cron任务

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

  • 全局任务相关文件说明

    1. /etc/crontab
      全局配置文件,编辑可建立计划任务
    2. /etc/cron.d/
      相当于子配置文件,可以将计划任务单独建立文件,放在此目录下,用于多用户环境,区分使用,任务创建格式为
      1. 子配置文件创建格式为
      SHELL=/bin/bash
      PATH=/sbin:/bin:/usr/sbin:/usr/bin
      MAILTO=root     		<==如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
      01 * * * * root run-parts /etc/cron.hourly      <==含义见全局配置文件
      
      1. /etc/cron.d/下0hourly文件
        上面说的run-parts脚本每小时调用一次/etc/cron.hourly
      [root@hai7 ~]$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
      [root@hai7 ~]$cat /etc/cron.hourly/0anacron 
      #!/bin/sh
      # Check whether 0anacron was run today already
      if test -r /var/spool/anacron/cron.daily; then     <==查找没有执行的计划任务,自动执行
        day=`cat /var/spool/anacron/cron.daily`
      fi
      if [ `date +%Y%m%d` = "$day" ]; then
        exit 0;
      fi
      
      # Do not run jobs when on battery power
      if test -x /usr/bin/on_ac_power; then         <==判断是否为电池供电
        /usr/bin/on_ac_power >/dev/null 2>&1
          if test $? -eq 1; then
        exit 0
      fi
      fi
      /usr/sbin/anacron -s
      
    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分钟
  2. 特殊时间格式写法

格式对应时间参数含义
@rebootRun once after reboot
@yearly0 0 1 1 *每年执行一次在1月1日0点0分
@annually0 0 1 1 *每年执行一次在1月1日0点0分
@monthly0 0 1 * *每月执行一次在1日0点0分
@weekly0 0 * * 0每周执行一次在周日0点0分
@daily0 0 * * *每天执行一次在0点0分
@houly0 * * * *每小时执行一次在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

示例3:修复示例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中系统任务
    1. 配置文件内容
    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. 字段1:在这个时间段里没有运行这些任务
      2. 字段2:在重新引导后等待这么多分钟后运行它
      3. 字段3:任务识别器,在日志文件中标识
      4. 字段4:要执行的任务

2.2.1 用户cron任务

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

  • 这个编辑没有颜色,可以执行export EDITOR=vim
    保存设置,在目录/etc/profile.d/下建立以.sh后缀的文件将export EDITOR=vim让在文件中

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

  • 创建计划任务: crontab命令

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

    2. 示例

      1. 指定v9用户创建计划任务crontab -u v9 -e
      2. 如何实现每7分钟运行一次任务,/7是除不尽的,任务到后来就不会执行
        方法:将分转换为秒,然后循环执行
      3. 如何在秒级别运行任务?
        执行任务休眠20秒,再执行,再休眠20秒。。。
        *****for min in 0 1 2; do echo 'hi'; sleep 20; done
    3. sleep命令:

      1. 格式:sleep NUMBER [SUFFIX]
      2. SUFFIX:
        s: 秒,默认,支持0.01秒
        m: 分
        m: 小时
        m: 天
    4. usleep命令

      1. 格式
        usleep <us>
        睡眠多少微妙
      2. 示例:比较sleep与usleep精度
      [root@hai7 ~]$date +%S.%N;usleep 3000000;date +%S.%N
      43.784830122
      46.797193094
      [root@hai7 ~]$date +%S.%N;sleep 3;date +%S.%N
      06.507325464
      09.517159317
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值