如何让PM2 Cron任务在72小时后自动停止并终止定时任务?
实现PM2 Cron任务72小时后自动终止的几种方案
我来给你几个实用的方法,不用手动执行pm2 delete就能让你的shoot-messages任务在72小时后自动停止并移除:
方案1:利用PM2的JavaScript API编写定时脚本
PM2自带Node.js API,能直接通过脚本控制进程生命周期,这是最灵活可靠的方式:
- 新建一个控制脚本
auto-stop.js,内容如下:
const pm2 = require('pm2'); // 72小时转换成毫秒:72*60*60*1000 = 259200000 const STOP_DELAY = 72 * 60 * 60 * 1000; pm2.connect((err) => { if (err) { console.error(err); process.exit(1); } // 设置定时器,72小时后执行停止删除操作 setTimeout(() => { pm2.delete('shoot-messages', (err) => { if (err) { console.error(`删除任务失败: ${err}`); } else { console.log('shoot-messages任务已成功停止并删除'); } pm2.disconnect(); // 断开PM2连接 process.exit(0); }); }, STOP_DELAY); });
- 启动你的Cron任务时,同时启动这个控制脚本(用PM2管理确保它后台运行):
pm2 start shoot-msg.sh --name shoot-messages -i 4 --cron "*/5 * * * *" pm2 start auto-stop.js --name auto-stop-shoot
这样auto-stop-shoot进程会在后台默默等待72小时,到时自动调用PM2 API删除目标任务。
方案2:在业务脚本中加入过期检查
如果不想额外启动Node.js进程,可以直接在你的shoot-msg.sh里加逻辑,每次任务触发时先检查是否超时:
- 启动任务时先记录启动时间到临时文件:
pm2 start shoot-msg.sh --name shoot-messages -i 4 --cron "*/5 * * * *" echo $(date +%s) > /tmp/shoot-messages-start-time.txt
- 修改
shoot-msg.sh,在开头加入超时判断:
#!/bin/bash # 读取任务启动时间 START_TIME=$(cat /tmp/shoot-messages-start-time.txt) CURRENT_TIME=$(date +%s) # 72小时对应的秒数:72*60*60=259200 MAX_RUN_TIME=259200 # 计算已运行时长 ELAPSED_TIME=$((CURRENT_TIME - START_TIME)) if [ $ELAPSED_TIME -ge $MAX_RUN_TIME ]; then # 超过72小时,停止并删除任务 pm2 delete shoot-messages # 清理临时文件 rm /tmp/shoot-messages-start-time.txt exit 0 fi # 下面是你原来的业务逻辑 echo "执行消息发送任务..." # 你的业务代码...
这样每次Cron触发任务时,脚本都会先检查是否超时,一旦超过72小时就自动删除任务,之后不会再执行。
方案3:用系统Cron配合PM2命令
如果场景简单,也可以直接用系统定时任务来触发删除操作:
- 先计算72小时后的具体时间,转换成Cron格式,比如现在是2024-05-20 14:30,72小时后是2024-05-23 14:30,对应的Cron表达式是
30 14 23 5 *,然后运行crontab -e添加:
30 14 23 5 * pm2 delete shoot-messages
如果需要动态计算时间(不用手动算),可以用脚本自动生成Cron任务:
# 计算72小时后的时间,转换成Cron格式(分 时 日 月 *) CRON_TIME=$(date -d "+72 hours" +"%M %H %d %m *") # 添加到系统Cron echo "$CRON_TIME pm2 delete shoot-messages" | crontab -
在启动PM2任务的同时运行这个脚本,就能自动设置好72小时后的删除指令。
这三个方案各有优劣:方案1最灵活可控,方案2无需额外进程,方案3依赖系统Cron适合简单场景,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者JAN
相关产品推荐
相关产品推荐

