脚本
公司开始要打卡考勤,但我们组的同事上下班总是忘记打卡签到,于是,灵机一动,写个脚本,到点了在钉钉群内推送消息,提醒大家打卡。
于是,下面这段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 任务调度的工作主要分为以下两类:
注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。
如果linux操作系统中没有crontabs,可以使用yum命令自行安装。
1 2 3 4 5 6 7 8 9
| yum install vixie-cron yum install crontabs
/sbin/service crond start /sbin/service crond stop /sbin/service crond restart /sbin/service crond reload
|
1 2 3
| service crond status ntsysv chkconfig –level 35 crond on
|
1 2 3 4 5 6 7 8
| crontab -e i 30 8 * * * /home/admin/dakatips.sh 0 18 * * * /home/admin/dakatips.sh 0 20 * * * /home/admin/dakatips.sh ESC :wq service crond restart
|
定时任务其他参数
1 2 3 4 5
| crontab [-u <用户名称>][配置文件] 或 crontab { -l | -r | -e } -u -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列要运行的命令
|
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 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart 0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart * */1 * * * /usr/local/etc/rc.d/lighttpd restart 0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart 0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
*/30 * * * * /usr/sbin/ntpdate cn.pool.ntp.org 0 */2 * * * /sbin/service httpd restart 50 7 * * * /sbin/service sshd start 50 22 * * * /sbin/service sshd stop 0 0 1,15 * * fsck /home 1 * * * * /home/bruce/backup 00 03 * * 1-5 find /home "*.xxx" -mtime +4 -exec rm {} \; 30 6 */10 * * 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
|
cron默认配置了调度任务,分别为:hourly
、daily
、weekly
、mouthly
,默认配置文件为/etc/anacrontab,将需要执行的脚本放到相应的目录下即可,目录分别为:
1 2 3 4
| /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /ect/cron.mouthly
|