2017-12-19 31 views
0

通常、存在しないファイル(config.js)上でfs.statを使用してnodejsスクリプトを実行すると、コールバックエラー。しかし、systemdのデーモンと同じスクリプトを実行すると、fs.statはエラーを表示せず、stat.isFile()がtrueを返します。nodejs - fs.stat isFile()は、システムdのデーモン/サービスとして実行されたとき常にtrueを返します。

何か間違っていますか?
これはバグですか?
これは機能ですか?

  • OS:アーチのLinux
  • Nodejs:v9.3.0

server.js(Iが挙げスクリプト):

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 /システム/ NAT- 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は私の頭を越えましたが、それは上記のserver.js全体であり、意図的な作成はなく、実行後もファイルは存在しません。 server.jsはファイルが見つからない場合には後で作成しますが、まだ実装されていません。 –

+0

'./config.json'を './nonexistent.json'に変更したときと同じ効果が得られますか?つまり、存在していないファイル(または将来作成されるファイルは何もありません)ですか?言い換えれば、存在しないはずのすべてのファイルまたはその特定のファイルのみでこの動作を確認できますか? – rsp

答えて

0

にsystemdそれはそれだけのdidn、完璧な理にかなって作業ディレクトリとして/を使用するプログラムを実行します何らかの理由で私の心を横切ってはいけません。

これは、fs.statが./config.jsonを探すときに、configジェネレータを持っていたときにこのスクリプトの以前の実行から存在する/config.jsonを探します。多分これは、将来的には同じ問題を(再)持っている人(私を含む)を支援する
fs.stat(path.join(__dirname, './config.json'), (err, stat) => {


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

soludtionは交換することです。

関連する問題