Bootstrap

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

文章篇幅较长,建议先收藏,防止迷路

文章跳转
Linux从入门到精通(八)——Linux磁盘管理go
Linux从入门到精通(九)——Linux编程go
Linux从入门到精通(十)——进程管理go
Linux从入门到精通(十一)——计划任务go
Linux从入门到精通(十二)——shell编程go

计划任务

​ 在很多时候为了自动化管理系统,我们都会用到计划任务,比如关机,管理,备份之类的操作,我们都可以使用计划任务来完成,这样可以是管理员的工作量大大降低,而且可靠度更好。 Linux 系统支持一些能够自动执行任务的服务,我们称为计划任务

什么是计划任务:

配置在指定时间,指定的日期执行预先计划好的任务(例如:备份,广播 )

一、周期性

crond服务需启动

1. crontab 命令

crontab [-选项]
  • -l:列举当前用户计划任务
  • -e:编辑计划任务(vi编辑),不建议
  • -r:删除计划任务
  • -u:指定用户,发布计划任务(只能root来执行)

补充:

并不主张-e编写计划任务,因为e和r键位相近,容易误删。

那么我们如何编写一个计划任务呢?

通常,使用vi直接编写一个计划任务文件,命名“用户名+cron”,编辑好后发布:

crontab [文件名]

2. 计划任务格式:

分		时		日		月		星期	要执行的命令(脚本)
# 范围:
[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中。

*/2 * * * * /usr/bin/date >> /hyy/cronstudy/a.txt

不退出vi,执行命令:

查询date命令所在位置。

:! which date

发布,并查看计划任务列表:

[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文件相关。

  1. 如果/etc/cron.allow文件存在,用户名不在其中,该用户不可以执行计划任务

    如果这个文件不存在,就都可以执行,即没有限制。

  2. 如果/etc/cron.deny,用户名在其中,该用户不可以执行计划任务。

6. 实例

【例1】

每天晚上21:30分,重启apache服务:

# 分 时 天 月 星期 命令
30 21 * * * /usr/sbin/service httpd restart

【例2】
每周一、三、五的下午3:00 重启系统

# 分 时 天 月 星期 命令
00 15 * * 1,3,5 /usr/sbin/shutdwon -r now

【例3】

每小时的10分、40分,将/home/hyy目录下的message文件内容广播给所有用户

# 分 时 天 月 星期 命令
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 命令

at [-选项] time date
> 输入命令
<ctrl+d>结束
  • -f file :at安排的计划任务,均放在文件file中

    file文件里放了多个命令:

    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. 例子

[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定时关机:

at 23:00
> shutdown -S -T 50

【例2】

下午茶时间,定时提醒:

at teatime 
> /usr/bin/wall < rest.txt 

【例3】

自动执行脚本backup.sh

at 1:00AM
> /backup.sh


三、补充:

  1. 启动某个服务:

    service 服务名 start|status|restart|stop
    

    服务一般都存放在/etc/rc.d/init.d/服务名

    我的服务并不在这里,有待探索

    例如:

    service crond status
    # 同样的效果
    /etc/rc.d/init.d/crond status
    
  2. 用户间发送信息:

    write命令:

    write 用户名
    输入信息
    <ctrl+d>结束
    
  3. 广播

    wall命令:

    wall
    输入内容
    <ctrl+d>结合
    

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

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

    wall < /test/test.txt
    
  4. Linux下存在两种时间:

    1. 系统时间

      [root@VM-24-17-centos ~]# date
      Mon Nov 14 16:54:51 CST 2022
      
    2. 硬件时钟

      [root@VM-24-17-centos ~]# hwclock
      2022-11-14 16:57:21.797913+08:00
      

    这两个应该是一致的。

    步骤:

    1. 设置系统时钟时间:

      man date #查看帮助
      
      # date 月日时分年.秒
      date 111417042022.30
      

      或者(二选一)

      设置硬件时钟时间:

      man hwclock
      
      hwclock --set --date="11/14/2022 17:04:30"
      
    2. 同步时间:

      hwclock --hctosys #硬件时钟时间同步到系统
      # 或者
      clock --systohc # 系统时间同步到硬件时钟
      
;