计划任务
在很多时候为了自动化管理系统,我们都会用到计划任务,比如关机,管理,备份之类的操作,我们都可以使用计划任务来完成,这样可以是管理员的工作量大大降低,而且可靠度更好。 Linux 系统支持一些能够自动执行任务的服务,我们称为计划任务。
什么是计划任务: 配置在指定时间,指定的日期执行预先计划好的任务(例如:备份,广播 )
一、周期性
crond服务需启动
1. crontab 命令
代码语言:javascript复制crontab [-选项]
- -l:列举当前用户计划任务
- -e:编辑计划任务(vi编辑),不建议
- -r:删除计划任务
- -u:指定用户,发布计划任务(只能root来执行)
补充: 并不主张
-e
编写计划任务,因为e和r键位相近,容易误删。
那么我们如何编写一个计划任务呢?
通常,使用vi直接编写一个计划任务文件,命名“用户名 cron”,编辑好后发布:
代码语言:javascript复制crontab [文件名]
2. 计划任务格式:
代码语言:javascript复制分 时 日 月 星期 要执行的命令(脚本)
# 范围:
[0-59] [0-23] [1-31] [1-12] [0-6](0代表周日)
注意:
- 每个域都不可以空,必须写入,不设置使用
*
- 每个域可以使用多个值,不连续的使用
,
进行分割,连续的使用-
。 - 命令要给出绝对路径。
- 用户必须具备对用的权限。
- 特殊形式
*/n
:n是一个数字,代表每多久。
3. 例子
【例1】
每隔2分钟,将当前日期写入/hyy/cronstudy/a.txt
中。
*/2 * * * * /usr/bin/date >> /hyy/cronstudy/a.txt
不退出vi,执行命令:
查询date命令所在位置。
代码语言:javascript复制:! which date
发布,并查看计划任务列表:
代码语言:javascript复制[root@hyy cronstudy]# crontab rootcron
[root@hyy cronstudy]# crontab -l
*/2 * * * * /usr/bin/date >> /hyy/cronstudy/a.txt
4. 运行原理:
corn命令运行时,会搜索/var/spool/cron
目录,寻找系统中存在的用户设定的计划任务,并载入内存运行:
[root@hyy cronstudy]# cd /var/spool/cron/
[root@hyy cron]# ll
total 4
-rw-------. 1 root root 50 Nov 12 01:34 root
[root@hyy cron]# cat root
*/2 * * * * /usr/bin/date >> /hyy/cronstudy/a.txt
crontab 发布计划任务后,就会在该目录下产生一个用户同名文件。
5. 计划任务权限
用户是否可以使用crontab
命令计划任务,和/etc/cron.allow
文件以及/etc/cron.deny
文件相关。
- 如果
/etc/cron.allow
文件存在,用户名不在其中,该用户不可以执行计划任务 如果这个文件不存在,就都可以执行,即没有限制。 - 如果
/etc/cron.deny
,用户名在其中,该用户不可以执行计划任务。
6. 实例
【例1】
每天晚上21:30分,重启apache服务:
代码语言:javascript复制# 分 时 天 月 星期 命令
30 21 * * * /usr/sbin/service httpd restart
【例2】 每周一、三、五的下午3:00 重启系统
代码语言:javascript复制# 分 时 天 月 星期 命令
00 15 * * 1,3,5 /usr/sbin/shutdwon -r now
【例3】
每小时的10分、40分,将/home/hyy目录下的message文件内容广播给所有用户
代码语言:javascript复制# 分 时 天 月 星期 命令
10,40 * * * * /usr/bin/wall < /home/hyy/message
【例4】
每小时的1分执行/bin/account
指令
# 分 时 天 月 星期 命令
1 * * * * /bin/accont
【例5】
每年的3月和6月,2号到8号的7点20分和7点50分执行/bin/date
命令,并将结果添加到/test/backlog.txt
文件内容后。
# 分 时 天 月 星期 命令
20,50 7 2-8 3,6 * /bin/date >> /test/backlog.txt
二、一次性
atd服务需启动
1. at 命令
代码语言:javascript复制at [-选项] time date
> 输入命令
<ctrl d>结束
-f file :at安排的计划任务,均放在文件file中
file文件里放了多个命令:
代码语言:javascript复制at -f file time date
-l:查看安排的作业,等同于atq
-d:删除指定的执行命令序列,等同于atrm
time date格式
time date
格式比较灵活
-
hh:mm
:几时几分; - midnight:深夜; noon:中午 teatime:下午
- 12小时制:AM PM
- 日期:mm/dd/yy(月日年)
- now n minutes(hours,days) 现在的时间,过几分钟(小时,天)
下午3点:
- at 15:00
- at 3.00PM
- at 15:00 today
- 现在是下午2.: at now 1 hours at now 60 minutes
- 指定某个日期的下午3点: 2022年11月17号:at 15:00 11/17/2022 2022年11月17号:at 15:00 17.11.2022
2. 例子
代码语言:javascript复制[root@hyy ~]# at 12:00
at> echo "hello"
at> find / -name "a?c*" -exec rm -f {} ;
at> <EOT>
job 1 at Sat Nov 12 12:00:00 2022
[root@hyy ~]# at 21:00
at> echo "bye"
at> <EOT>
job 2 at Sat Nov 12 21:00:00 2022
[root@hyy ~]# atq # 或者 at -l
1 Sat Nov 12 12:00:00 2022 a root
2 Sat Nov 12 21:00:00 2022 a root
[root@hyy ~]# atrm 2 # 或者 at -d 2
[root@hyy ~]# atq
1 Sat Nov 12 12:00:00 2022 a root
3. at 执行权限
用户是否可以使用at
命令计划任务,和/etc/at.allow
文件以及/etc/at.deny
文件相关。
- 如果
/etc/at.allow
文件存在,用户名不在其中,该用户不可以执行计划任务 如果这个文件不存在,就都可以执行,即没有限制。 - 如果
/etc/at.deny
,用户名在其中,该用户不可以执行计划任务。
4. 实例:
【例1】
23:00定时关机:
代码语言:javascript复制at 23:00
> shutdown -S -T 50
【例2】
下午茶时间,定时提醒:
代码语言:javascript复制at teatime
> /usr/bin/wall < rest.txt
【例3】
自动执行脚本backup.sh
:
at 1:00AM
> /backup.sh
三、补充:
启动某个服务:
代码语言:javascript复制service 服务名 start|status|restart|stop
服务一般都存放在/etc/rc.d/init.d/服务名
我的服务并不在这里,有待探索
例如:
代码语言:javascript复制service crond status
# 同样的效果
/etc/rc.d/init.d/crond status
用户间发送信息:
write命令:
代码语言:javascript复制write 用户名
输入信息
<ctrl d>结束
广播
wall命令:
代码语言:javascript复制wall
输入内容
<ctrl d>结合
也可以通过重定向符号,将文件中的内容广播或者发送出去:
以前学的重定向符号:> >>
,这里使用个新的:<
wall < /test/test.txt
Linux下存在两种时间:
系统时间
代码语言:javascript复制[root@VM-24-17-centos ~]# date
Mon Nov 14 16:54:51 CST 2022
硬件时钟
代码语言:javascript复制[root@VM-24-17-centos ~]# hwclock
2022-11-14 16:57:21.797913 08:00
这两个应该是一致的。
步骤:
设置系统时钟时间:
代码语言:javascript复制man date #查看帮助
代码语言:javascript复制# date 月日时分年.秒
date 111417042022.30
或者(二选一)
设置硬件时钟时间:
代码语言:javascript复制man hwclock
代码语言:javascript复制hwclock --set --date="11/14/2022 17:04:30"
同步时间:
代码语言:javascript复制hwclock --hctosys #硬件时钟时间同步到系统
# 或者
clock --systohc # 系统时间同步到硬件时钟