利用工具生成 dcron 任务
模板问题工具化
线上基于 Yii2 的 PHP 项目 需要跑很多后台进程,用来处理异步任务,如 IM通知、BPM、事件消费。
针对这些后台任务总结分析,发现如下四个特点:
- 定时执行
- 拉起异常推出的常驻进程
- 拉起时异常推出的日志记录到文件
- 路径固定:部署的代码、日志、缓存、配置等
- Yii2 Command 程序运行命令格式固定
- 结束常驻进程运行的程序
基于此提炼出如下 cron 命令模板
ps aux|grep \"php /opt/www/htdocs/{}/yii {}\"|grep -v 'grep' || (php /opt/www/htdocs/{}/yii {} >> /opt/www/logs/{}/{} 2>&1 &
ps aux|grep \"php /opt/www/htdocs/{}/yii {}\"|grep -v 'grep'|awk '{{print $2}}' | xargs -n 1 kill -9
使用 rust 制造如下工具:
- module_id: 项目名称比如 force-holo
- yii_cmd: yii2 command 命令名字比如默认自带的 serve/index
因为文件名称中不能有 /
,故进行替换 cmd.replace("/", "-")
use std::env::{args};
fn main() {
if args().len() < 3 {
println!("Usage: {} module_id yii2_cmd", args().nth(0).expect("executable program"));
return;
}
let module_id = args().nth(1).expect("module_id");
let cmd = args().nth(2).expect("command");
// let kill = "ps aux|grep \"php /data0/www/htdocs/{}/yii {}\"|grep -v 'grep' || (php /data0/www/htdocs/{}/yii {} >> /data0/www/applogs/{}/{} 2>&1 &)";
let run_cmd = format!("ps aux|grep \"php /data0/www/htdocs/{}/yii {}\"|grep -v 'grep' || (php /data0/www/htdocs/{}/yii {} >> /data0/www/applogs/{}/{} 2>&1 &)",
module_id, cmd, module_id, cmd, module_id, cmd.replace("/", "-"));
println!("{}", run_cmd);
let kill_cmd = format!("ps aux|grep \"php /data0/www/htdocs/{}/yii {}\"|grep -v 'grep'|awk '{{print $2}}' | xargs -n 1 kill -9",
module_id, cmd);
println!("{}", kill_cmd);
}
➜ gen-dcron git:(master) cargo build
➜ gen-dcron git:(master) target/debug/gen-dcron force-holo serve/index
ps aux|grep "php /data0/www/htdocs/force-holo/yii serve/index"|grep -v 'grep' || (php /data0/www/htdocs/force-holo/yii serve/index >> /data0/www/applogs/force-holo/serve-index 2>&1 &)
ps aux|grep "php /data0/www/htdocs/force-holo/yii serve/index"|grep -v 'grep'|awk '{print $2}' | xargs -n 1 kill -9
项目地址:https://github.com/noname007/rust-demo-cron-cmd-for-yii2-proj
相关文章: 琐事、工具