# timer
**Repository Path**: joker_mm/timer
## Basic Information
- **Project Name**: timer
- **Description**: No description available
- **Primary Language**: NodeJS
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-05-20
- **Last Updated**: 2021-07-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
* 安装 npm i
或者使用淘宝镜像
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm i
* 全局安装pm2
npm install pm2 -g
* pm2 启动命令
pm2 start pm2Start.json --env dev(这个dev是环境变量)
查看日志 pm2 logs
查看内存 pm2 monit
平滑重启 pm2 reload async
重启 pm2 restart async
删除日志 pm2 flush
pm2日志默认存储在 /home/username/.pm2/logs
pm2 startup,这个命令会在系统 /etc/systemd/system/ 路径下生成一个 pm2-root.service 文件用来开机启动 pm2 服务。
pm2 save, 保存当前 pm2 运行的各个应用保存到 /root/.pm2/dump.pm2 下,开机重启时读取该文件中的内容启动相关应用。
### pm2 日志文件过大不分割和自动删除解决
* 安装插件 pm2 install pm2-logrotate
* 直接看配置,也可以通过指令pm2 conf pm2-logrotate来查看详细的配置
#### 安装之后默认配置
* $ pm2 set pm2-logrotate:max_size 10M 单个日志文件的大小
* $ pm2 set pm2-logrotate:retain 30 保留文件个数,多余自动删除
* $ pm2 set pm2-logrotate:compress false 是否通过gzip压缩日志
* $ pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss 日志文件名中的日期格式
* $ pm2 set pm2-logrotate:workerInterval 30 设置启动几个工作进程监控日志尺寸,最小为1
* $ pm2 set pm2-logrotate:rotateInterval 0 0 * * * 设置强制分割,默认值是0 0 * * *,意思是每天晚上0点分割,这个足够了个人觉得
* $ pm2 set pm2-logrotate:rotateModule true 把pm2本身的日志也进行分割
### 配置说明
配置项 | 简介
---- | -----
max_size | 单个日志文件的大小
retain | 保留文件个数,多余自动删除
compress | 是否通过gzip压缩日志
dateFormat | 日志文件名中的日期格式
workerInterval | 设置启动几个工作进程监控日志尺寸,最小为1
rotateInterval | 设置强制分割,默认值是0 0 * * *,意思是每天晚上0点分割,这个足够了个人觉得
rotateModule | 把pm2本身的日志也进行分割
* 项目日志文件存在 ./logs/ 目录下面
### 设置定时任务
#### 请求地址:http://192.168.8.233:9015/timer/set
#### 请求参数
参数描述 | 参数名 | 类型 | 是否必填 | 备注
---- | ----- | ------ | ----- | ----
创建时间 | create_time | string | 是 | 格式(YYYY-mm-dd HH:mm:ss)
回调地址 | notify_url | string | 是 |
请求类型 | type | int | 是 | 1 单次 2 每天 3 每周 4 每月
触发时间 | trigger_time | int | 是 | 请求类型为"1"时则为时间格式(YYYY-mm-dd HH:mm:ss)
回调数据 | data | string | 是 | json字符串
签名 | sign | string | 是 | 查看签名规则
#### 请求类型不为"1"时请求格式为 * * * * * *
* * * * * *
┬ ┬ ┬ ┬ ┬ ┬
│ │ │ │ │ |
│ │ │ │ │ └ day of week (0 - 7) (0 or 7 is Sun)
│ │ │ │ └───── month (1 - 12)
│ │ │ └────────── day of month (1 - 31)
│ │ └─────────────── hour (0 - 23)
│ └──────────────────── minute (0 - 59)
└───────────────────────── second (0 - 59, OPTIONAL)
秒 分 时 日 月 周
30 * * * * * 代表每分钟30秒执行
30 1 * * * * 代表每小时1分30秒执行,依此类推
#### 回调回执:业务操作完成之后请返回小写 success 否则重发(第一次0s,第二次20s,第三次40s,第四次80s,第五次160s,五次之后不会进行发送)
#### 你修改数据的时候重新设置定时任务记得调用关闭定时接口,关闭之前的定时任务
#### 返回参数
参数描述 | 参数名 | 类型 | 是否必填 | 备注
---- | ----- | ------ | ----- | ----
请求状态 | code | int | 是 | 200 请求成功 -200 请求失败
返回描述 | msg | string | 是 |
返回参数 | data | array | 是 |
定时器ID | data.id | string | 是 | 关闭定时器时需要
### 关闭定时任务
#### 请求地址:http://192.168.8.233:9015/timer/cancel
#### 请求参数
参数描述 | 参数名 | 类型 | 是否必填 | 备注
---- | ----- | ------ | ----- | ----
创建时间 | create_time | string | 是 | 格式(YYYY-mm-dd HH:mm:ss)
回调数据 | id | string | 是 | 定时器ID
签名 | sign | string | 是 | 查看签名规则
### 签名
1. 参数按照A-Z排序(去除空参数和sign参数)得到 let A = k1=v1&k2=v2……
2. 拼接密钥 let B = A+"&key="+key 得到 B
3. 进行MD5运算 let sign = crypto.createHash('md5').update(B).digest('hex');
4. 赋值给sign