Linux 计划任务

2022-08-06 14:30:39 浏览数 (1)

Linux 中有时会遇到需要定时自动执行任务的情况,本文记录Linux 计划任务相关命令。

计划任务

  • 计划任务指的是需要定时自动执行或周期执行的工作任务
  • linux系统中,可以通过cron和at两种命令实现计划任务

at 单次计划任务

指的是定时执行一次的计划任务,可以使用 at 命令完成

安装
代码语言:javascript复制
# ubuntu
apt install at
#CentOS
yum install at -y

开机启动
代码语言:javascript复制
# 重启 at
systemctl restart atd 
# 设置开机自启 at
systemctl enable atd 

命令格式
  • 创建任务
代码语言:javascript复制
at   时间
  • 查看计划任务
代码语言:javascript复制
at -l
atq

  • 查看任务内容
代码语言:javascript复制
at -c <job-id>

  • 删除计划任务
代码语言:javascript复制
atrm  <job-id>

  • 保存任务(按键)
代码语言:javascript复制
ctrl D

  • 执行方式为交互式
  • at 队列存放在/var/spool/at目录中
  • 通过/etc/at.{allow,deny}控制用户是否能执行at任务(白名单优先) 先寻找/etc/at.allow 文件,文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在at.deny 当中) 如果/etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者则可使用 at 命令。如果两个文件都不存在,只有 root 可以使用 at 这个命令。(相当于一个空的/etc/at.allow文件)

cron 周期性任务计划

命令用法

命令选项

含义

-e

编辑计划任务 edit

-l

查看计划任务 display

-u

指定用户 user

-r

删除计划任务 remove

命令示例
配置生效
  • 配置完计划任务后需要重启 cron 服务来使得改动生效
代码语言:javascript复制
*  *  *  *  *  user-name command

  • 最小执行时间为每分钟
  • 例如执行定期备份数据的脚本:
代码语言:javascript复制
0 1 * * * root cd /etc/data_rsync && /usr/local/Anaconda3/bin/python rsync.py 

表示 root 用户每天凌晨 1:00 进入到 /etc/data_rsync 文件夹执行 python 脚本

命令示例
  • 指定用户 vvd 创建 crontab
代码语言:javascript复制
crontab -e -u vvd

  • 查看 crontab
代码语言:javascript复制
crontab -lu vvd

  • 查看用户vvd的 crontab 文件
代码语言:javascript复制
crontab -eu vvd

  • 删除用户计划任务
代码语言:javascript复制
crontab -ru vvd

-r 删除crontab,会删除整个文件,删除所有任务

配置生效
  • 配置完计划任务后需要重启 cron 服务来使得改动生效
代码语言:javascript复制
systemctl restart cron.service

查看日志
  • 默认情况下可以在 /var/log/syslog 中看到 crontab 日志
代码语言:javascript复制
sudo grep CRON /var/log/syslog

计划任务示例

示例任务

含义

45 4 1,10,22 * * /usr/bin/systemctl restart network

每月1、10、22日的 4:45 重启network服务

10 1 * * 6,7 /usr/bin/systemctl restart network

每周六、周日的1:10重启network服务

*/30 18-23 * * * /usr/bin/systemctl restart network

每天18:00至23:00之间每隔30分钟重启network服务

3,15 8-11 */2 * * /usr/sbin/reboot

每隔两天的上午8点到11点的第3和第15分钟执行一次重启

30 2 * * 7 /usr/bin/cp /etc/fstab /tmp/fstab-date “ %F_%T”

每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为/backup/fstab-YYYY-MM-DD-hh-mm-ss

0 4 1 1 * /usr/bin/systemctl restart smb

一月一号的4点重启smb

0 23-0/1,1-7/1 * * * /usr/bin/systemctl restart smb 0 23,0,1,2,3,4,5,6,7 * * * /usr/bin/systemctl restart smb

晚上11点到早上7点之间,每隔一小时重启smb

0 * * * * /usr/bin/systemctl restart smb

每一小时重启smb

示例

  • 以定时更新 git 仓库为例
  • 编写脚本:
代码语言:javascript复制
#!/bin/sh
echo "Start to update repository"
cd path-to-your-repository
git pull
git add -A
git commit -m add-new-data
git push

  • 测试脚本:
  • 配置 conrtab:
代码语言:javascript复制
crontab -e

# 每 2 分钟更新一次仓库
 */2  *  *   *   * /home/vvd/update.sh

  • 重启计划任务服务:
代码语言:javascript复制
sudo systemctl restart cron.service

  • 确认效果:
  • 确实每2分钟更新过一次
  • 查看日志
代码语言:javascript复制
sudo grep CRON /var/log/syslog
  • crontab 正常运作

参考资料

  • https://www.cnblogs.com/du-z/p/10858967.html
  • http://www.178linux.com/44790
  • https://blog.csdn.net/qq_36324958/article/details/122060867
  • https://blog.csdn.net/csdn_yasin/article/details/70332796?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-1-70332796-blog-94103212.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~default-1-70332796-blog-94103212.pc_relevant_default&utm_relevant_index=2
  • https://askubuntu.com/questions/56683/where-is-the-cron-crontab-log

0 人点赞