侧边栏壁纸
博主头像
liveJQ博主等级

沒有乐趣,何来开始

  • 累计撰写 149 篇文章
  • 累计创建 62 个标签
  • 累计收到 2 条评论

Linux定时任务

liveJQ
2020-07-26 / 0 评论 / 0 点赞 / 686 阅读 / 1,671 字 / 正在检测是否收录...
广告 广告

前言

定时任务对于运维人员来说已是家常便饭;对于个人使用来说,随便写个小脚本(ddns/scrapy/auto-signin/...)也不得不用到它。我想很多人都用过 Windows 的定时任务吧,不过我猜使用的频率不大,而且作用效果也有限,普遍也就会定时开关机或者定时开关程序,也就这样了。但是,Linux却可以通过Shell无所不能,而定时任务恰恰就结合了Shell,结果可想而知。

Linux能够通过定时任务自动化很多东西,下面以Ubuntu 18.04为例。

任务调度

图中的两个路径是设置定时任务时最常见的两个文件,虽然它们的作用范围不同,但是任务调度规则是一样的。系统级的文件只有root用户才能编辑。文件里面每一行都由这些颜色块组成,用来表示一个定时任务。从图中可以看出最小时间单位是分钟,由规定的数值范围可知,任务运行的最小时间间隔为1分钟。因此,cron进程服务会每隔1分钟检查一次所有的任务调度表,看是否有任务需要执行。

系统任务与用户任务

20200726_crontab.png

注意:星期几中1~6的自然数表示星期一到星期六,0和7都表示星期日

  • 星号【*】:表示任何数值,即没有限制之意。如果这五个定时位置都为星号,则每分钟检查时都会执行。

  • 逗号【,】:可以分隔数值形成一个集合。

  • 连字符【-】:表示一个数值范围。

  • 正斜杠【/】:表示间隔频率。

示例(用户级)

* 6 * * * run-parts /livejq/all-scripts #表示每天早上6点执行all-scripts目录下的所有文件(run-parts后跟目录路径)
* * */2 * * bash /livejq/test.sh #表示每隔2天执行
* 6-12/2 * * * bash /livejq/test.sh #表示每天早上在6点到12点这个时间段中每隔2小时执行
30 18 * 3,6,9 1-5 bash /livejq/test.sh #表示在每年的3月份,6月份和9月份当中,星期一到五的下午6点半都要执行

注意:定时任务需要根据系统当前时间和时区来设置

除了上面两个常用的设置定时任务的文件外,cron进程还通过读取其它目录下的文件来执行定时任务,如:

20200726_etc_cron.png

根据目录名可以知道,每个目录有其规定的执行频率,每小时/每天/每周/每个月。cron.d目录下的文件跟crontab文件的作用效果是一样的,要说区别的话可能是cron.d目录下对定时任务进行了分类,每个文件里的定时任务都有其针对的地方。

crontab命令

由于用户级的定时任务最为常用,cron提供了一个方便设置用户定时任务的crontab命令。也正因如此,普通用户无法直接通过编辑/var/spool/cron/crontabs/用户名文件来查看/设置定时任务(除了root)。

#默认编辑当前用户的定时任务文件(不存在则自动创建)
crontab -e
#查看
crontab -l
#删除
crontab -r
#若想使用某个存在的定时任务的文件,则直接载入即可(如:恢复备份文件)
crontab /path/file
#若要操作其它用户的定时任务文件,则要root权限
sudo crontab -u other -e

注意事项

  1. crontab命令中的e(编辑)和r(删除)很接近,容易误删,重要/大份的定时任务文件最好备份。
  2. 定时任务中需要执行的文件应首先确保在对应的执行用户上有执行的权限。
  3. 修改后的定时任务无需重启cron服务即可生效。
  4. 定时任务中涉及到的文件需要用绝对路径。
  5. 执行的命令必须存在于环境变量当中,例如:上图中的python命令,若无python环境,则肯定无法执行。
  6. 定时任务中的某些日志输出可能十分庞大,此时可以通过在后面加上> /dev/null 2>&1。(2是标准错误输出,1是标准输出,2>&1即将标准错误输出到标准输出上来,而标准输出又转到了null,即忽略输出,不加&号则使1变成文件名了。)
  7. 某些系统级任务(定时重启)只能在/etc/crontab等类似的文件中进行设置,crontab -u root -e也是无效的。

参考资料

  1. 每天一个linux命令(50):crontab命令
0

评论区