做一次伸手党,代码被托管后,被守护进程执行了N次的问题。
发布于 7 年前 作者 beiyio 3562 次浏览 来自 问答

有一段很简单的代码,就是定时定执行一件事。 重点:部署后台是在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(‘不符合条件’) } }); } 虽然解决了问题,但是没有从根本上解决问题。以后可能要长期和这个平台打交道,希望能从根本上解决。做一次伸手党

8 回复

补充一句,服务器那边的人,只提供了这一种部署方式。并不知道具体是用什么启动的程序,所以什么在pm2中设置什么的,根本行不通。

没有人回答呢。。。。

第三次把自己的帖子推上去了!!!

这应该就是一个代码开机自启动的问题吧,你的代码是由别人的守护进程(看门狗)托管,为啥你的代码要跟着别人的主函数执行三次呢?确定这不是一个Bug设计吗?比起临时填bug,还不如看看怎么和写守护进程的人协商下

@xia123zheng 一个空的.js 这里面就一句hello 就回输出3次

@beiyio 不是你的代码的问题,是守护进程究竟是怎么管理你的代码的。不然不可能会启多个进程

@xia123zheng 是的,我的意思是说。能不能从代码就搞定。

有没有啥方法可以判断如果程序执行了,就不执行了

回到顶部