模板问题工具化
线上基于 Yii2 的 PHP 项目 需要跑很多后台进程,用来处理异步任务,如
IM通知、BPM、事件消费。
针对这些后台任务总结分析,发现如下四个特点:
- 定时执行
- 拉起异常推出的常驻进程
- 拉起时异常推出的日志记录到文件
- 路径固定:部署的代码、日志、缓存、配置等
- Yii2 Command 程序运行命令格式固定
- 结束常驻进程运行的程序
基于此提炼出如下 cron 命令模板
1 2 3
| 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("/", "-")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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 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);
}
|
1 2 3 4 5
| ➜ 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
相关文章: 琐事、工具