2017-12-29 45 views
0

우분투 서버에서 Node.JS로 실행되는 두 개의 불일치 봇 (app.js 및 activity.js)이 있습니다. 내가 직면하고있는 문제는 두 파일이 모두 실행 중일 때 activity.js 만 파일을 수정할 수 있다는 것입니다. 파일은 users.JSON입니다. app.js의 코드 :두 개의 Node.JS 스크립트가 하나의 .JSON 파일에서 읽고 쓰지만 첫 번째 스크립트는 파일을 수정할 수 없습니다.

const Discord = require("discord.js") 
var moment = require("moment") 
var data_users = fs.readFileSync('/home/discord/activity_bot/users.json', 'utf-8') 
var arxeio = JSON.parse(data_users) 
... 
for (var i in duos) { 
    if (arxeio[duos[i].username]) { 
    console.log(`before: ` + arxeio[duos[i].username]) 
    arxeio[duos[i].username]+=15 
    console.log(`after: ` + arxeio[duos[i].username]) 
    } else { 
    arxeio[duos[i].username]=15 
    } 
} 
fs.writeFile('/home/discord/activity_bot/users.json', JSON.stringify(arxeio, null, 2), 'utf-8', function(err) { 
    if (err) throw err 
    console.log('entered') 
}) 

그리고 Activity.js에 대한 코드는 다음과 같습니다

const Discord = require("discord.js"); 
var fs = require('fs'); 
var data = fs.readFileSync('/home/discord/activity_bot/users.json', 'utf-8') 
var arxeio = JSON.parse(data) 
... 
var kuklos = setInterval(function(done) { 
     client.guilds.get('323921290543235073').channels.forEach(function(kanali, kanaliID) { 
      if (kanali.type === 'voice' && !kanali.name.includes("AFK")) { 
      kanali.members.forEach(function(melos, melosID) { 
       let xristis = melos.user.username; 
       if (arxeio[xristis]) { 
       arxeio[xristis]++; 
       } else { 
       arxeio[xristis] = 1 
       } 
       fs.writeFile('/home/discord/activity_bot/users.json', JSON.stringify(arxeio, null, 2), 'utf-8', function(err) { 
        if (err) throw err 
       }) 
      }) 
      } 
     }) 
     }, 60*1000); 

, 듀오는 회원의 테이블입니다. Activity.js가 실행되고 있지 않을 때 문제가 App.js의 fs.writeFile이라는 결론을 내 렸습니다. activity.js가 실행 중일 때 "입력 됨"이 실제로 app.js에 기록되지만 파일은 수정되지 않습니다. 또한 + = 명령 위와 아래의 두 명령은 수정되었지만 users.Json 파일에 저장되지 않았 음을 보여줍니다. 어떤 생각이 탓일 것인가? (내 skillz을 제외하고 : P)

+0

fs.close() 또는 fs를 O_NONBLOCK 모드로 사용해 보셨습니까? – uglypointer

+0

나는 그것을 시도하고 알려 드리겠습니다! 감사! –

답변

0

나는 귀하의 애플 리케이션 디자인에 있다고 생각합니다. 파일을 두 프로세스와 절대적으로 공유 할 수 있지만 항상 동시성 문제가 있습니다.

이런 종류의 경우 행/테이블을 잠그는 데이터베이스를 사용해야합니다.

+0

그것은 왜 내가 DB를 사용하고 싶지 않은 작은 파일입니다. 그러나 내가 이것을 해결하지 않으면 내가 할 것이다. 고마워요 어쨌든 :) –

+0

나는 sqlite를 사용했고 코드가 두 배로 늘어 났지만 제대로 작동했습니다 : P. 문제는 앱 디자인이 아닌 경쟁 조건이었습니다. 동일한 파일을 사용하는 두 개의 스크립트는 경쟁 조건으로 끝납니다. –