第一章 shell脚本定时执行之crontab的使用
随手记录自己遇到的Linux知识与技巧,方便日常回顾。
我们经常使用的是crontab命令是cron table的简写,它是cron的配置文件,也可以叫它作业列表,我们可以在以下文件夹内找到相关配置文件。
/etc/crontab
(文件) 只有root用户能编辑,一般不会改动,默认每天,每周,每月,去执行/etc/cron.daily
,/etc/cron.hourly
,/etc/cron.monthly
下的所有可执行文件。/etc/cron.d
(目录) 只有root用户能编辑,当一个项目有自己的定时脚本时,将编辑好的cron文件放入这个目录下即可生效。var/spool/cron
(目录) 使用crontab -e 编辑就是这个目录下的cron文件,文件名是用户名,所有用户都能在这个目录下编辑自己的cron文件。/etc/cron.d下的cron文件和/var/spool/cron下的cron文件在格式上有略微的区别,/etc/cron.d下的cron文件在命令前需要指定执行命令的用户,而/var/spool/cron下的cron文件则不需要。
/etc/cron.d: 30 03 */1 * * root /bin/sh /home/start.sh
/var/spool/cron: 30 03 */1 * * /bin/sh /home/start.sh
常用命令:
crontab [-u username] [-l|-e|-r]
选项与参数:
-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑
crontab -ir : 删除 crontab 文件前提醒用户
通常,我们用crontab -e进入当前用户的工作表编辑定时任务,编辑完保存退出。
注意:用crontab -e 编辑的定时任务三分钟之内是不会执行的,所以在测试的时候,至少时间后推三分钟
crontab的命令构成为 时间+动作,其时间有分、时、日、月、周五种,操作符有:
"*" 取值范围内的所有数字、"/" 每过多少个数字、"-" 从X 到 Z,从0到10、","数组或者是枚举
实例:
实例1:每1分钟执行一次myCommand
* * * * * myCommand
实例2:每小时的第3和第15分钟执行
3,15 * * * * myCommand
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * myCommand
实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * myCommand
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 myCommand
实例6:每月1、10、22日的4 : 45重启smb
45 4 1,10,22 * * /etc/init.d/smb restart
实例7:每周六、周日的1 : 10重启smb
10 1 * * 6,0 /etc/init.d/smb restart
实例8:每一小时重启smb
0 */1 * * * /etc/init.d/smb restart
实例9:晚上11点到早上7点之间,每隔一小时重启smb
0 23-7/1 * * * /etc/init.d/smb restart
当执行完第二步的操作之后,命令框会提示 installing new crontab
,即创建了新的定时任务,没有出现或者出现其他提示则说明定时任务没有添加成功。
添加完之后,我们还可以通过crontab -l
这条指令来查看我们当前服务器上的定时任务列表有没有我们刚刚配置好的定时任务。
/etc/cron.allow
:将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab;
/etc/cron.deny
:将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab
以优先顺序来说, /etc/cron.allow
比 /etc/cron.deny
要优先, 而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在配置上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你可以将不想让他运行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个帐号一行!
通常我们在配置crontab任务的时候,会出现各种错误,比如最常见的一种错误:
配置一个每隔 5分钟就刷新data目录下的文件,定时任务这样配置:5/* * * * * cd /data/ && ls
会报如下错误:
"/tmp/crontab.sdXvj4":5: bad minute
errors in crontab file, can't install.
Do you want to retry the same edit?
出现这样的情况就是我们的语法错误,每隔5分钟写法错了,正确的应该是*/5 * * * * cd /data/ && ls
由于用户要编辑定时任务(执行crontab -e),系统会在/tmp目录下创建一个临时文件.
例如上面的crontab.sdXvj4。当我们的语法有问题时,我们需要重新返回编辑这个文件,然后保存退出,直到生成正确的定时任务。
我们在配置定时任务时,希望看到定时任务的执行信息或者说任务执行失败的信息,怎么做?
这时,我们可以让定时任务执行的结果输出到某个文本内,即输出重定向。
1: 表示标准输出(stdout),默认输出到屏幕
2:表示标准错误输出(stderr),默认输出到屏幕
在平时我们经常使用如下方法将脚本执行结果重定向:
bash test.sh >test.out
//脚本的标准输出写入到文件test.out ,标准错误输出直接打印在屏幕 等价于:bash test.sh 1>test.out
bash test.sh >test.out 2>&1
//标准输出和标准错误输出都写入到test.out并且不会互相覆盖,等价于bash test.sh &>test.out
bash test.sh >test.out 2>test.out
//标准输出和标准错误输出都写入到test.out,会出现互相覆盖的问题,正常情况不推荐这样使用
bash test.sh &>test.out
//等价于第二种方法
比较一下以上几种的效果:
第一种:错误输出在屏幕,正常输出在文件test.out
root@mengalong:~/opdir/mengalong/t/t# cat test.sh
#!/bin/bash
t
date
root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out
test.sh: line 2: t: command not found
root@mengalong:~/opdir/mengalong/t/t# cat test.out
Wed Oct 31 11:07:24 CST 2018
第二种:错误输出和正常输出均重定向到文件test.out中
root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>&1
root@mengalong:~/opdir/mengalong/t/t# cat test.out
test.sh: line 2: t: command not found
Wed Oct 31 11:09:02 CST 2018
第三种:错误输出和正常输出互相覆盖
root@mengalong:~/opdir/mengalong/t/t# bash test.sh >test.out 2>test.out
root@mengalong:~/opdir/mengalong/t/t# cat test.out
Wed Oct 31 11:10:36 CST 2018
ot found
第四种,特殊情况,比较一下bash test.sh 2>&1 >test.out 和 bash test.sh >test.out 2>&1 的区别:
root@mengalong:~/opdir/mengalong/t/t# bash test.sh 2>&1 >test.out
test.sh: line 2: t: command not found
root@mengalong:~/opdir/mengalong/t/t# cat test.out
Wed Oct 31 11:12:13 CST 2018
这里只是把 2>&1 放在了 >test.out 前边,但是结果却不是像我们想象的那样,错误和正常输出都进入test.out 文件。这是因为, bash test.sh 2>&1 >test.out 这个命令中, 2>&1 的时候,只是把错误输出重定向到了标准输出,而此时标准输出的默认值是屏幕,因此实际等价于标准错误输出被重定向到了屏幕,而非文件。因此重定向需要注意顺序。
再看一下这个例子:
01 09 * * * cd /opdir/test/ && ./test.sh &>>test.log
按照上边的概念分析,这种写法应该等价于./test.sh >test.log 2>&1 ,脚本执行的输出和标准错误输出全部重定向到 test.log。但是实际情况却是test.log文件中并没有任何内容。
这是因为 crontab 默认使用的shell环境为 /bin/sh, 而/bin/sh 并不支持
&>>test.log 这种重定向方法,因此我们看到的效果是test.log 中没有内容。
因此解决问题的方法就是将crontab的重定向方法进行修改:
01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1
友情提示:
crontab执行过程中,如果脚本输出没有重定向,那么会默认给系统用户发邮件,邮件内容一般存储在 /var/mail/$user 中,如果不清理就会打满服务器根分区,最终导致机器无法登陆。因此推荐的crontab命令写法如下:
01 09 * * * cd /opdir/test/ && ./test.sh >>test.log 2>&1
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。