脚本

公司开始要打卡考勤,但我们组的同事上下班总是忘记打卡签到,于是,灵机一动,写个脚本,到点了在钉钉群内推送消息,提醒大家打卡。

于是,下面这段shell脚本就出现了。代码思路就是根据时间段生成不一样的提醒内容,提醒的同时也让娱乐一下,然后调用钉钉的开放API,推送给内容到钉钉群内。

dakatips.sh

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
34
35
36
37
38
39
40
41
42
43
44
45
46

#!/bin/bash

systemTime=$(date "+%Y-%m-%d %H:%M:%S")
value=$(date +%T |awk -F: '{print $1}')

if [ $value -ge 19 ] && [ $value -le 23 ]; then
content="我就是我, 是不一样的烟火。现在是 $systemTime ,该回家休息了,刷个笑脸,隐去疲惫,给家人一份安心。"
#凌晨
elif [ $value -ge 00 ] && [ $value -le 05 ];then
content="我就是我, 是不一样的烟火。现在是 $systemTime ,凌晨的风打在疲惫的脸上,辛酸的滋味涌上心头,尽管生活如此艰辛,但我们依然用微笑面对,无论是上班还是下班,别忘记留下你坚毅的眼神。"
#早上
elif [ $value -ge 05 ] && [ $value -le 08 ];then
content="我就是我, 是不一样的烟火。现在是 $systemTime ,南方的夏天,聒噪闷热,楼下的老大爷开始晨练,市井的小摊贩开始走动,睡眼惺忪的你,是否已经在上班的途中,此刻,送上我诚挚的慰问:早上好,陌生人!"
#上午
elif [ $value -ge 08 ] && [ $value -le 9 ];then
content="我就是我, 是不一样的烟火。现在是 ${systemTime} ,不晚也不早,就像多年苛求而不可得的爱情,有那么一刻激动,但缺少了追求的冲动,虽然如此,仍然感觉有点小幸福(#^.^#)看到门口的镜子了吗?朝它微笑吧。"
#中午
elif [ $value -ge 10 ] && [ $value -le 12 ];then
content="我就是我, 是不一样的烟火。现在是 $systemTime ,昨夜的风是否吹倦了你的梦,晨曦的露是否迷糊了你的心,夏日的阳光是否刺瞎了你的眼睛,迟到的脚步告诉我,你昨晚一定很幸福。哎,别YY了,瞎几把看啥呢~~"
#下午
elif [ $value -ge 13 ] && [ $value -le 16 ];then
content="我就是我, 是不一样的烟火。现在是 $systemTime "
else [ $value -ge 17 ] && [ $value -le 19 ]
content="我就是我, 是不一样的烟火。现在是 $systemTime ,幸福的人,总是比有钱的人过的勤奋;没钱的人,一定比幸福的人还勤奋。你看,已经到这个点了,你还没有下班。如果你不信,看看门口的照妖镜。"
fi


#statements
curl 'https://oapi.dingtalk.com/robot/send?access_token=1253bea539d0f61575ba10a743eb2564f5a7958b24211d21bc114ed0849656e0' \
-H 'Content-Type: application/json' \
-d '{
"msgtype": "text",
"text": {
"content": "'"${content}"'"
},
"at": {
"atMobiles": [
"18758083366",
"17715252607",
"15757184462"
],
"isAtAll": false
}
}'

定时任务

脚本写好之后,在开发机器上设置定时任务,到点推送消息。

Linux crontab 是用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。 linux 任务调度的工作主要分为以下两类:

  • 1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

  • 2、个人执行的工作:某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。

如果linux操作系统中没有crontabs,可以使用yum命令自行安装。

  • 使用yum命令安装crontab
1
2
3
4
5
6
7
8
9
yum install vixie-cron 
yum install crontabs
#注:vixie-cron软件包是cron的主程序;
#crontabs软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
#cron是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
/sbin/service crond start #启动服务
/sbin/service crond stop #关闭服务
/sbin/service crond restart #重启服务
/sbin/service crond reload #重新载入配置
  • 查看crontab的状态
1
2
3
service crond status
ntsysv #查看crontab服务是否已设置为开机启动
chkconfig –level 35 crond on #加入开机自动启动
  • 添加定时任务
1
2
3
4
5
6
7
8
crontab -e #编辑cron任务模式
i #默认文字编辑器为vim,按i字母键即可添加cron任务
30 8 * * * /home/admin/dakatips.sh #将命令代码放入,此命令意义为每天的08:30 上班打开消息
0 18 * * * /home/admin/dakatips.sh #下午6点下班打开提醒
0 20 * * * /home/admin/dakatips.sh #晚上8点领取餐补提醒
ESC #按ESC键退出编辑模式
:wq #键入:wq保存
service crond restart #重启crontab服务
  • 查看任务列表
1
cron -l

定时任务其他参数

  • 语法
1
2
3
4
5
crontab [-u <用户名称>][配置文件] 或 crontab { -l | -r | -e }
-u #<用户名称> 是指设定指定<用户名称>的定时任务,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的定时任务。
-l  #列出该用户的定时任务设置。
-r  #删除该用户的定时任务设置。
-e  #编辑该用户的定时任务设置。
  • 命令时间格式
1
2
3
4
5
6
7
8
*     *    *   *   *  command
分  时  日  月  周  命令
第1列表示分钟1~59 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
  • 一些Crontab定时任务例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
30 21 * * * /usr/local/etc/rc.d/lighttpd restart  #每晚的21:30 重启apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart #每月1、10、22日的4 : 45重启apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart #每周六、周日的1 : 10重启apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart #每天18 : 00至23 : 00之间每隔30分钟重启apache
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart #每星期六的11 : 00 pm重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart #晚上11点到早上7点之间,每隔一小时重启apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart #每一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart #每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart #一月一号的4点重启apache

*/30 * * * * /usr/sbin/ntpdate cn.pool.ntp.org #每半小时同步一下时间
0 */2 * * * /sbin/service httpd restart #每两个小时重启一次apache
50 7 * * * /sbin/service sshd start #每天7:50开启ssh服务
50 22 * * * /sbin/service sshd stop #每天22:50关闭ssh服务
0 0 1,15 * * fsck /home #每月1号和15号检查/home 磁盘
1 * * * * /home/bruce/backup #每小时的第一分执行 /home/bruce/backup这个文件
00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; #每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。
30 6 */10 * * ls #每月的1、11、21、31日是的6:30执行一次ls命令
  • 部分脚本无法执行问题

如果我们使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:./test.sh)又可以正常执行,这主要是因为无法读取环境变量的原因。
解决方法:
(1)所有命令需要写成绝对路径形式,如: /usr/local/bin/docker。
(2)在 shell 脚本开头使用以下代码:

1
2
3
4
#!/bin/sh

. /etc/profile
. ~/.bash_profile

(3)在 /etc/crontab 中添加环境变量,在可执行命令之前添加命令 . /etc/profile;/bin/sh,使得环境变量生效,例如:

1
20 03 * * * . /etc/profile;/bin/sh /home/admin/dakatips.sh
  • Crontab默认调度任务

cron默认配置了调度任务,分别为:hourlydailyweeklymouthly,默认配置文件为/etc/anacrontab,将需要执行的脚本放到相应的目录下即可,目录分别为:

1
2
3
4
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/ect/cron.mouthly