Skip to content

计划任务

循环执行的计划任务

用户的设置

用户想要建立循环型计划任务时,使用的是 crontab 这个命令。

当用户使用 crontab 这个命令来建立计划任务之后,该项任务就会记录到/var/spool/cron中,而且是以帐号来作为判断根据的。
举例来说,dmtsai使用crontab后,它的任务会被记录到/var/spool/cron/dmtsai中。
但请注意,不要使用 vi 直接编辑该文件,因为可能由于输入语法错误,会导致无法执行 cron。
另外,cron 执行的的每一项任务都会被记录到/var/log/cron这个日志文件中,所以,如果你的 Linux 不知道是否被植入木马时,也可以查找一下/var/log/cron这个日志文件。

crontab的语法

1
2
3
4
5
6
crontab [-u username] [-l | -e | -r]
选项与参数:
-u : 只有 root 才能执行这个任务,亦即帮其他使用者建立/删除 crontab 计划任务    
-e : 编辑 crontab 的任务内容     
-l : 查看 crontab 的任务内容
-r : 删除所有的 crontab 的任务内容,若仅要删除一项,请用 -e 去编辑    
1
2
3
4
5
范例一:用 dmtsai 的身份在每天的 12:00 发信给自己   
crontab -e    
此时会进入 vi 的编辑界面让您编辑任务,注意到,每项任务都是一行    
0 12 * * * mail -s "at 12:00" dmtsai < /home/dmtasi/.bashrc
分 时 日 月 周 |命令串|

编辑完毕之后输入:wq并存储后退出 vi 即可。
每项任务(每行)的格式都具有六个字段,这六个字段的意义为

代表意义 分钟 小时 日期 月份 命令
数字范围 0 ~ 59 0 ~ 23 1 ~ 31 1 ~ 12 0 ~ 7 需要执行的命令

比较有趣的是那个,周的数字为 0 或 7 时,都代表星期天的意思。

另外,还有下面这些特殊字符

特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思。举例来说,范例一内那个日、月、周都是*,就代表着“不论何月、何日的星期几的 12:00 都执行后续命令” 的意思
,(逗号) 代表分割时段的意思。举例来说,如果要执行的任务是 3:00 与 6:00 时,就会是: 0 3,6 * * * command 时间参数还是有五栏,不过第二栏是 3、6,代表 3 与 6 都适用
-(减号) 代表一段时间范围内,举例来说,8 点到 12 点之间的每小时的 20 分都执行一项任务:20 8-12 * * 8 comman 仔细看到第二栏变成 8-12,代表8、9、10、11、12都适用的意思
/n(斜线) 那个 n 代表数字,亦即是“每隔 n 单位间隔”的意思,例如每五分钟执行一次,则:*/5 * * * * command很简单吧!用*/5来搭配,也可以写成0-59/5,相同意思

例题
假若你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日 的 23:59 发一封信给她,这封信的内容已经写在/home/dmtsai/lover.txt内了,该如何执行?

答:直接执行 crontab -e 之后,编辑成为:

1
59 23 1 5 * mail kiki < /home/dmtsai/lover.txt

那样的话,每年 kiki 都会收到你的这封信。(当然,信的内容就要每年变一变)

例题:
假如每五分钟需要执行/home/dmtsai/test.sh一次,又该如何?

答:同样使用crontab -e进入编辑:

1
*/5 * * * * /home/dmtsai/test.sh

crontab 每个人都只有一个文件存在,就是在/var/spool/cron里面。
还有建议:“命令执行时,最好使用绝对路径,这样比较不会找不到执行文件”(使用 which cmd 查看命令的绝对路径)

例题
假如你每星期六都与朋友有约,那么想要每个星期五下午

切换编辑器

1
2
3
4
5
6
7
8
9
(base) ➜  ~ select-editor

Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]: 2

设置环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
$ which rm
/bin/rm
$ which git
/usr/local/bin/git
$ which chromedriver
/usr/local/chromedriver/chromedriver
$ which ssh
/usr/bin/ssh


$ crontab -l
SHELL=/bin/zsh
PATH="/bin:/usr/bin:/usr/local/bin:/usr/local/chromedriver:$PATH"
09 15 * * * /Users/nocilantro/anaconda3/bin/dreport -at -d 20210201 2> /Users/nocilantro/work_dirs/send_email/daily-report/log.log 1>&2