通常在不存在(config.js
)的文件上执行带有fs.stat的nodejs脚本时,正如预期的那样,它会将回调传递给错误;但是,当使用systemd执行与deamon相同的脚本时,fs.stat不会提供错误,stat.isFile()
将返回true。
我做错了吗? 这是一个错误吗? 这是一个功能吗?
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/system/nat-server.service(systemd file):
[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
正常(所需)输出:
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 :(得分:1)
当systemd
运行程序时,它使用/
作为工作目录,这非常有意义,它只是因为某种原因而没有出现在我脑海中。
这意味着当fs.stat
查找./config.json
时,它会查找/config.json
,当它有一个配置生成器时,它会在此脚本的上一次运行中存在。
解决方案是替换:
fs.stat('./config.json', (err, stat) => {
with:
fs.stat(path.join(__dirname, './config.json'), (err, stat) => {
希望这将有助于将来(再次)遇到同样问题的任何人(包括我)。