- 浏览: 583454 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (365)
- Tomcat调优 (2)
- Apache Http (20)
- Webserver安装 (5)
- Linux安装 (28)
- Linux常用命令 (17)
- C语言及网络编程 (10)
- 文件系统 (0)
- Lucene (12)
- Hadoop (9)
- FastDFS (8)
- 报表 (0)
- 性能测试 (1)
- JAVA (18)
- CSharp (3)
- C++ (38)
- BI (0)
- 数据挖掘 (0)
- 数据采集 (0)
- 网址收集整理 (3)
- Resin (0)
- JBoss (0)
- nginx (0)
- 数据结构 (1)
- 随记 (5)
- Katta (1)
- Shell (6)
- webservice (0)
- JBPM (2)
- JQuery (6)
- Flex (41)
- SSH (0)
- javascript (7)
- php (13)
- 数据库 (6)
- 搜索引擎排序 (2)
- LVS (3)
- solr (2)
- windows (1)
- mysql (3)
- 营销软件 (1)
- tfs (1)
- memcache (5)
- 分布式搜索 (3)
- 关注的博客 (1)
- Android (2)
- clucene (11)
- 综合 (1)
- c c++ 多线程 (6)
- Linux (1)
- 注册码 (1)
- 文件类型转换 (3)
- Linux 与 asp.net (2)
- perl (5)
- coreseek (1)
- 阅读器 (2)
- SEO (1)
- 励志 (1)
- 在线性能测试工具 (1)
- yii (7)
- 服务器监控 (1)
- 广告 (1)
- 代理服务 (5)
- zookeeper (8)
- 广告联盟 (0)
- 常用软件下载 (1)
- 架设自已的站点心得 (0)
最新评论
-
terry07:
java 7 用这个就可以了 Desktop desktop ...
关于java Runtime.getRunTime.exec(String command)的使用 -
HSINKING:
怎么设置打开的dos 窗口是指定的路径下
关于java调用bat文件,不打开窗口 -
liubang201010:
hyperic hq更多参考资料,请访问:http://www ...
hyperic-hq -
^=^:
STDIN_FILENO是unistd.h中定义的一个numb ...
深入理解dup和dup2的用法 -
antor:
留个记号,学习了
[转]用java流方式判断文件类型
from http://micate.me/centos-php-crontab-script-manage-shell.note
« javascript dialog 对话框的问题总结MySQL的表分区 »CentOS 下管理自定义 PHP 计划任务代码的守护进程脚本
Version: 2011-12-05 Print Published at 02:45 in 技术. 2 Comments
Tags: centos, php, 计划任务.
有需求想实现比 crontab 更频繁一点的计划任务,折腾一通之后,写下这个脚本,目前在 CentOS 6 下测试没有问题:
ChangeLog
2011.12.05
添加 PHP 执行用户设置,用以适应如在计划任务中执行生成文件操作时的文件权限问题,未完成;
2011.12.02
建立文档;
Shell 代码
#!/bin/bash
#
# chkconfig: 35 90 12
# description: Queue Daemon
#
# Get function from functions library
. /etc/init.d/functions
# PHP 访问路径,如果 PHP 是编译安装则需要修改
php_path="/usr/bin/php"
# PHP 执行用户名
# Nginx 环境下常见为 nginx 或 www,
# Apapche 环境下常见为 php 或 apache
# 用在某些时候需要在计划任务中生成文件时文件权限不正确的问题
php_user=nginx
# 要管理的 PHP 计划任务脚本
# 该目录下必须都是 PHP 可执行代码文件
queue_path="/www/micate.dev/crontab/"
# PHP 计划任务执行日志保存路径
# 默认以 脚本名.log 的方式存储
log_path="/var/log/queue/"
# 守护进程 PID 路径
pid_path="/var/run/queued.pid"
# 守护进程在启动退出时的提示名称
prog="Queued"
# Start the service
start() {
echo -n $"Starting $prog: "
if [ -f $pid_path ]; then
echo -n "pid "$pid_path" exists."
failure
echo
return 0
fi
if [ ! -d $log_path ]; then
mkdir -p $log_path
fi
queues=$(ls $queue_path)
for queue in $queues
do
# TODO sudo -u $php_user
nohup $php_path $queue_path$queue 1>>$log_path$queue.log 2>/dev/null &
retval=$?
if [ ! $retval -eq 0 ]; then
echo -n $queue" init failed."
failure
echo
return 0
fi
echo $! >> $pid_path
done
success
echo
return $retval
}
# Stop the service
stop() {
echo -n $"Stopping $prog: "
if [ ! -f $pid_path ]; then
echo -n "pid "$pid_path" not exists."
failure
echo
return 0
fi
queues=$(cat $pid_path)
for queue in $queues
do
kill -9 $queue 1>/dev/null 2>&1
retval=$?
if [ ! $retval -eq 0 ]; then
echo -n $queue" stop failed."
failure
echo
return 0
fi
done
rm -f $pid_path
success
echo
return $retval
}
### main logic ###
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
使用方法
1.根据实际情况,按照上面的配置提示,修改相应配置,并保存为 /etc/init.d/queued(建议以这样的方式命名,注意路径必须是 /etc/init.d/)
2.在 Shell 里面执行:
# 为守护进程脚本增加执行权限
chmod +x /etc/init.d/queued
# 设置开机启动
chkconfig queued on守护进程设置完成。
3.在上面配置的目录中添加测试 PHP 计划任务脚本,如 hello.php:
<?php
// 注意,推荐使用死循环的方式
// 这个守护进程脚本也是以这个思路来写的
while (true)
{
// 做点事情
// 注意,这里的输出会记录到日志文件里面,可以输出些有用的信息来帮助排除问题
echo "hello from queued.\n";
// 延迟时间,建议用秒级别的,usleep ... 你确定么?
sleep(20);
}4.好了,来运行看看:
/etc/init.d/queued start查看下日志目录:
less /var/log/queue/hello.php.log收工。
其他的,比如:
# 停止所有计划任务
/etc/init.d/queued stop
# 重新启动守护进程脚本
/etc/init.d/queued restart注意事项
1.由于是基于死循环的方式实现,如果代码里面有引入基础文件后的死循环操作,那依赖基础文件中的变量的代码部分,要注意调整,举例来说:
<?php
define('START_TIME', microtime(true));
// 假如这个文件里面定义了 TIME 常量,
// 以备后面的代码获取当前时间用
//(避免一次请求中多次调用 time() 函数带来的性能损失)
require '../init.php';
$interval = value(config('mail'), 'interval', 20);
$interval_size = value(config('mail'), 'interval_size', 50);
while (true)
{
$queue = & factory::queue('mail');
// 这里的定时循环,用到了 TIME 常量
// 比如记录执行时间,甚至用 TIME 常量做查询条件
echo $queue->interval($interval_size);
sleep($interval);
}看了上面的注释,问题就比较明显了。
当以普通用户请求过去时,由于是正常流程,每次请求发起后,TIME 都会重新赋予正确的当前时间;
但当使用死循环后,以后的每次 interval 用到的时间都会是 该计划任务脚本启动时间。
这就是问题,需要注意和调整。
2.修改和添加计划任务后,需要重新启动守护进程,方法上面已经介绍了,restart 就可以。
3.担心日志过多?设置下日志自动滚动切割吧:
# 在 /etc/logrotate.d/ 目录下建立 queued 文件
vim /etc/logrotate.d/queued
# 输入如下的信息,路径之类的要和你自己设置的保持一致
/var/log/queue/*log {
daily
rotate 10
missingok
notifempty
sharedscripts
compress
postrotate
/etc/init.d/queued restart > /dev/null 2>/dev/null || true
endscript
}保存文件,完成。
这样,每天日志会自动滚动切割,最多保留 10 个日志文件(未验证这个步骤... 如有问题请反馈)。
4.进程崩溃、服务器断电...导致守护进程起不来或停不了了?
直接 ps -ef | grep *** 关键词,看是否有在运行的 PHP 计划任务代码,kill 掉,然后删除 pid 文件,重新启动即可。
更多...
其实 crontab 也有对应的解决方法:
# 打开 crontab 编辑界面
crontab -e
# 输入类似的设置
* * * * * /bin/date
* * * * * sleep 20; /bin/date
* * * * * sleep 40; /bin/date思想就是... 同时添加多个任务,然后每个之前以适当的延时隔离开,就是说每分钟会有 N 个程序被触发,但会逐个延迟执行,也是个不错的解决思路。
相关文章:
■在 Windows 主机上定时备份远程 VPS(CentOS) 数据
■在 CentOS 6 环境中配置 nginx + php-fpm + mysql
■Schtasks 计划任务参数详解
■关闭 selinux 和使其立即生效
■CentOS 5 修改系统时区
2 Responses to “CentOS 下管理自定义 PHP 计划任务代码的守护进程脚本”
Feed for this Entry Trackback Address
--------------------------------------------------------------------------------
蛮-com
2011/12/05 at 13:21
死循环的php-fpm会不会有问题啊啊啊?
Reply
龙猫
2011/12/05 at 16:27
@杨哥(http://www.yanghengfei.com/) 提到,死循环中的 PHP 是不会释放变量的内存的,一直循环下去,如果代码上稍不注意,有可能... 内存爆掉。
但这个跟 PHP-FPM 没关系吧... 调用的是 /usr/bin/ 下的 php,PHP-FPM 在 /usr/sbin/ 下,和 Nginx 木有交互哦。
准备来个 V2,用 shell 死循环代替 PHP 死循环,但我觉得问题会是... 循环时间过短导致下次循环开始时,上次的还没执行完。判断进程名称?写出来再说吧。
Reply
« javascript dialog 对话框的问题总结MySQL的表分区 »CentOS 下管理自定义 PHP 计划任务代码的守护进程脚本
Version: 2011-12-05 Print Published at 02:45 in 技术. 2 Comments
Tags: centos, php, 计划任务.
有需求想实现比 crontab 更频繁一点的计划任务,折腾一通之后,写下这个脚本,目前在 CentOS 6 下测试没有问题:
ChangeLog
2011.12.05
添加 PHP 执行用户设置,用以适应如在计划任务中执行生成文件操作时的文件权限问题,未完成;
2011.12.02
建立文档;
Shell 代码
#!/bin/bash
#
# chkconfig: 35 90 12
# description: Queue Daemon
#
# Get function from functions library
. /etc/init.d/functions
# PHP 访问路径,如果 PHP 是编译安装则需要修改
php_path="/usr/bin/php"
# PHP 执行用户名
# Nginx 环境下常见为 nginx 或 www,
# Apapche 环境下常见为 php 或 apache
# 用在某些时候需要在计划任务中生成文件时文件权限不正确的问题
php_user=nginx
# 要管理的 PHP 计划任务脚本
# 该目录下必须都是 PHP 可执行代码文件
queue_path="/www/micate.dev/crontab/"
# PHP 计划任务执行日志保存路径
# 默认以 脚本名.log 的方式存储
log_path="/var/log/queue/"
# 守护进程 PID 路径
pid_path="/var/run/queued.pid"
# 守护进程在启动退出时的提示名称
prog="Queued"
# Start the service
start() {
echo -n $"Starting $prog: "
if [ -f $pid_path ]; then
echo -n "pid "$pid_path" exists."
failure
echo
return 0
fi
if [ ! -d $log_path ]; then
mkdir -p $log_path
fi
queues=$(ls $queue_path)
for queue in $queues
do
# TODO sudo -u $php_user
nohup $php_path $queue_path$queue 1>>$log_path$queue.log 2>/dev/null &
retval=$?
if [ ! $retval -eq 0 ]; then
echo -n $queue" init failed."
failure
echo
return 0
fi
echo $! >> $pid_path
done
success
echo
return $retval
}
# Stop the service
stop() {
echo -n $"Stopping $prog: "
if [ ! -f $pid_path ]; then
echo -n "pid "$pid_path" not exists."
failure
echo
return 0
fi
queues=$(cat $pid_path)
for queue in $queues
do
kill -9 $queue 1>/dev/null 2>&1
retval=$?
if [ ! $retval -eq 0 ]; then
echo -n $queue" stop failed."
failure
echo
return 0
fi
done
rm -f $pid_path
success
echo
return $retval
}
### main logic ###
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
exit 0
使用方法
1.根据实际情况,按照上面的配置提示,修改相应配置,并保存为 /etc/init.d/queued(建议以这样的方式命名,注意路径必须是 /etc/init.d/)
2.在 Shell 里面执行:
# 为守护进程脚本增加执行权限
chmod +x /etc/init.d/queued
# 设置开机启动
chkconfig queued on守护进程设置完成。
3.在上面配置的目录中添加测试 PHP 计划任务脚本,如 hello.php:
<?php
// 注意,推荐使用死循环的方式
// 这个守护进程脚本也是以这个思路来写的
while (true)
{
// 做点事情
// 注意,这里的输出会记录到日志文件里面,可以输出些有用的信息来帮助排除问题
echo "hello from queued.\n";
// 延迟时间,建议用秒级别的,usleep ... 你确定么?
sleep(20);
}4.好了,来运行看看:
/etc/init.d/queued start查看下日志目录:
less /var/log/queue/hello.php.log收工。
其他的,比如:
# 停止所有计划任务
/etc/init.d/queued stop
# 重新启动守护进程脚本
/etc/init.d/queued restart注意事项
1.由于是基于死循环的方式实现,如果代码里面有引入基础文件后的死循环操作,那依赖基础文件中的变量的代码部分,要注意调整,举例来说:
<?php
define('START_TIME', microtime(true));
// 假如这个文件里面定义了 TIME 常量,
// 以备后面的代码获取当前时间用
//(避免一次请求中多次调用 time() 函数带来的性能损失)
require '../init.php';
$interval = value(config('mail'), 'interval', 20);
$interval_size = value(config('mail'), 'interval_size', 50);
while (true)
{
$queue = & factory::queue('mail');
// 这里的定时循环,用到了 TIME 常量
// 比如记录执行时间,甚至用 TIME 常量做查询条件
echo $queue->interval($interval_size);
sleep($interval);
}看了上面的注释,问题就比较明显了。
当以普通用户请求过去时,由于是正常流程,每次请求发起后,TIME 都会重新赋予正确的当前时间;
但当使用死循环后,以后的每次 interval 用到的时间都会是 该计划任务脚本启动时间。
这就是问题,需要注意和调整。
2.修改和添加计划任务后,需要重新启动守护进程,方法上面已经介绍了,restart 就可以。
3.担心日志过多?设置下日志自动滚动切割吧:
# 在 /etc/logrotate.d/ 目录下建立 queued 文件
vim /etc/logrotate.d/queued
# 输入如下的信息,路径之类的要和你自己设置的保持一致
/var/log/queue/*log {
daily
rotate 10
missingok
notifempty
sharedscripts
compress
postrotate
/etc/init.d/queued restart > /dev/null 2>/dev/null || true
endscript
}保存文件,完成。
这样,每天日志会自动滚动切割,最多保留 10 个日志文件(未验证这个步骤... 如有问题请反馈)。
4.进程崩溃、服务器断电...导致守护进程起不来或停不了了?
直接 ps -ef | grep *** 关键词,看是否有在运行的 PHP 计划任务代码,kill 掉,然后删除 pid 文件,重新启动即可。
更多...
其实 crontab 也有对应的解决方法:
# 打开 crontab 编辑界面
crontab -e
# 输入类似的设置
* * * * * /bin/date
* * * * * sleep 20; /bin/date
* * * * * sleep 40; /bin/date思想就是... 同时添加多个任务,然后每个之前以适当的延时隔离开,就是说每分钟会有 N 个程序被触发,但会逐个延迟执行,也是个不错的解决思路。
相关文章:
■在 Windows 主机上定时备份远程 VPS(CentOS) 数据
■在 CentOS 6 环境中配置 nginx + php-fpm + mysql
■Schtasks 计划任务参数详解
■关闭 selinux 和使其立即生效
■CentOS 5 修改系统时区
2 Responses to “CentOS 下管理自定义 PHP 计划任务代码的守护进程脚本”
Feed for this Entry Trackback Address
--------------------------------------------------------------------------------
蛮-com
2011/12/05 at 13:21
死循环的php-fpm会不会有问题啊啊啊?
Reply
龙猫
2011/12/05 at 16:27
@杨哥(http://www.yanghengfei.com/) 提到,死循环中的 PHP 是不会释放变量的内存的,一直循环下去,如果代码上稍不注意,有可能... 内存爆掉。
但这个跟 PHP-FPM 没关系吧... 调用的是 /usr/bin/ 下的 php,PHP-FPM 在 /usr/sbin/ 下,和 Nginx 木有交互哦。
准备来个 V2,用 shell 死循环代替 PHP 死循环,但我觉得问题会是... 循环时间过短导致下次循环开始时,上次的还没执行完。判断进程名称?写出来再说吧。
Reply
发表评论
-
CentOS 6 架設 apache + php + mysql
2012-02-17 15:29 14531.Download Centos 6 Minimail CD ... -
新_CentOS 6下搭建Apache+MySQL+PHP+SSL
2012-02-17 15:22 1218CentOS 6下搭建Apache+MySQL+PHP+SSL ... -
CentOS 5.5+Apache+PHP+MySQL 5部署笔记(更新)
2012-02-17 14:54 1667[日期:2011-05-06] 来源:Linux社区 作者: ... -
linux下apache2.2性能优化和安装_重要
2011-06-05 11:33 25952011年02月17日 星期四 23:31转载自 macaqu ... -
定制Apache的防盗链模块 Mod_perl<1>
2011-05-28 12:20 1425from http://bbs.chinaunix.net/v ... -
详细解析用Squid实现反向代理的方法
2011-05-06 18:04 1000from http://tech.ccidnet.com/a ... -
apache与Tomcat整合配置文档[windows].txt
2011-04-06 11:20 12851\下载的软件(可以从此网址下载得到http://www.a ... -
apache 防盗链
2011-03-27 23:11 18312010-09-25 22:09apche有rewrite_m ... -
apache modperl防盗链
2011-03-27 23:02 11602010-09-25 21:41定制Apache的 ... -
很好的一个运维博客
2011-01-26 17:05 1023陈子的学前班笔记(很值得一看) http://blog.si ... -
apache防盗链(mod_perl试用二)
2011-01-26 17:03 943引用(2010-05-27 00:07:01) 转 ... -
apache 防盗链,限带宽和连接数
2011-01-26 16:59 1131防盗链原理: http标准协议中有专门的字段记录referer ... -
Apache 防盗链(Apache Anti-Leech)技术的简单实现
2011-01-26 16:49 1044引用. 使用 rewrite 技术实现 Apache 防盗链 ... -
Linux上Apache反向代理之ProxyPass IIS网站总结
2010-08-19 13:53 2221Linux上Apache反向代理之ProxyPass IIS网 ... -
Apache的ProxyPass指令详解
2010-08-19 13:33 2144文章分类:JavaEye 关键字: ... -
Windows下安装多个Apache服务
2010-08-18 09:59 1302安装好Apache以后,可以 ... -
apachemod_proxy 集群
2010-07-06 10:58 810下面以在apachemod_proxy下做的反向代理负载均衡为 ... -
Apache RewriteRule的标志一览
2010-06-30 11:38 1115也可请参考下面网址 http://res.phpchina.c ... -
apache2.2 tomcat6.0 负载均衡集群整理配置
2010-06-28 15:24 2047worker.list=controller,tomcat1, ...
相关推荐
本话题将详细介绍如何在CentOS 7上封装自定义镜像,并包含初始化脚本和常用软件合集。 首先,我们需要准备一个干净的CentOS 7系统,确保所有更新都已经安装并且没有任何不必要的软件和服务。这可以通过运行`yum ...
Centos7-jar守护脚本
资料包括:Linux 字符界面操作基础,Linux 字符界面操作进阶,Shell 脚本编程,TCPIP 网络配置,安装 CentOS,包管理与系统更新,备份与恢复,磁盘管理和 LVM 管理,守护进程管理,文件系统管理,系统监控,系统引导...
cron是一个后台守护进程,用于执行预定义的任务,这些任务通常被称为计划任务或定时任务。在CentOS中,配置和管理cron任务对于自动化日常维护和系统操作至关重要。本文将详细介绍如何在Linux(CentOS)中配置cron计划...
CentOS 8 开机启动Nginx脚本
制作自定义CentOS系统是一项复杂而重要的任务,它允许用户根据特定需求定制操作系统,包括选择必要的软件包、配置参数以及优化系统性能。以下是一步步详细解释如何制作自定义CentOS系统的步骤: 首先,你需要进入...
在CentOS7中,系统服务管理发生了重大变化,从之前的/etc/init.d启动脚本方式转变为使用systemd。systemd提供了一种更高效、更简洁的方式来管理服务,包括启动、重启和停止。对于IT专业人士,尤其是Oracle数据库管理...
本篇将详细介绍如何在CentOS系统下,利用一键部署脚本安装和配置LNMP环境。 一、LNMP环境介绍 LNMP是Linux、Nginx、MySQL和PHP的缩写,它们分别是: 1. Linux:开源操作系统,提供稳定和高效的服务器平台。 2. ...
本文档提供了一份 CentOS 7 系统优化脚本,该脚本旨在简化系统管理员的工作,减少重复劳动,使管理员能够更快速地完成系统优化任务。 系统优化菜单 该脚本提供了一个菜单式的系统优化界面,管理员可以根据需要选择...
手动指定zookeeper和kafka的bin目录、配置文件以及需要添加定时任务的周期几个参数后,执行当前脚本,脚本会自动添加定时任务并开始监控zookeeper及kafka进程,如果进程不存在则重启并放入后台,存在则等待下一次...
在Linux系统中,CentOS 7是一个广泛应用的服务器操作系统,对于系统管理员来说,配置开机自启动脚本是一项基本任务,可以确保系统启动时自动运行特定的服务或程序。这里我们将详细探讨如何在CentOS 7中设置开机自...
centos 下安装 theano的脚本
搜集的几个安全加固脚本,文档列举常用命令,并编写自己的安全加固脚本,Centos6.9验证。
在Linux系统中,尤其是像CentOS这样的发行版,有时候我们需要在服务器启动时自动运行特定的脚本,以完成一些必要的初始化任务或者持续的服务。本文将详细介绍如何在CentOS中实现开机启动自定义脚本。 首先,你需要...
总之,配置PHP+nginx+MySQL环境在CentOS7上是一项基础但关键的任务,自动脚本能极大地提高效率。通过理解每个组件的作用和安装过程,你不仅能快速部署环境,还能更好地维护和优化你的Web服务。记得定期更新和加固你...
centos系统下的memcached启动脚本
本文将深入探讨如何在CentOS环境下创建和使用自动化测试脚本,以及相关知识点。 一、基础环境准备 在开始编写自动化脚本之前,确保你的CentOS系统已经安装了必要的基础工具,例如bash shell、grep、sed、awk、curl...
当出现多个springboot项目需要启动的时候,可以使用脚本启动的方式。这在springcloud项目的开发测试阶段尤为有用。以下展示启动脚本示例,过程中遇到的问题,以及相关的解决办法。 1、启动脚本 #!/bin/sh export ...
在Linux系统中,尤其是CentOS 7.9这样的企业级操作系统上,离线安装PHP环境依赖是一项关键任务,尤其在没有互联网连接或者网络环境受限的情况下。这篇文章将详细讲解如何在CentOS 7.9上离线安装PHP环境,以及所需的...
centos 一键php开发环境,包括代码编译等等,适合centos 6.4及以上系统