关于crontab:77centos-定时任务crontab

crontab -e# For details see man 4 crontabs # Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed #每60分种执行# */60 * * * * root /root/java/test1.sh#每天1点20分 执行# 20 1 * * * root /root/java/test2.sh#文件最初肯定要留一个空行,不然命名:crontab /etc/crontab会报错重启服务: ...

October 14, 2022 · 1 min · jiezi

关于crontab:在线常用crontab表达式大全验证解析

在线罕用crontab表达式大全验证解析在线罕用crontab表达式大全验证解析 本工具能够在线模仿Crontab表达式的执行工夫并且收集整理了罕用的Crontab表达式。 本工具能够在线模仿Crontab表达式的执行工夫并且收集整理了罕用的Crontab表达式。 https://tooltt.com/crontab/

March 28, 2022 · 1 min · jiezi

关于crontab:Crontab

每秒执行 * * * * * /data/safety/services.sh* * * * * sleep 10;/data/safety/services.sh* * * * * sleep 20;/data/safety/services.sh* * * * * sleep 30;/data/safety/services.sh* * * * * sleep 40;/data/safety/services.sh* * * * * sleep 50;/data/safety/services.sh每五分钟执行 */5 * * * *每小时执行 0 * * * *每2小时执行 0 */2 * * *每天执行 0 0 * * *每周执行 0 0 * * 0每月执行 0 0 1 * *每年执行 0 0 1 1 *实例1:每1分钟执行一次command命令:* * * * * command实例2:每小时的第3和第15分钟执行命令:3,15 * * * * command实例3:在上午8点到11点的第3和第15分钟执行命令:3,15 8-11 * * * command实例4:每隔两天的上午8点到11点的第3和第15分钟执行命令:3,15 8-11 */2 * * command实例5:每个星期一的上午8点到11点的第3和第15分钟执行命令:3,15 8-11 * * 1 command实例6:每晚的21:30重启smb命令:30 21 * * * /etc/init.d/smb restart实例7:每月1、10、22日的4 : 45重启smb命令:45 4 1,10,22 * * /etc/init.d/smb restart实例8:每周六、周日的1 : 10重启smb命令:10 1 * * 6,0 /etc/init.d/smb restart实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb命令:0,30 18-23 * * * /etc/init.d/smb restart实例10:每星期六的早晨11 : 00 pm重启smb命令:0 23 * * 6 /etc/init.d/smb restart实例11:每一小时重启smb命令:* */1 * * * /etc/init.d/smb restart实例12:早晨11点到早上7点之间,每隔一小时重启smb命令:* 23-7/1 * * * /etc/init.d/smb restart实例13:每月的4号与每周一到周三的11点重启smb命令:0 11 4 * mon-wed /etc/init.d/smb restart实例14:一月一号的4点重启smb命令:0 4 1 jan * /etc/init.d/smb restart实例15:每小时执行/etc/cron.hourly目录内的脚本命令:01 * * * * root run-parts /etc/cron.hourly阐明:run-parts这个参数,如果去掉这个参数的话,前面就能够写要运行的某个脚本名,而不是目录名了

February 9, 2022 · 1 min · jiezi

关于crontab:在线常用crontab表达式大全验证解析

在线罕用crontab表达式大全验证解析在线罕用crontab表达式大全验证解析 本工具可能通过特定的crontab表达式,计算出将来几次的执行工夫,不便调试和查看。本工具可能通过特定的crontab表达式,计算出将来几次的执行工夫,不便调试和查看。 https://tooltt.com/crontab/

January 13, 2022 · 1 min · jiezi

关于crontab:自己动手撸一个cron表达式解析器

背景给公司某商城我的项目做了一套音讯平台,就是这货,此音讯不是短信邮件告诉之类的音讯,而是指音讯队列中的音讯,平台能够动态创建消费者和生产者,解决异步音讯,提供多种可视化伎俩对音讯处理过程进行全生命周期治理,有趣味的小伙伴能够理解下。广告工夫完结:),以下是注释 平台有一个小性能,能够配置定时工作,定时执行一些程序,一开始就简略用ScheduledThreadPoolExecutor实现了下,能够实现周期性执行工作,前面须要实现相似一个月中某一天执行这种非固定周期性的工作时就无奈实现,这就须要引入cron表达式,找一个反对cron表达式的框架并不难,spring boot自身就反对,quartz也反对,但思考到 定时不是外围性能,不想为了一个非核心性能引入过多的依赖cron表达式只有5个变量,解析起来绝对简略本人造轮子,可控性比拟强至于为什么不必spring boot自带的cron表达式性能(也没引入新的依赖),起因有两个 零碎和spring boot在架构上就是解藕的,也就是系统核心并不依赖spring boot,spring boot只是实现了web api的性能,但定时属于零碎自身的性能,并不是web api的性能spring boot的cron不反对动态创建,须要在启动时确定本文没有用到编译原理任何常识(实际上我也不会),齐全是硬解析,能够释怀食用,保障大家都看得懂:) cron表达式cron表达式是一个能够形容周期性工作的表达式语言,一个cron表达式蕴含5个局部,每个局部用空格隔开,比方上面这个表达式示意每天的20:12执行 12 20 * * *cron表达式每个局部含意如下 分钟小时天月周每个局部容许以下几种操作符 * 取值范畴内的所有数字/ 每过多少个数字- 从X到Z,散列数字实例实例1:每1分钟执行一次* * * * *实例2:每小时的第3和第15分钟执行3,15 * * * * 实例3:在上午8点到11点的第3和第15分钟执行3,15 8-11 * * *实例4:每隔两天的上午8点到11点的第3和第15分钟执行3,15 8-11 */2 * *实例5:每周一上午8点到11点的第3和第15分钟执行3,15 8-11 * * 1实例6:每晚的21:30重启smb30 21 * * *实例7:每月1、10、22日的4 : 45重启smb45 4 1,10,22 * *实例8:每周六、周日的1 : 10重启smb10 1 * * 6,0实例9:每天18 : 00至23 : 00之间每隔30分钟重启smb0,30 18-23 * * *实例10:每星期六的早晨11 : 00 pm重启smb0 23 * * 6实例11:每一小时重启smb0 */1 * * *实现思路要实现一个相似quartz的程序,须要两个外围组件配合能力实现,根本所有的定时类框架都是这个思路 ...

January 3, 2022 · 6 min · jiezi

关于crontab:在线常用crontab表达式大全验证解析

在线罕用crontab表达式大全验证解析在线罕用crontab表达式大全验证解析 本工具可能通过特定的crontab表达式,计算出将来几次的执行工夫,不便调试和查看。https://tooltt.com/crontab/

July 29, 2021 · 1 min · jiezi

关于crontab:在线crontab表达式执行时间计算工具

在线crontab表达式执行工夫计算工具本工具可能通过特定的crontab表达式,计算出将来几次的执行工夫,不便调试和查看。在线crontab表达式执行工夫计算工具 https://tooltt.com/crontab-parse/

June 20, 2021 · 1 min · jiezi

关于crontab:CentOS-定时任务文件保存及查看地方

一、创立一个工作文件(1)命令行输出crontab -e crontab -e(2)输出a或者i能够进入编辑状态,可输出工作代码。代码格局能够进入/etc/crontab查看 [root@VM-0-10-centos cron]# cat /etc/crontab# 输入后果SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed二、保留文件先按Esc键,而后输出“:wq” ...

May 19, 2021 · 1 min · jiezi

关于crontab:关于docker容器cron定时任务的执行

一、如何在容器中启用cron这里咱们列出集中用于定时的计划: 应用主机的cron实现定时工作创立一个新容器专门执行定时工作在原有容器上装置cron,外面运行2个过程上面我将具体介绍形式1的应用过程,对于形式二和形式3请参考:Docker cron定时工作 二、应用宿主机的cron实现docker容器内的定时工作1.宿主机装置crontab # vixie-cron软件包是cron的主程序yum install vixie-cron# crontabs软件包是用来装置、卸装、或列举用来驱动 cron 守护过程的表格的程序yum install crontabs# 留神# 如果在执行“yum install vixie-cron”中,遇到“No package vixie-cron available. Error: Nothing to do”,解决形式如下:yum -y install vim-enhanced.x86_642.crond常用命令 service crond start //启动服务 service crond stop //敞开服务 service crond restart //重启服务 service crond reload //从新载入配置service crond status //查看状态chkconfig crond on //设置开机主动启动crond服务:chkconfig –list crond //开机级别的crond服务运行状况 ,2、3、4、5级别开机会主动启动crond服务 chkconfig crond off//勾销开机主动启动crond服务crontab常用命令 crontab -e 而后增加相应的工作,wq存盘退出。crontab -e配置是针对某个用户的,而编辑/etc/crontab是针对零碎的工作crontab -l //列出以后的所有调度工作 crontab -l -u jp //列出用户jp的所有调度工作crontab -r //删除所有任务调度工作3.执行指定docker容器内的命令或脚本 #1.创立定时执行脚本 test.shDOCKER_ID=be7d32f830fdsudo docker exec -it $DOCKER_ID /bin/bash -c './config/test.sh'# 2.退出定时工作(每分钟执行一次)crontab -e*/1 * * * * /root/docker-compose/curators/test.sh >> /root/docker-compose/curators/test.log留神:1.执行中波及的脚本及日志文件都须要赋权2.如果定时工作没有执行胜利,则查看定时工作输入日志 ...

March 8, 2021 · 1 min · jiezi

一次定时任务配置错误引发的思考

背景某业务人员反应系统登陆不上去,于是程序员自己试着登陆系统成功了,心里很自信的认为“我的代码没有问题”,便让业务人员再试试。然后业务人员是登陆成功了,但是整个系统用起来很卡,这下程序员意识到是系统的问题了。 排查步骤因为刚刚上线了新的功能,想到了配置了定时任务,可能是定时任务配置错误,导致PHP启了过多进程。 使用命令ps -ef | grep php 查看,果然是起了很多没必要的更新数据脚本,其中涉及到与第三方接口的交互并且有大量的更新数据库的操作,所以直接导致系统卡顿。 使用命令crontab -l查看crontab配置,有几个脚本的执行频率是想配置成每小时执行一次,结果配置错误,导致每分钟执行一次。具体如下: # 错误配置* */1 * * * /usr/local/bin/php /data/site/demo/yii demo/sync-product# 正确配置0 */1 * * * /usr/local/bin/php /data/site/demo/yii demo/sync-product问题是排查到了,现在需要做的就是快速kill掉那些没必要的进程。这时候便想到了万能的awk命令,如下: ps -ef | grep php | awk '{print $2}' | xargs kill -9执行后,系统开始恢复稳定。 思考整个问题排查总结下来,归根结底还是配置crontab是不够细心。 同时也引发了其他的一些思考,总结后整理如下: 系统突然出现卡顿,常用的排查思路有哪些呢?查看内存使用状况:free -g查看磁盘使用状况:df -h查看磁盘I/O使用:iostat -dx查看CPU使用:top具体的系统调优,本文不做介绍了。 awk命令的基本使用常用命令 awk '条件类型 1{动作1} 条件类型2{动作2} ...' filenameawk后面接两个引号并加上大括号来设置想要对数据进行的处理动作。 例如:我们要取出账号与登录者的IP,且之间以[TAB]隔开,则: [release@api_02 ~]$ last -n 5 | awk '{print $1 "\t" $3}'release 117.111.111.11release 117.111.111.11release 117.111.111.11release 117.111.111.11release 117.111.111.11awk还存在一些内置变量 ...

October 16, 2019 · 1 min · jiezi

那些年我们追过的定时调度

定时调度作为后端开发人员,我们总会遇到这样的业务场景:每周同步一批数据;每半个小时检查一遍服务器运行状况;每天早上八点给用户发送一份包含今日待办事项的邮件,等等。 这些场景中都离不开“定时器”,就像一个定好时间规则的闹钟,它会在指定时间触发,执行我们想要定义的调度任务。那么我们今天就来数一下,那些年我们用过的“定时调度”。 1.job (oracle)从刚工作就一直使用oracle数据库,最早接触的定时任务就是oracle数据库的job。job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 而且oracle重新启动后,job会继续运行,不用重新启动。而且job的机制非常完备,可以查询相关的表或视图,查询job的定时规则和执行情况。缺点是作为oracle数据库层面的工具,自定义功能扩展,二次开发的难度比较大。 1.1 创建job 1.2 删除job 1.3 查询job2.crontab (linux)crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表。大部分linux系统默认都安装了cron,可以检查一下。 crontab基本操作命令 crontab表达式格式 3.Timer和ScheduledExecutorService (java)Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。 TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。TimerTask类是一个抽象类,由Timer 安排为一次执行或重复执行的任务。它有一个抽象方法run()方法,该方法用于执行相应计时器任务要执行的操作。因此每一个具体的任务类都必须继承TimerTask,然后重写run()方法。 另外它还有两个非抽象的方法 当然,一般使用Timer的比较少,因为它的缺点比较明显: 1.单线程,当多个timer同时运行时,会等上一个执行完成,再执行下一个。2.Timer线程是不会捕获异常的,如果TimerTask抛出的了未检查异常则会导致Timer线程终止。 所以一般使用ScheduledExecutorService替代Timer。 ScheduledExecutorService:也是jdk自带的一个基于线程池设计的定时任务类。其每个调度任务都会分配到线程池中的一个线程执行,所以其任务是并发执行的,互不影响。 4.SpringTask (spring)Timer和ScheduledExecutorService都是属于jdk层面上实现定时调度的类,功能还不足以让我们满意,那么现在介绍一个比较完善的定时调度工具 - SpringTask,是Spring提供的,支持注解和配置文件形式,支持crontab表达式,使用简单但功能强大。我个人非常喜欢SpringTask,仅仅是因为支持crontab表达式。 在springboot里面使用方式非常简单: 1.启动类添加开启定时调度的注解 @EnableScheduling2.在需要定时执行的方法上,增加注解 @Scheduled(cron ="crontab表达式") 默认的简单的使用步骤只有以上两步,但是SpringTask的默认使用方式也有一些不足: 1.默认线程池的poolsize为1,可以理解为Timer类似的单线程模式。无法动态修改crontab表达式,修改完只能重新部署后,才能生效。 问题1的解决方式,可以通过自定义 TaskExecutor来修改当前的线程池。问题2,则可以直接使用 threadPoolTaskScheduler类实现自定义的定时调度规则。 附解决两个问题的源码 TaskTimer.class 5.Quartz (其他产品)Quartz是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。它是一个功能强大、十分成熟的重量级产品,还支持负载均衡,实现分布式调度。 不过,对于Quartz的安装你要多花点功夫了,从数据库要建哪些表,到应用程序该如何部署。对于这样一个庞大的产品,本篇文章就不附上它的使用说明书了。 本人创业团队产品MadPecker,主要做BUG管理、测试管理、应用分发,网址:www.madpecker.com,有需要的朋友欢迎试用、体验!本文为MadPecker团队技术人员编写,转载请标明出处

June 17, 2019 · 1 min · jiezi

cron-表达式

CrontabCrontab简介crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 /etc/crontab 文件如下 [root@localhost ~]# cat /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed[root@localhost ~]#前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。 ...

May 15, 2019 · 2 min · jiezi

cron表达式详解

CrontabCrontab简介crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 /etc/crontab 文件如下 [root@localhost ~]# cat /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed[root@localhost ~]#前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。 ...

May 14, 2019 · 2 min · jiezi

透过 Crontab 排程备份 Mariadb (Mysql)使用 php

本教学使用环境介绍伺服器端:Ubuntu 18.04 LTS资料库:Mariadb 10.1.34(Mysql)语言版本:php 7.3本机端:MacOS High Sierra本教学将使用纯 php 去备份资料库并下载到目录底下$ crontab -e设定每天凌晨00:00 执行0 0 * * * php /var/www/backup.phpbackup.php 脚本记得开头一定要 「<?php」,即便你有启用缩写header(‘Content-Type: text/html; charset=utf-8’);function backup_mysql_database($options){$mtables = array(); $contents = “– Database: ".$options['db_to_backup']." –\n”;$mysqli = new mysqli($options[‘db_host’], $options[‘db_uname’], $options[‘db_password’], $options[‘db_to_backup’]);if ($mysqli->connect_error) { die(‘Error : (’. $mysqli->connect_errno .’) ‘. $mysqli->connect_error);}$mysqli->query(“SET NAMES utf8”);$mysqli->set_charset(“utf8mb4”);$results = $mysqli->query(“SHOW TABLES”);while ($row = $results->fetch_array()){ if (!in_array($row[0], $options[‘db_exclude_tables’])){ $mtables[] = $row[0]; }}foreach($mtables as $table){ $contents .= “– Table ".$table." –\n”; $results = $mysqli->query(“SHOW CREATE TABLE “.$table); while ($row = $results->fetch_array()){ $contents .= $row[1].”;\n\n”; } $results = $mysqli->query(“SELECT * FROM “.$table); $row_count = $results->num_rows; $fields = $results->fetch_fields(); $fields_count = count($fields); $insert_head = “INSERT INTO ".$table." (”; for($i=0; $i < $fields_count; $i++){ $insert_head .= “".$fields[$i]-&gt;name."”; if($i < $fields_count-1){ $insert_head .= ‘, ‘; } } $insert_head .= “)”; $insert_head .= " VALUES\n”; if($row_count>0){ $r = 0; while ($row = $results->fetch_array()){ if(($r % 400) == 0){ $contents .= $insert_head; } $contents .= “(”; for($i=0; $i < $fields_count; $i++){ $row_content = str_replace("\n”,"\n",$mysqli->real_escape_string($row[$i])); switch($fields[$i]->type){ case 8: case 3: $contents .= $row_content; break; default: $contents .= “’”. $row_content ."’"; } if($i < $fields_count-1){ $contents .= ‘, ‘; } } if(($r+1) == $row_count || ($r % 400) == 399){ $contents .= “);\n\n”; } else { $contents .= “),\n”; } $r++; } }}if (!is_dir ( $options[‘db_backup_path’] )) { mkdir ( $options[‘db_backup_path’], 0777, true ); }## 备份后的 sql 名称$backup_file_name = “dev-” . date( “Y-m-d H:i:s”).".sql";$fp = fopen($options[‘db_backup_path’] . ‘/’ . $backup_file_name ,‘w+’);if (($result = fwrite($fp, $contents))) { // echo “Backup file created ‘$backup_file_name’ ($result)”;}fclose($fp);return $backup_file_name;}## 资料库设定$options = array( ‘db_host’=> ’localhost’, ‘db_uname’ => ‘root’, // 资料库使用者帐号 ‘db_password’ => ‘password’, // 资料库密码 ‘db_to_backup’ => ‘db’, // 资料库名称 ‘db_backup_path’ => ‘/var/www/’, // 保存到哪个路径 ‘db_exclude_tables’ => array());$backup_file_name=backup_mysql_database($options);这样就可以透过 php 备份到该主机下,直接产生 sql 档了。Line ID:ianmacQQ:1258554508 ...

April 13, 2019 · 2 min · jiezi

透过 Crontab 排程备份 Mariadb (Mysql)使用 php + exec + mysqldump + gzip

本教学使用环境介绍伺服器端:Ubuntu 18.04 LTS资料库:Mariadb 10.1.34(Mysql)语言版本:php 7.3本机端:MacOS High Sierra一开始原本是用 php 去备份资料库,但是发现会有一些问题,于是改成这种方式,直接透过 mysql 去备份,出来的格式也不会有什么问题。$ crontab -e设定每天凌晨00:00 执行0 0 * * * php /var/www/backup.phpbackup.php 脚本记得开头一定要 「<?php」,即便你有启用缩写<?php// 设定环境header(‘Content-Type: text/html; charset=utf-8’);date_default_timezone_set(‘Asia/Taipei’);// 设定保存的资料夹位置$dir = “/var/www/db/”;// 设定档名$filename = “dev-” . date(“Y-m-d-H-i-s”) . “.sql.gz”;// 设定资料库$db_host = “localhost”;$db_username = “root”;$db_password = “password”;$db_database = “db”;// 准备 cmd$cmd = “mysqldump -h {$db_host} -u {$db_username} –password={$db_password} {$db_database} | gzip > {$dir}{$filename}”;// 执行 cmdexec($cmd);header(“Content-type: application/octet-stream”);header(“Content-Disposition: attachment; filename="$filename"”);passthru(“cat {$dir}{$filename}”);?>输出时会经过 gzip 解压缩实验过原本 150MB 的 sql 压缩后为 28MBLine ID:ianmacQQ:1258554508 ...

April 13, 2019 · 1 min · jiezi

Dockerfile构建PHP开发镜像:Alpine+Nginx+PHP7+Supervisor+Crontab+Laravel

一、配置目录结构1.1 crontabs# do daily/weekly/monthly maintenance# min hour day month weekday command# * * * * * /usr/bin/php /usr/share/nginx/html/artisan schedule:run >> /dev/null 2>&1Tips:一般在生产环境都是负载均衡,定时任务是单独在一个容器执行,故此是注释掉的,需要单独在定时任务容器中打开即可。2.1 nginx与php配置文件Tips:由于php配置文件是监听的sock,默认情况下监听端口 9000。PHP-FPM使用Unix套接字,这避免了TCP的开销。3.1 php二、Dockerfile详解#1.Base ImageFROM alpine# ensure www-data user exists#RUN set -x # && addgroup -g 82 -S www-data # && adduser -u 82 -D -S -G www-data www-data# EnvironmentsENV TIMEZONE Asia/ShanghaiENV PHP_MEMORY_LIMIT 512MENV MAX_UPLOAD 50MENV PHP_MAX_FILE_UPLOAD 200ENV PHP_MAX_POST 100MENV COMPOSER_ALLOW_SUPERUSER 1#2.ADD-PHP-FPM# Mirror mirror switch to Alpine Linux - http://dl-4.alpinelinux.org/alpine/RUN apk update \ && apk upgrade \ && apk add \ curl \ tzdata \ php7-fpm\ php7 \ php7-dev \ php7-apcu \ php7-bcmath \ php7-xmlwriter \ php7-ctype \ php7-curl \ php7-exif \ php7-iconv \ php7-intl \ php7-json \ php7-mbstring\ php7-opcache \ php7-openssl \ php7-pcntl \ php7-pdo \ php7-mysqlnd \ php7-mysqli \ php7-pdo_mysql \ php7-pdo_pgsql \ php7-phar \ php7-posix \ php7-session \ php7-xml \ php7-simplexml \ php7-mcrypt \ php7-xsl \ php7-zip \ php7-zlib \ php7-dom \ php7-redis\ php7-tokenizer \ php7-gd \ php7-mongodb\ php7-fileinfo \ php7-zmq \ php7-memcached \ php7-xmlreader \ && cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \ && echo “${TIMEZONE}” > /etc/timezone \ && apk del tzdata \ && rm -rf /var/cache/apk/# https://github.com/docker-library/php/issues/240# https://gist.github.com/guillemcanal/be3db96d3caa315b4e2b8259cab7d07e# https://forum.alpinelinux.org/forum/installation/php-iconv-issueRUN mkdir -p /usr/local/var/log/php7/RUN mkdir -p /usr/local/var/run/COPY ./php/php-fpm.conf /etc/php7/COPY ./php/www.conf /etc/php7/php-fpm.d/RUN apk add –no-cache –repository http://dl-3.alpinelinux.org/alpine/edge/testing gnu-libiconvENV LD_PRELOAD /usr/lib/preloadable_libiconv.so phpRUN rm -rf /var/cache/apk/# Set environmentsRUN sed -i “s|;date.timezone =.|date.timezone = ${TIMEZONE}|i” /etc/php7/php.ini && \ sed -i “s|;memory_limit =.|memory_limit = ${PHP_MEMORY_LIMIT}|i” /etc/php7/php.ini && \ sed -i “s|;upload_max_filesize =.|upload_max_filesize = ${MAX_UPLOAD}|i” /etc/php7/php.ini && \ sed -i “s|;max_file_uploads =.|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|i” /etc/php7/php.ini && \ sed -i “s|;post_max_size =.|post_max_size = ${PHP_MAX_POST}|i” /etc/php7/php.ini && \ sed -i “s|;cgi.fix_pathinfo=.|cgi.fix_pathinfo= 0|i” /etc/php7/php.ini#3.Install-ComposerRUN curl -sS https://getcomposer.org/installer | \ php – –install-dir=/usr/bin/ –filename=composer#4.ADD-NGINXRUN apk add nginxCOPY ./nginx/conf.d/default.conf /etc/nginx/conf.d/COPY ./nginx/nginx.conf /etc/nginx/COPY ./nginx/cert/ /etc/nginx/cert/RUN mkdir -p /usr/share/nginx/html/public/COPY ./php/index.php /usr/share/nginx/html/public/#RUN mkdir -p /run/nginx#RUN touch /run/nginx/nginx.pid# Expose volumesVOLUME ["/usr/share/nginx/html", “/usr/local/var/log/php7”, “/var/run/"]WORKDIR /usr/share/nginx/html#5.ADD-SUPERVISORRUN apk add supervisor \ && rm -rf /var/cache/apk/*# Define mountable directories.VOLUME ["/etc/supervisor/conf.d”, “/var/log/supervisor/"]COPY ./supervisor/conf.d/ /etc/supervisor/conf.d/#6.ADD-CRONTABSCOPY ./crontabs/default /var/spool/cron/crontabs/RUN cat /var/spool/cron/crontabs/default >> /var/spool/cron/crontabs/rootRUN mkdir -p /var/log/cron \ && touch /var/log/cron/cron.logVOLUME /var/log/cron#8.添加启动脚本# Define working directory.WORKDIR /usr/share/nginx/htmlCOPY ./entrypoint.sh /usr/share/nginx/html/RUN chmod +x /usr/share/nginx/html/entrypoint.sh#CMD [“supervisord”, “–nodaemon”, “–configuration”, “/etc/supervisor/conf.d/supervisord.conf”]ENTRYPOINT [”./entrypoint.sh"]传送门:Dockerfile、Docker-Compose基本命令与介绍三、镜像制作与启动3.1 根据Dockerfile制作镜像3.2 查看制作的镜像3.3 启动镜像3.4 浏览器查看是否成功四、镜像发布4.1 镜像发布一定要登录4.2 自动构建当关联的github代码发生改变是,自动触发构建。GitHub地址:https://github.com/tcyfree/anpscDocker Hub镜像地址:https://cloud.docker.com/repo… ...

March 7, 2019 · 2 min · jiezi

使用logrotate完成日志自动切分并轮转

部署网络应用时,会对请求进行日志保存,用于数据统计分析以及故障排除,但对于高并发请求的服务器,日志文件会迅速增长,快速的消耗磁盘空间,同时,分析一个大文件来排查问题也会非常慢。因此,我们通常需要将日志按照天级别进行存储,并对过旧的日志进行压缩转存或删除,方便节省磁盘空间和进行脚本分析。当我第一次有这种需求的时候,最先想到的是crontab脚本定时执行日志清理脚本。就是先编写一个cleanLog.sh,然后让crontab定期的来执行它。这个方法可行,但是比较麻烦费事,此时一个Linux内置的工具就比较有用了:logrotate。logrotate: Linux日志文件总管logrotate(日志轮转工具)可以自动对日志文件提供截断、压缩以及轮转的功能。logrotate工具默认安装在linux机器上,全局命令在/usr/sbin/logrotate,另外还包含两个配置文件:// 全局配置文件,存储的为公用的默认配置项/etc/logrotate.conf// 子项配置文件夹,该文件夹下提供一些系统级别的日志配置,你的自定义配置也需要配置在这里/etc/logrotate.d/这个工具能做到自动执行的功能,其实还是依赖于crontab工具,只不过这些设定系统自动完成了,我们可以查看crontab系统级别的日运行脚本:$ vim /etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1EXITVALUE=$?if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate “ALERT exited abnormally with [$EXITVALUE]“fiexit 0可以看到在crontab的日级别配置文件目录下有一个logrotate子项,它会每天执行logrotate命令,调用的配置为/etc/logrotate.conf。在实际执行中,logrotate命令会先读取/etc/logrotate.conf的配置作为默认项,然后再依次读取/etc/logrotate.d/目录下的各文件配置来覆盖默认项,并执行日志轮转功能。logrotate命令语法:logrotate [OPTION…] <configfile>参数说明:-d, –debug :debug模式,测试配置文件是否有错误。-f, –force :强制转储文件。-m, –mail=command :压缩日志后,发送日志到指定邮箱。-s, –state=statefile :使用指定的状态文件。-v, –verbose :显示转储过程。logrotate使用假设我们现在有一个日志文件存储在/home/work/log/nginx.access.log,需要对其每日进行切分为新旧两个日志文件,并删除7天前的旧日志。首先我们创建新的日志轮转配置:$vim /etc/logrotate.d/nginxAccessLog# 指定需要轮转处理的日志文件/home/work/log/nginx.access.log { # 日志文件轮转周期,可用值为: daily/weekly/yearly daily # 新日志文件的权限 create 0664 work work # 轮转次数,即最多存储7个归档日志,会删除最久的归档日志 rotate 7 # 以当前日期作为命名格式 dateext # 轮循结束后,已归档日志使用gzip进行压缩 compress # 与compress共用,最近的一次归档不要压缩 delaycompress # 忽略错误信息 missingok # 日志文件为空,轮循不会继续执行 notifempty # 当日志文件大于指定大小时,才继续执行,单位为bytes(默认)/k/M/G size = 100M # 将日志文件转储后执行的命令,以endscript结尾,命令需要单独成行 postrotate # 重启nginx日志服务,写入到新的文件中去,否则会依然写入重命名后的文件中 /bin/kill -USR1 cat /home/work/run/nginx.pid 2&gt; /dev/null 2> /dev/null || true endscript}在使用前,我们先演练一下,也就是debug模式,此时,不用实际轮循,而是模拟并输出,使用强制执行是因为还没到轮循周期:$logrotate -d -f /etc/logrotate.d/nginxAccessLog reading config file /etc/logrotate.d/nginxAccessLogreading config info for /home/work/log/nginx.access.logHandling 1 logsrotating pattern: /home/work/log/nginx.access.log forced from command line (7 rotations)empty log files are rotated, old logs are removedconsidering log /home/work/log/nginx.access.log log needs rotatingrotating log /home/work/log/nginx.access.log, log->rotateCount is 7dateext suffix ‘-20190228’glob pattern ‘-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]‘glob finding old rotated logs failedrenaming /home/work/log/nginx.access.log to /home/work/log/nginx.access.log-20190228creating new /home/work/log/nginx.access.log mode = 0664 uid = 500 gid = 501running postrotate scriptrunning script with arg /home/work/log/nginx.access.log: " /bin/kill -USR1 cat /home/work/run/nginx.pid 2&gt; /dev/null 2> /dev/null || true"可以看到整个执行流程,以及没有什么报错信息,此时我们直接继续执行:$logrotate -f /etc/logrotate.d/nginxAccessLog$ll /home/work/lnmp/log/ -rw-r–r– 1 work work 0 Feb 28 13:40 nginx.access.log-rw-r–r– 1 work work 5379846 Feb 28 13:37 nginx.access.log-20190228可以看到我们已经对日志进行了切分,最新的日志文件大小为0。以后系统就会对该日志进行自动的轮转管理。参考资料Linux日志文件总管——logrotate:https://linux.cn/article-4126…logrotate-(8) manual page:https://linuxconfig.org/logro…运维中的日志切割操作梳理:https://www.cnblogs.com/kevin… ...

February 28, 2019 · 1 min · jiezi

crontab 在mac上不执行问题研究

crontab是个管理定时任务的工具,作用是在特定时间(通过crontab的语法配置),自动执行特定任务(想让它执行什么,就写个脚本或bash命令)。当你每天都需要执行脚本干一些重复工作的时候,这个东西就派上用场了。不了解这个东西怎么用的朋友,可以通过点击这里进行一个基本了解。这篇文章主要是为了记录自己在写crontab时踩得一些坑,当我按照顺序做完配置之后,却发现crontab中的task怎么也跑步起来,于是google了一下问题,找到了几个相关blog,结合在一起验证,终于解决了问题。crontab 为啥不执行呢?问了一下谷歌,OS X的定时任务统统由 launchctl 来管理的,看看 cron 任务有没有在里面 ➜ ~ sudo launchctl list | grep cron 208 0 com.vix.cron 有记录。查看一下启动项的配置。 ➜ ~ locate com.vix.cron WARNING: The locate database (/var/db/locate.database) does not exist. To create the database, run the following command: sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist Please be aware that the database can take some time to generate; once the database has been created, this message will no longer appear.database 不存在啊,那就创建一个吧。 sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist // 这个指令会花费一定时间一段时间后,创建成功,然后查看~ cat /System/Library/LaunchDaemons/com.vix.cron.plist<?xml version=“1.0” encoding=“UTF-8”?><!DOCTYPE plist PUBLIC “-//Apple Computer//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version=“1.0”><dict> <key>Label</key> <string>com.vix.cron</string> <key>ProgramArguments</key> <array> <string>/usr/sbin/cron</string> </array> <key>KeepAlive</key> <dict> <key>PathState</key> <dict> <key>/etc/crontab</key> <true/> </dict> </dict> <key>QueueDirectories</key> <array> <string>/usr/lib/cron/tabs</string> </array> <key>EnableTransactions</key> <true/></dict></plist>注意里面有个keepAlive的条件是 /etc/crontab 是否存在: <key>KeepAlive</key> <dict> <key>PathState</key> <dict> <key>/etc/crontab</key> <true/> </dict> </dict>查看 /etc/crontab 是否存在➜ ~ ll /etc/crontabls: /etc/crontab: No such file or directory查看得知,该文件不存在,创建该文件。➜ ~ sudo touch /etc/crontab最终,就可以成功执行了。需要注意的是,sh脚本中的路径,最好使用绝对路径,否则脚本很可能将无法正确执行 ...

December 24, 2018 · 1 min · jiezi