Linux: 任务的定时与延期

概述

  • ls 这种命令是立刻执行的命令,在linux中命令还可以延时执行,它们都涉及到时间的观念

常用命令

  • 先来看下有关系统时间的规格

1 ) date 命令调节时间

  • $ date 显示当前时间
  • 还可以去定制 date 的一个输出, $ man date 可自定义输出
    • $ data "+%H" ,H 是 hour 的首字母,表示 "小时"
    • $ date "+%H:%M:%S" M是分钟,S是秒
      • 也可以自定义分隔其他的字符 $ date "+%H时%M分%S秒"
      • $ data "+现在是%Y年"
  • 这个规则是 + 开头,% 后面的才会被解析

2 )用 date 修改系统时间

  • 需要 root 权限 $ sudo date 10121430 这里没有指定年份, 就拿当前的年份一起做修改
    • 这里会修改成 2024年10月12日14点30分
    • 注意,系统如果开启了自动同步时间,过一会儿时间还会更新成网络同步的

3 ) at 命令:延时执行一个程序

  • 使用 at 命令来设定一个程序的执行时间

  • at 命令只能让程序执行一次

  • 示例

    sh 复制代码
    Wang:~ Wang$ at 22:10
    touch file1.txt
    touch file2.txt
    job 3 at Thu Nov 21 22:10:00 2024
    • 这里 让 22:10 的时候做的事情
    • touch file1.txt 和 touch file2.txt
    • 当按下 CTRL + D 的组合键的时候,显示 job 3 at Thu Nov 21 22:10:00 2024
    • 这里 3 是 job 的编号,表示 3 号任务,我之前创建了2个任务,所以这次是 3
  • 同理:

    • 在明天的某一个时刻执行任务:$ at 22:10 tomorrow
    • 在 11月 22日的 22:10执行任务: $ at 22:10 12/10/19
  • 另一种用法:在指定时间间隔之后执行任务

    • 在 10分钟之后执行程序:$ at now +10 minutes
  • at 命令中的一些关键字

    • minutes: 分钟
    • hours: 小时
    • days: 天
    • weeks: 星期
    • months: 月
    • years
    • 用法同上
  • atq 和 atrm 命令 列出和删除正在等待执行的 at 任务

    • 每次使用 at 指定延期的任务,都会分配 job 编号
    • atq 中的 q 是队列
  • 示例

    sh 复制代码
    Wang:~ Wang$ atq
    1	Thu Nov 21 22:10:00 2024
    3	Thu Nov 21 22:10:00 2024
    Wang:~ Wang$ atrm 1 3
    Wang:~ Wang$ atq
    • atrm 一次删除了多个任务,再次 atq 发现已经全部删除了

4 )sleep 命令:休息一会

  • 可以用分号隔开多个命令,一个接一个执行
  • 这和管道不一样,管道是前一个命令作为后一个命令的输入
  • 用分号隔开的命令,没有关联,例如:
    • $ touch file.txt
    • $ rm file.txt
    • 这里,创建文件,然后再删除它
  • 在两句命令之间可以插入一定的暂停等待时间
    • $ touch file.txt; sleep 10; rm file.txt
  • sleep 后面的数值单位是 秒,也可以指定为 分钟,小时,天等
    • $ sleep 15m
    • m: 分钟
    • h: 小时
    • d: 天

5 )&& 和 || 符号

  • 在编程语言里,一般称为 "逻辑与" 和 "逻辑或"
  • && 与 || 和 分号一样,用于分隔两个命令,使得命令依次执行
  • 貌似和分号类似,但是有区别
    • &&:&& 号前的命令执行成功,才会执行后面的命令
    • ||: || 号前的命令执行失败,才会执行后面的命令
    • 分号: 不论分号前的命令执行成功与否,都执行分号后的命令

6 )crontab 命令:定时执行程序

  • at 命令只能执行某个(某几个)命令一次
  • crontab 却可以重复执行命令
  • 例如:每小时,每分钟,每天,每星期等等

6.1 centos/redHat 安装 crontab

  • 默认 centos 内置了 crontab 程序
  • 不过有的 Linux 发行版可能没装 crontab
  • 举 yum 系列 和 apt 系列的两个例子来看
  • $ sudo yum install vixie-cron crontabs 安装 Crontab
  • $ chkconfig crond on 设为开机自启动
  • $ service crond start 启动

6.2 Ubuntu/Debian 中安装 Crontab

  • $ sudo apt install cron 安装 crontab
  • $ service cron restartrestart cron 重启 crontab

6.3 前期配置工作

  • 来修改 .bashrc 文件,这是 bash 这个 shell 的配置文件
  • $ echo "export EDITOR=nano" >> ~/.bashrc 变更默认编辑器为 nano
  • $ source ~/.bashrc

6.4 了解 crontab

  • crontab 其实是一个命令,用来读取和修改名为 crontab 的文件

  • crontab 文件包含了你要定时执行的程序列表,也包含了执行的时刻

  • 实际上,有2个命令:一个叫 crontab, 一个叫 cron

  • crontab 用于修改 crontab 文件,cron 用于实际执行定时的程序

  • cron 这个单词来源于希腊语,愿意是时间

  • crontab 三个主要参数

    • -l: 显示 crontab 文件
    • -e: 创建/修改 crontab 文件
    • -r: 删除 crontab 文件
  • 修改 crontab 文件

    • 编辑的格式: m h dom mon dow command
    • 上面这句话给出了 crontab 中的每行指令的书写格式
    • m 是 分钟
    • h 是 小时
    • dom 是 day of month 一个月的那一天
    • mon 是 月份
    • dow 是 day of week 星期几
    • command 需要定时执行的命令
  • 参考下图:

  • 现在希望每天 22点10分都在home目录下创建 file.txt 文件

  • 可以在 crontab 文件里写入

    • 10 22 * * * touch ~/file.txt
    • 10 表示 分钟,22 表示小时,其他3个区域是 *
    • 最后的命令是 touch ~/file.txt
  • 路径最好是绝对路径,因为不确定你 cron 命令执行这些语句的时候在哪个家目录

  • 保存后,如果语法正确,crontab 会显示,$ crontab: installing new crontab

  • 意思是正在安装新的 crontab 文件

  • 常用示例如下

    Crontab 意义
    47 * * * * command 每个小时的47分都执行command命令,也就是00点47分,01点 47分,02点47分,等等
    0 0 * * 1 command 每个礼拜一的凌晨都执行 command 命令
    30 5 1-15 * * command 每个月的1~15日的5点30分都执行command命令
    0 0 * * 1, 3, 4 command 每个礼拜一,礼拜三,礼拜四的凌晨都执行 command 命令
    0 */2 * * * command 每2个小时的整点(0,2,4,6,等等)都执行 command命令
    */10 * * * 1-5 command 每个礼拜一到礼拜五的每个10的倍数的分钟(0,10,20,30,等等)都执行 command 命令
  • 列出 contab 文件 $ crontab -l

  • 删除它 $ crontab -r

相关推荐
Zmxcl-00740 分钟前
IIS解析漏洞
服务器·数据库·microsoft
Stark、40 分钟前
【Linux】文件IO--fcntl/lseek/阻塞与非阻塞/文件偏移
linux·运维·服务器·c语言·后端
新手上路狂踩坑1 小时前
Android Studio的笔记--BusyBox相关
android·linux·笔记·android studio·busybox
一个不秃头的 程序员2 小时前
服务器上加入SFTP------(小白篇 1)
运维·服务器
fnd_LN2 小时前
Linux文件目录 --- 复制命令CP、递归复制目录、软连接、硬链接
linux·运维·服务器
MorleyOlsen3 小时前
【Trick】解决服务器cuda报错——RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
运维·服务器·深度学习
周周的奇妙编程3 小时前
基于鲲鹏服务器的打砖块小游戏部署
运维·服务器
OopspoO3 小时前
Linux查看键鼠输入
linux
从后端到QT3 小时前
boost asio 异步服务器
服务器·网络·tcp/ip
墨水\\3 小时前
Ansible部署及基础模块
服务器·网络·ansible