IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> cron的正确食用方法 -> 正文阅读

[系统运维]cron的正确食用方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

cron这个东西相信使用linux系统的人都不陌生,可以说是最常用的一个命令了。虽然我已经用的滚瓜烂熟了,还是想写一个博客来给那些不太会用的小伙伴们细致讲解下。

注:本篇以Ubuntu-20.04系统展开,其它发行版基本差不多


一、cron是什么?

坦白来讲它就是linux的一个shell命令,具体功能就是负责处理定时任务。基本上系统安装好之后,默认会自带一些定时任务,也可以手动添加定时任务。如果命令需要使用环境变量,必须在crontab中定义。

下面是没有任何用户配置的/etc/crontab文件

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 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
17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

注:定义了执行脚本的环境/bin/shell还有部分命令的环境变量,如果你要用到的命令在这些目录里面就可以不用全路径,保险起见为了统一习惯可以都写全路径

二、使用步骤

1.字段含义

先找一个样本分析下,下面的是我安装的nvidia的sdkmanager程序,这个程序的功能是给jetson设备刷机用的,默认你安装的时候会自动往用户配置里加一条cron配置,具体含义请往下看。

# NVIDIA SDK Manager updater
# NVIDIA SDK Manager updater
0 12 */7 * * /bin/bash /home/anold/.nvsdkm/.updater/updater.sh

cron表中的每一行(表项)均由6个字段组成,字段之间以空格分隔并按照以下顺序排列,从左至右依次是:
? 分钟(0~59);
? 小时(0~23);
? 天(1~31);
? 月份(1~12);
? 星期中的某天(0~6);
? 命令(在指定时间执行的脚本或命令)。

前5个字段指定了命令开始执行的时间。多个值之间用逗号分隔(不要用空格)。星号表示任
何时间段。除号表示调度的时间间隔(在天数字段上出现的*/7表示每隔7天执行一次)。

特别说明1:所有的命令最好都写全路径,防止因为环境变量配置导致command not found的问题。反正你只要记得一点,写全路径肯定没错!

所以上面的脚本解释起来就很容易了,每隔7天的当天中午12点整(24小时制)执行一下更新检查脚本,具体脚本内容就不贴出来了,感兴趣的小伙伴可以自己安装程序查看。

特别说明2:星期那一项0是周末不是周一,星期这个习惯是从西方传过来的,西方的习惯里星期天是一周的第一天。

2.加强学习

(1) 在每天中每小时的第2分钟执行脚本test.sh:

02 * * * * /home/slynux/test.sh 

(2) 在每天的第5、6、7小时执行脚本test.sh:

00 5,6,7 * * * /home/slynux/test.sh 

(3) 在周日的时候,每隔2个小时执行脚本script.sh:

00 */2 * * 0 /home/slynux/script.sh 

(4) 在每天凌晨2点关闭计算机:

00 02 * * * /sbin/shutdown -h 

当你编辑完/etc/crontab这个文件,配置的定时任务并不会立即生效,你需要重新加载下配置然后重启crond服务才行(增加或移除都要重复动作)。这个行为必须使用sudo命令或root账户。

/etc/init.d/cron reload
/etc/init.d/cron restart

3.crontab命令

crontab命令可以采用交互式或是使用预先写好的文件。默认每个人都有一个自己的文件,命令执行不需要root权限。先看下命令的帮助

usage:  crontab [-u user] file
        crontab [ -u user ] [ -i ] { -e | -l | -r }
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)

-e是打开交互界面
-l是列出已经有的任务
-r删除已有的任务(注意是全部)
-i删除已有的任务(和r搭配使用,带确认提示y/n)

注:这种方式生成的任务保存在/var/spool/cron/crontabs/目录里面,每个用户都有一个自己的文件,所以不需要root权限也能修改。

另外一种方式就是加载预先写好的文件

1、 创建一个文本文件(例如task.cron),写入cron作业后将文件名作为crontab命令的
参数:
$ crontab task.cron

2、 或者直接在行内(inline)指定cron作业,不再单独创建文件。例如:
$ crontab<<EOF
02 * * * * /home/slynux/script.sh
EOF
cron作业需要写在crontab<<EOF和EOF之间。

4.工作原理

星号(*)指定命令应该在每个时间单位上执行。也就是说,如果*出现在cron作业中的小
时字段,那么命令就会每小时执行一次。如果你希望在多个时段执行命令,那么就在对应的时间
字段中指定时间间隔,彼此之间用逗号分隔(例如要在第5分钟和10分钟时运行命令,那就在分
钟字段中输入5,10)。斜线(除号)可以让我们以特定的时间间隔运行命令。例如,分钟字段中
出现的0-30/5会在每前半小时内,隔5分钟执行一次命令。小时字段中出现的*/12会每隔12小
时执行一次命令。

执行cron作业所使用的权限同创建crontab的用户的权限相同。如果你需要执行要求更高
权限的命令,例如关闭计算机,那么就要以root用户身份执行crontab命令。

在cron作业中指定的命令需要使用完整路径。这是因为cron并不会执行用户的.bachrc,所
以执行cron作业时的环境与终端所使用的环境不同,环境变量PATH可能都没有设置。如果命令
运行时需要设置某些环境变量,必须明确地进行设定。

5.其它用法

crontab命令还包括其他一些选项。

  1. 指定环境变量
    很多命令需要正确地设置环境变量才能够运行。cron命令会将SHELL变量设置为/bin/sh,
    还会根据/etc/passwd设置LOGNAME和HOME。如果还需要其他的环境变量,可以在crontab中
    定义。环境变量可以针对所有作业设置,也可以针对个别作业设置。
    如果定义了环境变量MAILTO,cron就可以通过电子邮件将命令输出发送给用户。
    crontab通过在用户的cron表中插入一行变量赋值语言来定义环境变量。
    下面的crontab定义了环境变量http_proxy,以便于使用代理服务器访问Internet:
http_proxy=http://192.168.0.3:3128 
MAILTO=user@example.com 
00 * * * * /home/slynux/download.sh 

Debian、Ubunto和CentOS发行版中的vixie-cron支持这种格式。对于其他发行版,可以针
对每个命令设置环境变量:

00 * * * * http_proxy=http:192.168.0.2:3128; 
/home/sylinux/download.sh 
  1. 在系统启动时运行命令
    有时候需要在系统启动时运行特定的命令。有些cron实现支持@reboot字段,可以在重启
    过程中执行作业。注意,并不是所有的cron实现都支持这种特性,在一些系统中,只有root用户
    可以这样做。现在检查下面的代码:
@reboot command

这样就会以你的用户身份在重启时运行指定的命令。

6.补充内容

最后说下系统自带的几个定时任务
cron.hourly --每小时执行一次
cron.daily --每天执行一次
cron.weekly --每周执行一次
cron.monthly --每月执行一次


总结

乍一看命令挺多挺杂的,实际上蛮简单的。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-10-22 21:56:36  更:2022-10-22 21:59:13 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:59:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码