Linux的一些知识(9)

Linux的一些知识(9)

一. 定时任务

1. Linux 定时任务简介

计划任务 是需要在指定时间执行的任务或者是周期性执行的任务,比如凌晨3点重启设备,每周对日志文件备份等。Linux 系统会内置 at 和 cron 服务,at 服务用来指定时间执行任务,cron 用来周期性执行任务。

2. at 一次性任务

at 定时任务依赖于Linux 系统的 atd 服务,如果atd 服务不开启,则at 则不起作用,查看 atd 服务开启命令如下:

systemctl status atd

如果显示如下,则表示atd 服务已经开启:

在这里插入图片描述

如果没有 atd 服务,或者是没有 at 命令,则可能是 系统在最小化安装的时候没有装at,此时我们可以 yum 安装at 软件,命令如下:

yum install -y at

at 定时任务相关文件主要有以下2个:

  • /etc/at.deny
  • /etc/at.allow

at.deny 表明不允许哪个用户执行at 服务,at.allow 表明允许那个用户执行at 服务。默认情况下,at.deny 文件存在而ar.allow 文件不存在,而当at.deny 和 at.allow 文件同时存在时,at.allow 文件则会失效,只有当at.deny 文件不存在时,at.allow文件才会生效。

at 命令常用参数如下:

  • -l 表示列出所有的at 定时任务
  • -d 表示删除指定的at 定时任务
  • -c 表示查看指定的at 定时任务
  • -t 表示后面跟字符串化的时间参数

at 命令使用实例如下:

at 00:00 #表示凌晨0点执行
at 2:30pm #表示下午两点半执行
at now+10min #表示十分钟后执行
at 4pm+4days #表示4天以后的下午4点执行
at 10 Jan 31 #表示1月31号上午(不指名上午还是下午就使用24h)10点执行
at -t 202122221300 #2021年11月11日13点执行

我们在键入上述命令并回车后,就会进入at 任务的交互式界面,此时就可以键入我们的定时任务了。在写完以后,ctrl +d 表示保存任务并退出,ctrl+c 表示不保存退出

at 定时任务编辑如下:

在这里插入图片描述

如果定时任务比较长,我们也可以写成脚本,然后使用输入重定向或者 -f 参数的方式来编辑,如下所示:

在这里插入图片描述

如果我们想删除at 定时任务,就可以使用 -d 参数,删除过程如下所示:

在这里插入图片描述

3. cron 周期性任务

任务调用的crond 常驻命令

crond 是linux 用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。

crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux 任务调度的工作主要分为以下两类:

  1. 系统执行的工作:系统周期性要执行的工作,如备份系统数据、清理缓存
  2. 个人执行的工作:某个用户定期要做的工作,例如每隔10分钟见擦汗邮件服务器是否有新信,这些工作可由每个用户自行设置

crontab 是Unix 系统下的定时任务触发器,其使用者的群贤记载在下列文件中:

/etc/cron.deny 该文件中所列的用户不允许使用 crontab 命令

/etc/cron.allow 该文件中所列的用户允许使用crontab 命令

/var/spool/cron/ 是所有用户的crontab 文件

/var/spool/cron/crontabs

控制定时任务

cron 是一个linux 下的定时执行工具,可以在无需人工干预的情况下运行作业。

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重启载入配置

/sbin/service crond status //查看服务状态

cron 周期性任务依赖于系统后台的 crond 进程,类似于 at,我们也要首先确认cron 服务是否开启,执行命令:

systemctl status crond

如果出现如下结果,就表示crond 任务已经开启。

在这里插入图片描述

cron 定时任务分为系统的定时任务和用户的定时任务。

crond 定时任务主要文件如下:

1、/var/spool/cron/

该文件主要用于存放用户设置的定时任务,会以用户名来命名,当用户创建cron 定时任务时,就会在该目录下生成一个同名文件,该文件存储了用户定时任务的具体信息。

2、/etc/cron.deny /etc/cron.allow

与at 定时任务类似,cron.allow 存放了运行创建定时任务的用户,而cron.deny 则存放了不允许创建定时任务的用户,只有当cron.deny 不存在时,cron.allow 才会生效。

3、/etc/cron.monthly/

该文件用来存放系统每个月需要执行的脚本

4、/etc/cron.weekly/

该文件用来存放系统每周需要执行的脚本

5、/etc/cron.daily/

该文件用来存放系统每天需要执行的脚本

6、/etc/cron.hourly/

该文件用来存放系统每小时需要执行的脚本

执行命令 crontab 可以使我们创建定时任务,该命令常用参数如下:

crontab [-u username] [-l | -e | -r]

  • -u 只有root才能进行这个任务,也即帮其他用户新建/删除 crontab工作调度;
  • -e 表示新创建或编辑定时任务
  • -r 表示删除定时任务
  • -l 表示显示定时任务

因此,执行命令:

crontab -e

即可以创建一个定时任务了。

创建定时任务需要遵循一定的规范,在crond 文件中,前面的五列都代表一个时间,从左到右分别是 分钟、小时、天、月、星期,如果不做设置,可以用* 跳过,最后一列表示要执行的任务。

在每一列对应的地方写入具体数值就可以表示定时执行,还可以使用锻钢表示一段时间,如果* 后面加入斜杠,则表示每隔该段时间就执行一次。

crond 定时任务时间设置示例如下:

0 3 * * * #表示每天3点执行
0 */3 * * * #表示每隔3小时执行
0 3 2 * 3 #表示每个月2号的3点或者每周三的3点执行
* * * * * #表示每分钟执行一次
* 1-10 * * * #表示每天的1点到10点执行
使用

1.为当前用户创建cron服务。键入 crontab -e 编辑crontab 服务文件

例如 文件内容为:

*/2 * * * * /bin/sh /data/test.sh

*/2 * * * * 设置什么时候执行脚本

/bin/sh /data/test.sh 可以设定要执行的脚本,需要注意以下 bin/sh 是指运行脚本的命令,后面一段时指脚本存放的路径。

2.查看该用户下的crontab 服务是否创建成功,用 crontab -l 命令

crontab -l

3.启动crontab服务

一般启动服务用 /sbin/service crond start 若是根用户的cron 服务可以用 sudo service crond start

4.查看服务是否已经运行

ps -ax |grep cron

5.crontab 命令

cron 服务提供crontab 命令来设定cron 服务的,以下是这个命令的一些参数与说明:

crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户地cron服务
crontab -e //编辑某个用户地cron服务

比如说

root 查看自己地cron 设置:crontab -u root -l

root 想删除fred地cron设置:crontab -u fred -r

在编辑cron 服务时,编辑地内容有一些格式和约定,输入:crontab -u root -e

进入vi 编辑模式,编辑地内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

7.cron文件语法:

 分     小时     日      月      星期     命令
 0-59   0-23   1-31    1-12    0-6     command 
星期中的 0 代表周日
几个特殊符号的定义:
	* 代表取值范围内的数字
	/ 代表“每”
	- 代表从某个数字到某个数字
	,分开几个离散的数字
一般一行对应一个任务
在这些字段中,除了“command” 是每次都必须指定的字段意外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
可能遇到的问题及解决方法
权限问题

定时任务往往会出现权限问题

crontab 权限问题到 /var/adm/cron/ 下一看,文件 cron.allow 和cron.deny 是否存在

用法如下:

  1. 如果两个文件都不存在,则只有root用户才能使用crontab命令。
  2. 如果cron.allow 存在但cron.deny 不存在,则只有列在cron.allow 文件里的用户才能使用crontab 命令,如果root用户也不在里面,则root用户也不能使用crontab.
  3. 如果cron.allow不存在,cron,deny 存在,则只有列在cron.deny 文件里面的用户不能使用crontab 命令,其它用户都能使用。
  4. 如果两个文件都存在,则列在cron.allow 文件中而且没有列在cron.deny 中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow 中有该用户,则可以使用crontab 命令。
脚本注意事项
  1. 定时任务要加注释
  2. 定时任务命令或脚本结尾加 &>/dev/null 或 >/dev/null 2>&1 或 1>/dev/null 2>/dev/null (输出重定向)
  3. 定时任务执行shell脚本前加/bin/sh,定时任务执行shell脚本不必添加执行权限
  4. 定时任务命令或程序尽量写到脚本里,定时任务只要执行脚本即可

注意操作步骤:

(1)命令行执行

(2)编写脚本

(3)测试脚本

(4)设置定时任务

  1. 生产任务程序不要随意打印输出信息
  2. 定时任务执行的脚本要规范路径(例如 /server/script)
  3. 配置定时任务要规范操作过程
  4. 定时任务执行特殊的字符需要进行转义,否则会报错
  5. 定时任务脚本中如果涉及使用到环境变量,必须在脚本中重新定义,不然,定时任务识别不了
输出重定向

当执行定时任务出现错误时,需要将信息输出,如果没有配置重定向,则默认将信息存储到相应用户下面的文件中 /var/log/mail/${user},不方便查找。因此,需要配置重定向将不同的执行脚本输出到不同的日志中。

示例

0 */2 * * * /test/test.sh >> /home/work/log/test.log 2>&1

其中 >> 表示将输出追加到test.log文件中,2>&1 表示将标准错误重定向到标准输出。

二.date命令

Linux date命令可以用来显示或设定系统的日期与时间。在显示方面使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记。在备份文件的时候我们常结合此命令生成当前日期和时间的文件名。格式符前面以 + 开头,若是不以 + 开头,则表示要设定时间,而时间格式为MMDDhhmm[[CC]YY][.ss],其中MM为月份,DD为日,hh为小时,mm为分钟,CC为年份前两位数字,YY 为年份后两位数字,ss为秒数。

使用

  • 获取命令帮助
date --help
  • 查看命令版本
date --version
  • 查看系统日期及时间
[kaifa@hbase197 /]$ date
Tue Sep 27 15:52:37 CST 2022
  • 以YYYY-MM-DD显示日期
[kaifa@hbase197 /]$ date +%F
2022-09-27
[kaifa@hbase197 /]$ date '+%F'
2022-09-27
  • 以MM/DD/YY 显示日期
[kaifa@hbase197 /]$ date +%D
09/27/22
  • 以MM/DD/YYYY 显示日期
[kaifa@hbase197 /]$ date +%x
09/27/2022
  • 获取系统年份、月份、日子
[kaifa@hbase197 /]$ date +%Y
2022
[kaifa@hbase197 /]$ date +%m
09
[kaifa@hbase197 /]$ date +%d
27
  • 获取系统星期值
[kaifa@hbase197 /]$ date +%a
Tue
[kaifa@hbase197 /]$ date +%A
Tuesday
[kaifa@hbase197 /]$ date +%u
2
[kaifa@hbase197 /]$ date +%w
2
  • 获取系统时区
[kaifa@hbase197 /]$ date +%z
+0800
[kaifa@hbase197 /]$ date +%Z
CST
  • 查询当前日期是一年中的第几周
[kaifa@hbase197 /]$ date +%W
39
[kaifa@hbase197 /]$ date +%U
39
  • 获取系统时间
[kaifa@hbase197 /]$ date +%T
16:03:45
[kaifa@hbase197 /]$ date +%X
04:03:49 PM
  • 显示十二小时制时间
[kaifa@hbase197 /]$ date +%r
04:04:20 PM
  • 显示24小时制时间
[kaifa@hbase197 /]$ date +%R
16:05
  • 按照指定样式显示时间
[kaifa@hbase197 /]$ date +%H-%M-%S
16-07-02
[kaifa@hbase197 /]$ date +%H.%M.%S
16.07.10
  • 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
[kaifa@hbase197 /]$ date +%s
1664266097
  • 设置系统时间
date -s 10:00:00
date -s 10:00:00 20220101
  • 日期和时间分行显示
[kaifa@hbase197 /]$ date +%F%n%T
2022-09-27
16:10:38
  • 按照字符串设置显示日期
# 七天前
[kaifa@hbase197 /]$ date -d '7 days ago' +%Y%m%d
20220920
# 一个月后
[kaifa@hbase197 /]$ date -d 'next month' +%Y%m%d
20221027
# 一年前
[kaifa@hbase197 /]$ date -d '+1 year ago' +%Y%m%d
20210927

使用语法以及参数说明

1. 使用语法

用法: date [参数选项] [+格式]

或者:date [-u|–utc|–universal] [MMDDhhmm[[CC]YY][.ss]]

2. 参数说明
参数参数说明
-d,–date=string显示 datestr 中所设定的时间(非系统时间)
-s,–set=string将系统时间设为 datestr 中所设定的时间
-u,–utc,–universal打印或设置协调世界时(UTC)
-version显示版本信息
-help显示帮助信息
3. 时间格式符号
符号符号说明
%n下一行
%t跳格
%H小时(00…23)
%I(大写I)小时(01…12)
%k小时(0…23)
%l(小写l)小时(1…12)
%M分钟(00…59)
%p显示本地 AM 或 PM
%r直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%R24小时制方式显示时间,相当于%H:%M
%s从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S秒(00…60)
%T直接显示时间 (24 小时制)
%X相当于 %H:%M:%S
%z数字方式显示时区
%Z字母缩写方式显示时区
4. 日期格式符号
符号符号说明
%a星期几 ,缩写(Sun…Sat)
%A星期几 ,完整英文星期(Sunday…Saturday)
%b月份 (Jan…Dec)
%B月份 (January…December)
%c直接显示日期与时间
%d日 (01…31)
%D直接显示日期 (mm/dd/yy)
%e一个月中的第几天,类似%_d
%F完整的日期,相当于%Y-%m-%d
%h同 %b
%j一年中的第几天 (001…366)
%m月份 (01…12)
%u一周中的第几天 (1…7) (1是星期一)
%U一年中的第几周 (00…53) (以 Sunday 为一周的第一天的情形)
%w一周中的第几天 (0…6)(0是星期天)
%W一年中的第几周 (00…53) (以 Monday 为一周的第一天的情形)
%x直接显示日期 (mm/dd/yy)
%y年份的最后两位数字 (00.99)
%Y完整年份 (0000…9999)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白居不易.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值