有一段很简单的代码,就是定时定执行一件事。 重点:部署后台是在web上操作的,我只要负责提交代码。其他的一切不需要我都无法操作,我能在web上看到输出。 问题:那台机器上应该是使用了某种守护进程来维护我的代码,主函数会被执行三次,所以时间到了后,我的代码也被执行了3次。 失败的方案:开始的时候使用了cluster.isMaster来判断,如果是主进程才执行。结果失败。三次都是非主进程。 粗糙的方案:当时着急测试,没有办法,只能零时想了一个解决方案。思路就是创建一个本地文件。每次线程启动的时候都会去比较本地文件中的时间戳, 如果大于文件中的时间戳,将文件中的时间戳替换成新的。并且将线程名称替换为当时的时间戳,当执行发送代码的时候,判断下,当下执行的线程名称是否和 文件中的时间戳一致,如果一致,则执行,否则忽略。 代码如下:
let fs = require(‘fs’); // 引入fs模块 demo(); /** 读取文件*/ function demo(){ fs.readFile(’./data.txt’, function(err, data) { if (err) { throw err; } /** 文本时间*/ let docTime=data.toString()1; /* 当前时间*/ let timeNow=Date.now();
/** 如果当前时间大于文本时间*/
if(timeNow>docTime){
fs.writeFile('./data.txt', timeNow, function(err) {
if (err) {
throw err;
}
console.log('Saved.');
process.title=timeNow;
});
}
});
console.log('等待一分钟')
setTimeout(outInfo,6000)
}
function outInfo(){ fs.readFile(’./data.txt’, function(err, data) { if (err) { throw err; } /**文本时间 * */ let docTime=data.toString(); let title=process.title; if(docTime==title){ console.log(‘符合条件发送’) }else{ console.log(‘不符合条件’) } }); } 虽然解决了问题,但是没有从根本上解决问题。以后可能要长期和这个平台打交道,希望能从根本上解决。做一次伸手党
补充一句,服务器那边的人,只提供了这一种部署方式。并不知道具体是用什么启动的程序,所以什么在pm2中设置什么的,根本行不通。
没有人回答呢。。。。
第三次把自己的帖子推上去了!!!
这应该就是一个代码开机自启动的问题吧,你的代码是由别人的守护进程(看门狗)托管,为啥你的代码要跟着别人的主函数执行三次呢?确定这不是一个Bug设计吗?比起临时填bug,还不如看看怎么和写守护进程的人协商下
@xia123zheng 一个空的.js 这里面就一句hello 就回输出3次
@beiyio 不是你的代码的问题,是守护进程究竟是怎么管理你的代码的。不然不可能会启多个进程
@xia123zheng 是的,我的意思是说。能不能从代码就搞定。
有没有啥方法可以判断如果程序执行了,就不执行了