最近在做PHP对于IOS的push信息,但是问题是要启动发送命令,必须在浏览器中访问规定的php特定页面才能实现推送功能。这是不科学的,然后研究如何让服务器自动来启动推送服务。然后我准备用linux的crontab命令来实现。
一、crontab命令简介。
crontab是linux系统自带命令,用于设置周期性被执行的指令,该命令从标准输入设备读取指令(比如我用的txt文件),然后存放在crontab文件中,实现的功能就是,每隔多少秒来访问php页面。命令简介不赘述,网上一大堆。
二、crontab使用说明。
crontab应该是每个用户拥有一个,同时操作系统保存一个针对整个系统的crontab,其实我理解是root用户的。
语法:crontab [-e [UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ] 没研究这是什么,抄过来 o(╯□╰)o。
其实常用命令是:crontab -l列出目前的时程表,其实就是几个命令在运行。-r 删除,是直接全部删除了。-e文字编辑器来设定时程表,默认vi。-v用户cron作业的状态。还有最重要的是启动 : crontab 文件名 运行的规则跟启动时间什么的都要写在这个文件里面。
编辑时候直接写入 crontab -e 。然后 /etc/init.d/crond restart 重启下
/etc/init.d/crond restart tail -f /var/log/cron 用来查看日志
三、crontab的格式。
这个是比较重要的,文件我直接一个txt文件,里面的要编写你的逻辑。
* * * * * (cd /home/foobar/pushNotification;php send_notification.php > /dev/null 2>&1 >> /tmp/pn_send & sleep 30; ./send_notification.php > /dev/null 2>&1 >> /tmp/pn_send) # Send Push Notification
* * * * * (cd /home/foobar/pushNotification;php all_send_notification.php > /dev/null 2>&1 >> /tmp/pn_all_send) # All Send Push Notification
* * * * * (cd /home/foobar/pushNotification;php feedback.php > /dev/null 2>&1 >> /tmp/pn_feedback) # Feedback Token
把我的粘贴上来,举例讲一下。
1、前面的五个*不是没意义的,而是意义重大。分别是:分钟,小时,日,月,星期(0 -- 6,0星期天)也就你这个程序要执行的时间。
2、第六行,要运行的命令。
30 21 * * * /usr/local/apache/bin/apachectl restart //这个意思每晚的21:30重启apache
0,30 18-23 * * * /usr/local/apache/bin/apachectl restart//例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
3、我的命令的意思是,首先进入我的php项目目录。然后以命令方式打开
all_send_notification.php
然后将执行的结果写入
/tmp/pn_all_send这个文件里面
> /dev/null 2>&1 >> // > 代表重定向到哪里, /dev/null 代表空设备文件, 2> 表示stderr 标准错误, & 表示同于的意思, 2>&1 表示2的输出重定向等同于1. 1 表示stdout标准输出,系统默认值是1。因此,>/dev/null 2>&1也可以写成“1> /dev/null 2> &1”
那么本文标题的语句执行过程为:
1>/dev/null :首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 :接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
说清楚了吗,大家理解下吧!
顺便对比述说下这么用的好处!
最常用的方式有:
command > file 2>file 与command > file 2>&1
它们 有什么不同的地方吗?
首先command > file 2>file 的意思是将命令所产生的标准输出信息,和错误的输出信息送到file 中.command > file 2>file 这样的写法,stdout和stderr都直接送到file中, file会被打开两次,这样stdout和stderr会互相覆盖,这样写相当使用了FD1和FD2两个同时去抢占file 的管道。
而command >file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容。
从IO效率上,前一条命令的效率要比后面一条的命令效率要低,所以在编写shell脚本的时候,较多的时候我们会command > file 2>&1 这样的写法。
关于crontab就写到这里,我不是专业做运维,对于shell脚本也只是略懂。继续苦逼当程序。
总结
- 查看当前用户的cron配置,使用 crontab -l
- 编辑当前用户的cron配置,使用 crontab -e
- 删除当前用户的cron配置,使用 crontab -r
- 以root身份查看/编辑/删除某用户的cron配置,在命令后加上 -u USERNAME
- 配置系统级的任务,编辑 /etc/crontab 文件