定时任务

#! /bin/bash

linux shell脚本中的开头 #! /bin/bash的含义

很多时候不规范的写法可以忽略掉这一句,执行起来好像也是ok,结果没什么不一样 。这只是因为在我们常用 的linux系统上默认都是执行/bin/bash来执行我们的shell脚本,但是如果有些用户使用的是csh,那么缺少第一行的“#!/bin/bash的shell脚本执行结果就可能存在语法不兼容的问题,导致结果异常或者根本不能执行。

Shell脚本和我们常用的C语言或者C++语言编写编译出来的bin执行当不一样,shell是一种解释性语言,他需要专门的解析器来解析然后执行,不同的脚本语言需要匹配对应的解析器才能解析执行,比如python也是一中解释性编程语言,需要对应的ptthon解释器来解析执行。

我们linux上的shell 是bash shell,所以我们在编写一个脚本的时候需要在第一行添加”#!/bin/bash“. 这句话的意思是告诉执行器需要调用/bin/bash来执行我。

这也是在shell中唯一以#号开头却不代表是注释的意思,其他任何地方以#号开头的语句都会被认为是注释语句而忽略执行,所以这句话只能写在 shell的开头才有效。

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

#this is a test shell

pwd

#this is a comment

who

#show date
date

参考链接:https://www.cnblogs.com/tid-think/p/10961490.html

linux命令 执行和停止一个定时任务

定时任务编写

顺序 日期 月份 星期 年(可选)
取值 0-59 0-23 1-30(31) 1-12 1-7
允许特殊字符 , - * / , - * / , - * / ? L W C , - * / , - * / L # C 1970-2099 , - * /

*:代表所有可能的值
-:指定范围
,:列出枚举 例如在分钟里,"5,15"表示5分钟和20分钟触发
/:指定增量 例如在分钟里,"3/15"表示从3分钟开始,没隔15分钟执行一次
?:表示没有具体的值,使用?要注意冲突
L:表示last,例如星期中表示7或SAT,月份中表示最后一天31或30,6L表示这个月倒数第6天,FRIL表示这个月的最后一个星期五
W:只能用在月份中,表示最接近指定天的工作日

#:只能用在星期中,表示这个月的第几个周几,例如6#3表示这个月的第3个周五

1
2
3
4
5
6
7
8
9
10
11
12
13
14
第一个“*”  一小时当中的第几分钟  0-59
第二个“*” 一天当中的第几小时 0-23
第三个“*” 一个月当中的第几天 1-31
第五个“*”一周当中的星期几 0-7(0和7都代表星期日)

例如:
45 22 * * * 命令 在22点45分执行命令
0 17 * * 1 命令 每周1 的17点0分执行命令
0 5 1,15 * * 命令 每月1号和15号的凌晨5点0分执行命令
40 4 * * 1-5 命令 每周一到周五的凌晨4点40分执行命令
*/10 4 * * * 命令 每天的凌晨4点,每隔10分钟执行一次命令
0 0 1,15 * 1 命令 每月1号和15号,每周1的0点0分都会执行命令

注意:星期几和 几号最好不要同时出现,因为他们定义的都是天。非常容易让管理员混乱。

https://blog.csdn.net/qq_41283044/article/details/90701074

实操

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
sudo crontab -e   //编写任务

^G 求助 ^O 写入 ^W 搜索 ^K 剪切文字 ^J 对齐 ^C 游标位置
^X 离开 ^R 读档 ^\ 替换 ^U 还原剪切 ^T 拼写检查 ^_ 跳行

例如:离开——ctrl+X
————————
*/1 * * * * /bin/sh /home/XXX/note/test.sh >> /home/XXX/note/test.log
每分钟执行一次,将/home/XXX/note/test.sh的执行结果追加入/home/XXX/note/test.log
————————
ctrl+x ,回车 // 保存,退出
sudo service cron restart 重启任务——成功

sudo crontab -e//编辑任务
sudo crontab -l //查询crontab任务
sudo crontab -r //删除当前用户所有的crontab任务
格式:
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]

参数说明:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

原文链接:https://blog.csdn.net/ren593669257/article/details/95455245

命令也能这么写,比如

1
2
3
*/1 * * * * /bin/bash /etc/init.d/test.sh  此命令每分钟执行一次test.sh脚本

1 * * * * cd /etc/init.d && ./test.sh >> /home/loganalysis/error.log 2>&1 此命令执行shell脚本文件,并记录日志

其他

cron运行日志

1
2
3
4
5
6
7
8
9
10
11
12
cron运行日志在/var/log/cron.log,ubuntu默认没有开启cron日志,所以当Ubuntu服务器/var/log下没有cron日志,如何使用ubuntu server查看crontab记录日志
//修改rsyslog
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的注释符去掉
//重启rsyslog
sudo service rsyslog restart
sudo service cron restart
//查看crontab日志
tail -f /var/log/cron.log

不需要保留执行的输出,则重定向到null中:>/dev/null 2>&1(忽略日志输出)
例如 * * * * * cd /home/wang && ./temp.sh >/dev/null 2>&1

原文链接:

https://blog.csdn.net/xiaoguo1001/article/details/80512906
https://blog.csdn.net/weixin_43946245/article/details/103184208

如果只是简单的任务,可以不用写脚本,直接在crontab中加入任务即可,对于比较复杂的任务,需要写脚本(shell编程)

定时任务 调用接口

1
2
0 */1 * * * php /dat0/web/dev02/yii send/expire
调用Yii2.0框架send控制器下的expire接口