1.4- 定时任务总结之九句箴言

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.4- 定时任务总结之九句箴言相关的知识,希望对你有一定的参考价值。

1.4

定时任务之九句箴言

九句箴言----  不会九句箴言别做运维

1.定时任务规则之前加注释

2.使用脚本代替命令行制定定时任务

3.定时任务中date命令%的特殊含义

定时任务中,%表示回车  -----可以使用\转义

4.运行脚本一定要用/bin/shsh

脚本不必须有x权限

5.定时任务中-命令或脚本的输出结果(正确或错误)

定向到黑洞(>/dev/null  2>&1)

或追加到文件中(>>/tmp/oldboy.txt  2>&1)

6.避免不必要的程序及命令输出

tar zcvf  ×××××

tar   zcf  √√√√√

7.打包压缩使用相对路径

8.定时任务脚本中的程序文件,尽量使用绝对路径

用户的定时任务中--------默认存放在当前用户的家目录

系统的定时任务-----------存放在根目录下

9.系统与命令位置有关的环境变量问题

linux定时任务生产java服务无法执行问题群友案例

定时任务运行脚本的时候 PATH只认识很少的几个路径 /usr/bin  /bin

解决:  方法1.使用命令的绝对路径

       方法2.PATH在脚本的开头重新定义一下

         Java方面使用绝对路径麻烦,用此方法(Tomcat)


第1章 箴言5:定制任务执行的结果定向到文件或黑洞中

追加到文件

#backup etc/services to /tmp by oldboy

#00  */2  *  *  *  /bin/sh  /server/scripts/bak-services.sh >>/tmp/back-services.log  2>&1

追加到空洞                                                                    正确的或错误的

#backup /var/www/html to back-html.sh

*  *  *  *  *    /bin/sh   /server/scripts/bak-html.sh   >>/dev/null 2>&1

1.1 企业案例:定时任务中 命令或脚本的结果 没有定向到黑洞或文件中

1.邮件的软件(Postfix)没有开启

inode满了--------大量小文件堆积在/var/spool/postfix/maildrop/

2.邮件软件开启 -------不会导致inode满了

邮件文件很大----------you have new mail in /var/spool/mail/root

1.1.1 工作中postfix软件不会运行    

postfix   开启:  邮件存放位置------/var/spool/main/root

         关闭: 邮件存放在临时目录----/var/spool/postfix/maildrop/

1.2 回顾:创建/删除大量小文件

同时创建大量小文件    --千万别直接ls      --ls \wc -l

[[email protected] oldboy]# touch {1..450000}.txt

-bash: /bin/touch: Argument list too long

[[email protected] oldboy]# echo {1..450000}.txt|xargs touch

同时删除大量小文件 1.交给管道 加rm                                                                                                       

2. 还删不了   -缩小范围一点一点分类删除

[[email protected] oldboy]# #ls 1*.txt|xargs rm               方法一

[[email protected] oldboy]# #ls 2*.txt|xargs rm

[[email protected] oldboy]# ls *.txt|xargs -n数字  rm         方法二

 

3.或删除目录   --删之前 记好目录的权限和所有者

 

 

实例1-1 每天凌晨1点把/etc/目录 打包备份/tmp目录并且要求每天的备份名字不同。

###第1个里程碑-命令             cd到上级目录  &&  tar 相对路径     

[[email protected] /]# cd / &&  tar zcf /tmp/etc-$(date +%F).tar.gz etc/

[[email protected] /]# ls -l /tmp/etc-2018-01-04.tar.gz

-rw-r--r-- 1 root root 9775655 Jan  4 09:31 /tmp/etc-2018-01-04.tar.gz

第二个里程碑--命令放入脚本中

[[email protected] scripts]# echo 'cd /  && tar zcf etc.$(date +%F).tar.gz etc' >>/server/scripts/etc_bak.sh

[[email protected] scripts]# cat /server/scripts/etc_bak.sh

cd /  && tar zcf etc.$(date +%F).tar.gz etc

[[email protected] /]# sh /server/scripts/etc_bak.sh

[[email protected] /]# ls / |grep etc.2018*

etc.2018-01-04.tar.gz

第三个里程碑--书写定时任务

[[email protected] /]# vim /var/spool/cron/root

#backup etc and different time

*  *  *  *  *  /bin/sh /server/scripts/etc_bak.sh  >>/tmp/time.log  2>&1

第四个里程碑--检查

tail -f  /var/log/cron                               查看定时任务日志的实时更新

ll  /  |grep etc.2018*                           查看效果

第五个里程碑---确认无误,按规定创建定时任务

00  1  *  *  *  /bin/sh /server/scripts/etc_bak.sh  >>/tmp/time.log  2>&1

第2章 箴言6尽量避免一些不必要输出  

zcvf(不要)----zcf  不要显示过程

显示过程,,

 

第3章 箴言8定时任务脚本中的程序文件,尽量使用绝对路径

用户的定时任务中--------默认存放在当前用户的家目录

系统的定时任务-----------存放在根目录下

第4章 箴言9系统与命令位置有关的环境变量问题

linux定时任务生产java服务无法执行问题群友案例

定时任务运行脚本的时候 PATH只认识很少的几个路径 /usr/bin  /bin

解决:  方法1.使用命令的绝对路径

       方法2.PATH在脚本的开头重新定义一下

         Java方面使用绝对路径麻烦,用此方法(Tomcat)

4.1 每分钟显示当系统的时间年--日和系统的ip地址,追加到 /tmp/ip.log 

第一个里程碑 ----在命令行中执行命令

[[email protected] oldboy]# date +%F && ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'

2018-01-04

10.0.0.201

第二个里程碑-----把命令复制粘贴到脚本中         --并执行脚本测试

[[email protected] oldboy]# sh /server/scripts/print-ip.sh

2018-01-04

10.0.0.201

第三个里程碑----制定定时任务------先每分钟执行一次,测试是否正确

crontab  -e  写定时任务

crontab  -l  查看定时任务

#pritn ip and date                                        加上注释,以后查看方便

*  *  *  *  *  /bin/sh  /server/scripts/print-ip.sh  >>/tmp/ip.log  2>&1      追加到文件中

第四个里程碑----查看效果        ---看定时任务日志文件       看效果

[[email protected] ~]# cat /tmp/ip.log

/server/scripts/print-ip.sh: line 1: ifconfig: command not found     报错

2018-01-04

4.1.1 原因: 定时任务运行脚本的时候 PATH只认识很少的几个路径 /usr/bin  /bin 
      ifconfig 命令 在/sbin

命令行--OK        脚本--OK      定时任务--NO

4.1.2 解决:方法1.脚本中使用命令的绝对路径

date +%F && /sbin/ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'

 方法2.PATH在脚本的开头重新定义一下
 export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[[email protected] oldboy]# vim /server/scripts/print-ip.sh

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

date +%F && ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4}'

[[email protected] ~]# tail -f /tmp/ip.log

2018-01-04

10.0.0.201

 

了解:有时候必须使用方法二:tomcat

重启resin的脚本(Java编写)

使用export重新声明PATH变量

 

总结:

1.定时任务一些注意事项

  00  00  *  *  *         表示半夜12/0点    

  00  07  *  *  *         表示7点整

  00  23,00-07 *  *  *     表示晚上23点一直到第二天早上7

  创建定时任务一步一步来,多复制粘贴

  将定时任务的输出结果重定向到文件/黑洞

 

2.故障排查

 查看日志          /var/log/cron    

 检查结果         是否得到你想要的内容

 改为每分钟运行   

 修改系统时间   --提前几分钟

 

 

3.定时任务流程:

相关命令在命令行执行查看效果

无误后复制粘贴进脚本

/bin/sh 执行脚本查看效果

确认无误后复制粘贴到定时任务配置文件(/)

时间先设置每分钟执行一次,查看定时任务的效果

确认无误后修改定时任务规定时间

 

 

 

扩展:

运行脚本显示执行过程

/bin/sh  -x        一个+号表示执行了一次      直接显示到屏幕上的,没有+

[[email protected] tmp]# /bin/sh -x /server/scripts/print-ip.sh

+ export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

+ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

+ date +%F

2018-01-04

+ awk -F '[ :]+' 'NR==2{print $4}'

+ ifconfig eth0

10.0.0.201

 

第四关练习(定时任务部分)

实例4-1 每隔2个小时将/etc/services文件打包备份到/tmp下。

命令:
[[email protected] ~]# cd / && tar zcf /tmp/services.$(date +%F_%H).tar.gz etc/services
[[email protected] /]# ls /tmp/services.$(date +%F_%H).tar.gz
/tmp/services.2018-01-04_11.tar.gz
写脚本
[[email protected] /]# cat /server/scripts/bak-services.sh
cd / && tar zcf /tmp/services.$(date +%F_%H).tar.gz etc/services
划任务
[[email protected] /]# crontab -l |tail -3
#backup etc/services to /tmp by oldboy
*  *  *  *  *  /bin/sh  /server/scripts/bak-services.sh >>/tmp/back-services.log  2>&1
检查
[[email protected] ~]# ll /tmp |grep "services.2018*"
-rw-r--r--. 1 root root 127314 Jan  4 11:39 services.2018-01-04_11.tar.gz

最后把定时任务设置成规定时间

[[email protected] ~]# crontab -l |tail -2

#backup etc/services to /tmp by oldboy

00  */2  *  *  *  /bin/sh  /server/scripts/bak-services.sh >>/tmp/back-services.log  2>&1

 

 

实例4-2 .每天晚上 12 点,打包站点目录/var/www/html 备份到/data 目录下(最好每次备份按时间生成不同的备份包)

命令:
[[email protected] /]# cd / && tar zcf /data/bak-html$(date +%F) var/www/html
[[email protected] /]# ls /data |grep "bak-html$(date +%F)"
bak-html2018-01-04
脚本:
[[email protected] /]# cat /server/scripts/bak-html.sh
cd / && tar zcf /data/bak-html$(date +%F) var/www/html
[[email protected] /]# /bin/sh /server/scripts/bak-html.sh
定时任务:
[[email protected] /]# crontab -l |tail -3
#backup /var/www/html to back-html.sh
*  *  *  *  *    /bin/sh   /server/scripts/bak-html.sh   >>/dev/null 2>&1
检查:
[[email protected] /]# ls -l /data |grep "bak-html$(date +%F)"
-rw-r--r--. 1 root root      117 Jan  4 12:15 bak-html2018-01-04

检查无误修改定时计划为规定时间

[[email protected] /]# crontab -l |tail -3
#backup /var/www/html to back-html.sh 
00  00  *  *  *    /bin/sh   /server/scripts/bak-html.sh     >>/dev/null 2>&1

 

文件

/etc/sysctl.conf    系统的内核配置文件

/etc/rc.local       开机自启动的软件,命令

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


以上是关于1.4- 定时任务总结之九句箴言的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot集成ShedLock分布式定时任务实例

定时任务总结

linux设置定时任务的方法(自己总结)

开源的.NET定时任务组件Hangfire开发总结

java web定时任务调度总结

《分布式_Job》——定时XXL_JOB_使用总结