cron的官网手册:
https://docs.oracle.com/cd/E26926_01/html/E29115/cron-1m.html#REFMAN1Mcron-1m
crontab的官网手册:
https://docs.oracle.com/cd/E26926_01/html/E29113/crontab-1.html#scrolltoc
You can specify regularly scheduled commands to cron according to instructions found in crontab files in the directory /var/spool/cron/crontabs.
crontab命令通过写/var/spool/cron/crontabs/目录下的通过用户名命名的文件,来告诉系统什么时间执行哪些命令。
注:如果没有文件,说明该用户没有定时任务。这就是问什么执行 crontab -l 提示
- crontab介绍(重要,必读)
本脚本的执行使用了Unix/Linux的定时任务crontab来执行,测试人员务必熟悉crontab的使用。
crontab是操作系统为每个用户所创建的一个定时任务表,在这个定时任务表中的任务会按照用户指定的时间段去执行。本文的脚本使用omcrftp用户(非mr文件清理)或者mrftp用户(mr文件清理)执行,所以在查看、编辑以及修改crontab时,都需要使用omcrftp或者mrftp用户,而不是root或者其他用户。
使用 crontab –l 命令可以查看当前用户的定时任务表,比如如下:
30 0 * * * /export/home/omcrftp/move_cdl_file.sh
每一行前边如果以“#”开始,表示为注释行。每一行的输出有6列,本脚本只使用了第一、第二和第六列,其他列的作用暂时不用管。
第一列和第二列分别表示执行开始时间的分钟、小时,第六列是需要执行的命令行。比如上边的输出就是表示每天0点30分执行/export/home/omcrftp/move_cdl_file.sh脚本。
可以使用参数进行定时任务表的在线修改,但这里不建议这样修改,建议使用先将任务表内容输出到文件,然后修改文件在进行加载的方式进行修改任务表。
crontab –l > mytask
这样就会把定时任务的内容输出到mytask文件中,然后使用vi编辑,如果不会使用vi,则可以将该文件传出来,使用ue编辑器修改,切记必须使用unix格式,勿转换为Dos格式,修改完成后的文件我们假设命名为mytasknew,然后使用crontab重新加载这个文件即可,命令如下:
crontab mytasknew
/usr/bin/crontab -e 打开编辑器,可以在线编辑该用户的crontab内容。
我记得crontab 命令最初可以直接跟时间和命令,如:
crontab */1 * * * * service httpd restart
但是现在好像这种用法被废弃了,所有网上资料的介绍都是先创建一个文本文件,在文本文件里编辑好时间格式和要执行的命令。最后再执行:
crontab filename
时间的格式可以参考linux的说明:
https://blog.csdn.net/qq_32923745/article/details/78286385
至此可以实践一下。先看一下高手写的crontab文件,简单明了,前5个值是时间,分、时、日、月、周,后面的路径和文件是可执行的命令或sh脚本。如果脚本还有参数,可以加空格写上参数,如第3、4行。
30 0 * * * /export/home/omcrftp/cdlscript/move_cdl_task/move_cdl_file.sh
select_userjob.sh脚本内容:
#!/bin/sh
sqlplus /nolog << EOF
spool select.txt
conn omcr/lte;
@select_job.sql
spool off
exit
EOF
select_job.sql脚本内容:
Select job, last_date, last_sec, next_date, next_sec from user_jobs where what like '%cp_all_north()%';
Select job, total_time, broken, failures from user_jobs where what like '%cp_all_north()%';
使用crontab定时执行脚本时别忘了输出重定向>
如果crontab不重定向输出,并且crontab所执行的命令有输出内容的话,是一件非常危险的事情。因为该输出内容会以邮件的形式发送给用户,内容存储在邮件文件
/var/mail/root
(上述为solaris系统的路径)
如果命令执行比较频繁(如每分钟一次),或者命令输出内容较多,会使这个邮件文件不断追加内容,文件越来越大。而邮件文件一般存放在根分区,根分区一般相对较小,所以会造成根分区写满而无法登录服务器。
所以在添加crontab命令时,无论命令是否有输出,最好都加上输出重定向到文件或者/dev/null中。如下
*/5 * * * * /root/XXXX.sh &>/dev/null 2>&1
/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么>/dev/null 2>&1的意思就是:
标准输出重定向到空设备文件,也就是不输出任何信息到终端,标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。