Linux从入门到精通(十一)——计划任务

2023-04-16 15:38:37 浏览数 (1)

计划任务

​ 在很多时候为了自动化管理系统,我们都会用到计划任务,比如关机,管理,备份之类的操作,我们都可以使用计划任务来完成,这样可以是管理员的工作量大大降低,而且可靠度更好。 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代表周日)

注意:

  1. 每个域都不可以空,必须写入,不设置使用*
  2. 每个域可以使用多个值,不连续的使用,进行分割,连续的使用-
  3. 命令要给出绝对路径。
  4. 用户必须具备对用的权限。
  5. 特殊形式*/n:n是一个数字,代表每多久。

3. 例子

【例1】

每隔2分钟,将当前日期写入/hyy/cronstudy/a.txt中。

代码语言:javascript复制
*/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目录,寻找系统中存在的用户设定的计划任务,并载入内存运行:

代码语言:javascript复制
[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文件相关。

  1. 如果/etc/cron.allow文件存在,用户名不在其中,该用户不可以执行计划任务 如果这个文件不存在,就都可以执行,即没有限制。
  2. 如果/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指令

代码语言:javascript复制
# 分 时 天 月 星期 命令
1 *  * * * /bin/accont

【例5】

每年的3月和6月,2号到8号的7点20分和7点50分执行/bin/date命令,并将结果添加到/test/backlog.txt文件内容后。

代码语言:javascript复制
# 分 时 天 月 星期 命令
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格式比较灵活

  1. hh:mm :几时几分;
  2. midnight:深夜; noon:中午 teatime:下午
  3. 12小时制:AM PM
  4. 日期:mm/dd/yy(月日年)
  5. now n minutes(hours,days) 现在的时间,过几分钟(小时,天)

下午3点:

  1. at 15:00
  2. at 3.00PM
  3. at 15:00 today
  4. 现在是下午2.: at now 1 hours at now 60 minutes
  5. 指定某个日期的下午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文件相关。

  1. 如果/etc/at.allow文件存在,用户名不在其中,该用户不可以执行计划任务 如果这个文件不存在,就都可以执行,即没有限制。
  2. 如果/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

代码语言:javascript复制
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>结合

也可以通过重定向符号,将文件中的内容广播或者发送出去:

以前学的重定向符号:> >>,这里使用个新的:<

代码语言:javascript复制
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 # 系统时间同步到硬件时钟

0 人点赞