2017-12-19 10 views
0

일반적으로 존재하지 않는 파일 (예 : config.js)에서 fs.stat를 사용하여 nodejs 스크립트를 예상대로 실행하면 통과합니다. 콜백 오류; 그러나 systemd와 함께 deamon과 동일한 스크립트를 실행할 때 fs.stat는 오류를 제공하지 않으며 stat.isFile()이 true를 반환합니다.nodejs - fs.stat isFile()은 systemd에서 데몬/서비스로 실행될 때 항상 true를 반환합니다.

내가 잘못 했나요?
이것은 버그입니까?
이 기능입니까?

  • OS : 아치 리눅스
  • Nodejs : v9.3.0

server.js (내가 언급 스크립트) :

const fs = require('fs'); 

fs.stat('./config.json', (err, stat) => { 
    console.log('err:', err); 
    if (err) return; 
    console.log('stat:', stat); 
    console.log('stat.isFile():', stat.isFile()); 
}); 

을/etc/systemd/시스템/사상시킨 server.service (systemd 파일) :

[Unit] 
Description=Network address transaltion server 
Documentation=https://github.com/jkeveren/nat-server 
After=network.target 

[Service] 
Type=simple 
User=jkeveren 
ExecStart=/usr/bin/node /home/jkeveren/mega/code/util/nat-server/server.js 
Restart=on-failure 

[Install] 
WantedBy=multi-user.target 

아니요 rmal (원하는) 출력 :

err: { Error: ENOENT: no such file or directory, stat './config.json' 
    errno: -2, 
    code: 'ENOENT', 
    syscall: 'stat', 
    path: './config.json' } 

systemd 출력 (마지막 줄을주의 사항) :

Dec 19 13:49:59 jji-li systemd[1]: Started Network address transaltion server. 
Dec 19 13:50:00 jji-li node[17498]: err: null 
Dec 19 13:50:00 jji-li node[17498]: stat: Stats { 
Dec 19 13:50:00 jji-li node[17498]: dev: 2051, 
Dec 19 13:50:00 jji-li node[17498]: mode: 33188, 
Dec 19 13:50:00 jji-li node[17498]: nlink: 1, 
Dec 19 13:50:00 jji-li node[17498]: uid: 0, 
Dec 19 13:50:00 jji-li node[17498]: gid: 0, 
Dec 19 13:50:00 jji-li node[17498]: rdev: 0, 
Dec 19 13:50:00 jji-li node[17498]: blksize: 4096, 
Dec 19 13:50:00 jji-li node[17498]: ino: 15, 
Dec 19 13:50:00 jji-li node[17498]: size: 67, 
Dec 19 13:50:00 jji-li node[17498]: blocks: 8, 
Dec 19 13:50:00 jji-li node[17498]: atimeMs: 1513681349595.1235, 
Dec 19 13:50:00 jji-li node[17498]: mtimeMs: 1513681349595.1235, 
Dec 19 13:50:00 jji-li node[17498]: ctimeMs: 1513681349595.1235, 
Dec 19 13:50:00 jji-li node[17498]: birthtimeMs: 1513681349595.1235, 
Dec 19 13:50:00 jji-li node[17498]: atime: 2017-12-19T11:02:29.595Z, 
Dec 19 13:50:00 jji-li node[17498]: mtime: 2017-12-19T11:02:29.595Z, 
Dec 19 13:50:00 jji-li node[17498]: ctime: 2017-12-19T11:02:29.595Z, 
Dec 19 13:50:00 jji-li node[17498]: birthtime: 2017-12-19T11:02:29.595Z } 
Dec 19 13:50:00 jji-li node[17498]: stat.isFile(): true 
+0

'stat' 구조체에서 사용할 수있는'time'을 보면, 파일이 실제로 거기에 있었던 것 같습니다. 최근에 생성되었습니다. 스크립트로 만들 수 있습니까? – Malice

+0

@Malice Yea는 내 마음을 넘어 섰지 만 서버 전체가 그렇습니다 .js는 위에 게시되었으므로 의도적 인 생성이 없으며 실행 후 파일이 여전히 존재하지 않습니다. server.js 파일을 찾을 수없는 경우 나중에 생성하지만 아직 구현되지 않았습니다. –

+0

'./config.json'을 './nonexistent.json'으로 변경하면 동일한 효과가 발생합니다. 즉, 존재하지 않았으며 현재 또는 향후에 생성 할 파일이 없거나 앞으로 생성 될 파일이 무엇입니까? 즉, 존재하지 않아야하는 모든 파일 또는 특정 파일에서만이 동작을 보시겠습니까? – rsp

답변

0

는 systemd는 완벽 의미가 작업 디렉토리로 /를 사용하는 프로그램은, 그냥 didn를 실행하면 어떤 이유로 든 내 마음을 교차시키지 마라.

fs.stat이 ./config.json을 찾을 때 구성 설정 생성기가있을 때이 스크립트의 이전 실행에서 존재하는 /config.json을 찾습니다. 어쩌면이 미래에 같은 문제를 (다시)이 사람 (저를 포함한) 도움이 될 것입니다
fs.stat(path.join(__dirname, './config.json'), (err, stat) => {

:
fs.stat('./config.json', (err, stat) => {
로 :

soludtion 대체하는 것입니다.

관련 문제