• 随堂练习 作业管理和计划任务


    Linux的作业控制

    前台作业:通过终端启动,且启动后一直占据终端

    后台作业:可通过终端启动,但启动后即转入后台运行(释放终端)

    让作业运行于后台

      运行中的作业: Ctrl+z

      尚未启动的作业: COMMAND &

    后台作业虽然被送往后台运行,但其依然与终端相关;退出终端,将关闭后台作业。如果希望送往后台后,剥离与终端的关系

    nohup COMMAND &>/dev/null &
    screen;COMMAND
    tmux;COMMAND
    查看当前终端所有作业:

    jobs

    作业控制:

    fg [[%]JOB_NUM]:把指定的后台作业调回前台

    bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行

    kill [%JOB_NUM]: 终止指定的作业

    并行运行
    利用后台执行,实现并行功能,即同时运行多个进程,提高效率
    方法1

    cat all.sh
    f1.sh&
    f2.sh&
    f3.sh&

    方法2

    (f1.sh&);(f2.sh&);(f3.sh&)

    方法3

    f1.sh&f2.sh&f3.sh&

    范例:多组命令实现并行

    [root@centos8 ~]# { ping -c3 127.1; ping 127.2; }& { ping -c3 127.3 ;ping 127.4; }&

    范例:

    [root@centos8 ~]# cat scanhost.sh

    #!/bin/bash

    NET=10.0.0

    for i in {1..254};do

      {

        ping -c1 -W1 ${NET}.${i} &> /dev/null && echo ${NET}.${i} is up || echo ${NET}.${i} is down

      }&

    done

    wait

    [root@centos8 ~]# bash scanhost.sh
    10.0.0.7 is up
    10.0.0.1 is up
    10.0.0.2 is up
    10.0.0.6 is up
    10.0.0.8 is up
    10.0.0.3 is down
    10.0.0.5 is down
    10.0.0.29 is down
    10.0.0.14 is down
    10.0.0.15 is down
    10.0.0.10 is down
    10.0.0.23 is down
    10.0.0.12 is down
    ......
    10.0.0.245 is down
    10.0.0.246 is down
    10.0.0.240 is down

    任务计划

    通过任务计划,可以让系统自动的按时间或周期性任务执行任务

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

      at 指定时间点,执行一次性任务

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

    周期性运行某任务

      cron

    一次性任务

    at 工具

    由包 at 提供

    依赖与atd服务,需要启动才能实现at任务

    at队列存放在/var/spool/at目录中

    执行任务时PATH变量的值和当前定义任务的用户身份一致

    at 命令:

    at [option] TIME

    常用选项

    -V   显示版本信息

    -t   time 时间格式 [[CC]YY]MMDDhhmm[.ss]

    -l   列出指定队列中等待运行的作业;相当于atq

    -d #   删除指定的作业;相当于atrm

    -c   查看具体作业任务

    -f /path/file   指定的文件中读取任务

    -m   当任务被完成之后,将给用户发送邮件,即使没有标准输出

    注意:
      作业执行命令的结果中的标准输出和错误以执行任务的用户身份发邮件通知给 root
      默认CentOS 8 最小化安装没有安装邮件服务,需要自行安装

    范例:

    [root@centos8 ~]# dnf install postfix -y

    [root@centos8 ~]# systemctl enable --now postfix

    TIME:定义出什么时候进行 at 这项任务的时间

    HH:MM [YYYY-mm-dd]
    noon, midnight, teatime(4pm)
    tomorrow
    now+#{minutes,hours,days, OR weeks}

    范例:at 时间格式

    HH:MM 在今日的 HH:MM 进行,若该时刻已过,则明天此时执行任务
    02:00
    HH:MM YYYY-MM-DD 规定在某年某月的某一天的特殊时刻进行该项任务
    02:00 2016-09-20
    HH:MM[am|pm] [Month] [Date]
    06pm March 17
    17:20 tomorrow
    HH:MM[am|pm] + number [minutes|hours|days|weeks], 在某个时间点再加几个时间后才进行该
    项任务
    now + 5 min
    02pm + 3 days

    at 任务执行方式:
      交互式

      输入重定向

      at -f file

    /etc/at.{allow,deny} 控制用户是否能执行at任务
      白名单:/etc/at.allow 默认不存在,只有该文件中的用户才能执行at命令

      黑名单:/etc/at.deny 默认存在,拒绝该文件中用户执行at命令,而没有在at.deny 文件中的使用者则可执行

      如果两个文件都不存在,只有 root 可以执行 at 命令

    周期性任务计划 cron
    周期性任务计划cron相关的程序包:

    cronie:主程序包,提供crond守护进程及相关辅助工具

    crontabs:包含CentOS提供系统维护任务

    cronie-anacron:cronie的补充程序,用于监控cronie任务执行状况,如:cronie中的任务在过去该运行的时间点未能正常运行,则anacron会随后启动一次此任务

    cron 依赖于crond服务,确保crond守护处于运行状态:

    #CentOS 7 以后版本:
    systemctl status crond

    #CentOS 6:
    service crond status

    cron任务分为
      系统cron任务:系统维护作业,/etc/crontab 主配置文件, /etc/cron.d/ 子配置文件

      用户cron任务:保存在 /var/spool/cron/USERNAME,利用 crontab 命令管理
    计划任务日志:/var/log/cron

      系统cron计划任务
    /etc/crontab 格式说明,详情参见 man 5 crontab
    注释行以 # 开头

    [root@centos8 ~]# cat /etc/crontab

    SHELL=/bin/bash #默认的SHELL类型

    PATH=/sbin:/bin:/usr/sbin:/usr/bin #默认的PATH变量值,可修改为其它路径

    MAILTO=root #默认标准输出和错误发邮件给root,可以指向其它用户

    # For details see man 4 crontabs
    # 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) 离散取值
      #,#,#

    (4) 连续取值
      #-#

    (5) 在指定时间范围上,定义步长
      /#: #即为步长

    (6) 特定关健字
    @yearly 0 0 1 1 *
    @annually 0 0 1 1 *
    @monthly 0 0 1 * *
    @weekly 0 0 * * 0
    @daily 0 0 * * *
    @hourly 0 * * * *
    @reboot Run once after reboot

    范例:

    #晚上9点10分运行echo命令
    10 21 * * * wang /bin/echo "Howdy!"

    #每3小时echo和wall命令
    0 */3 * * * wang /bin/echo “howdy”; wall “welcome to longwang!”

    crond任务相关文件:

    /etc/crontab 配置文件

    /etc/cron.d/ 配置文件

    /etc/cron.hourly/ 脚本

    /etc/cron.daily/ 脚本

    /etc/cron.weekly/ 脚本

    /etc/cron.monthly/ 脚本

    用户计划任务

    crontab命令:
      每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME

      默认标准输出和错误会被发邮件给对应的用户,如:wang创建的任务就发送至wang的邮箱

      root能够修改其它用户的作业

      用户的cron 中默认 PATH=/usr/bin:/bin,如果使用其它路径,在任务文件的第一行加PATH=/path或者加入到计划任务执行的脚本中

    crontab命令格式:

    crontab [-u user] [-l | -r | -e] [-i]

    常用选项

    -l   列出所有任务

    -e   编辑任务

    -r   移除所有任务

    -i   同-r一同使用,以交互式模式移除指定任务

    -u user   仅root可运行,指定用户管理cron任务

    控制用户执行计划任务

    /etc/cron.{allow,deny}

    范例:每个月日期和星期几字段的关系

    [root@centos8 ~]# man 5 crontab
    Note: The day of a command's execution can be specified in the following two
    fields — 'day of month', and 'day of week'. If both fields are restricted
    (i.e., do not contain the "*" character), the command will be run when either
    field matches the current time. For example, "30 4 1,15 * 5" would cause a
    command to be run at 4:30 am on the 1st and 15th of each month, plus every
    Friday.

    范例:修改默认的cron的文本编辑工具

    root@ubuntu1804:~# crontab -e
    no crontab for root - using an empty one
    Select an editor. To change later, run 'select-editor'.
    1. /bin/nano <---- easiest
    2. /usr/bin/vim.basic
    3. /usr/bin/vim.tiny
    4. /bin/ed
    Choose 1-4 [1]:

    root@ubuntu1804:~# cat /etc/profile.d/env.sh
    export EDITOR=vim

    范例:PATH变量

    #方法1,在计划任务配置中指定PATH
    [root@centos8 ~]# crontab -l
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    * * * * * useradd hehe;echo $PATH

    #方法2,在脚本中指定PATH变量
    [root@centos8 ~]# crontab -l
    * * * * * /data/test.sh

    [root@centos8 ~]# cat /data/test.sh
    #!/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    useradd hehe
    echo $PATH

    范例:

    [root@centos8 ~]# cat /usr/bin/disk_check.sh

    #!/bin/bash

    WARNING=10

    df | sed -En '/^/dev/sd/s@^([^ ]+).* ([0-9]+)%.*@1 2@p' | while read DEVICE USE;do

      [ $USE -gt $WARNING ] && echo "$DEVICE will be full,USE:$USE" | mail -s diskfull root

    done

    [root@centos8 ~]# crontab -l
    */10 * * * * check_disk.sh

    面试题:11月每天的6-12点之间每隔2小时执行/app/bin/test.sh

    [root@centos8 ~]# crontab -l
    0 6-12/2 * 11 * /app/bin/test.sh

    注意:运行结果的标准输出和错误以邮件通知给相关用户
    (1) COMMAND > /dev/null

    (2) COMMAND &> /dev/null

    cron任务中不建议使用%,它有特殊用途,它表示换行的特殊意义,且第一个%后的所有字符串会被将成当作命令的标准输入

    如果在命令中要使用%,则需要用 转义

    注意:将%放置于单引号中是不支持的
    范例:

    30 2 * * * /bin/cp -a /etc/ /data/etc`date +\%F_\%T`

    30 2 * * * /bin/cp -a /etc/ /data/etc`date +‘%F_%T’` 有问题

    思考:
    (1) 如何在秒级别运行任务?

    for min in 0 1 2; do echo "hi"; sleep 20; done

    (2) 如何实现每7分钟运行一次任务?
    sleep命令:

    sleep NUMBER[SUFFIX]...
    SUFFIX:

    s: 秒, 默认

    m: 分

    h: 小时

    d: 天

  • 相关阅读:
    AspNetCore打造一个“最安全”的api接口
    efcore分表分库原理解析
    对于经常接触的分页你确定你真的会吗
    Monitor的扩展支持string的超时锁
    Excel导出
    搭建私有Git服务器-GitLab
    C# 爬取网易Buff进行购买
    .Net Core 使用弹性和瞬态故障处理库Polly
    JS Table表格添加多选框
    JS 用户头像展示
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/13308477.html
Copyright © 2020-2023  润新知