node.js - nodejs - fs.stat isFile() 在作为守护进程/服务从 systemd 执行时总是返回 true

标签 node.js linux daemon fs systemd

通常在不存在的文件 (config.js) 上执行带有 fs.stat 的 nodejs 脚本时,如预期的那样,它会向回调传递错误;然而,当使用 systemd 执行与守护进程相同的脚本时,fs.stat 不会提供错误并且 stat.isFile() 返回 true。

我做错了什么吗?
这是一个错误吗?
这是一项功能吗?

  • 操作系统:Arch Linux
  • Node :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/system/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

正常(期望)输出:

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

最佳答案

systemd 运行一个程序时,它使用 / 作为工作目录,这很有意义,只是出于某种原因我没有想到。

这意味着当 fs.stat 查找 ./config.json 时,它会查找确实存在于此脚本具有配置生成器时的先前运行。

解决方案是更换:

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

与:

fs.stat(path.join(__dirname, './config.json'), (err, stat) => {

希望这对将来(再次)遇到相同问题的任何人(包括我)有所帮助。

关于node.js - nodejs - fs.stat isFile() 在作为守护进程/服务从 systemd 执行时总是返回 true,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888318/

相关文章:

linux - 从第二个元素开始循环 - Shell 脚本

linux - () 构造总是会启动一个子 shell 吗?

ubuntu - Nginx 守护进程停止失败

linux - 从服务器远程连接到 Dropbox 服务

javascript - 如何在 moment.js 中正确地将 1 个月添加到当前日期

Javascript,异步并返回到完全相同的地方

javascript - 为什么我的请求对象没有方法 `param` ?

linux - Munin 动态图缩放(dynazoom)不起作用(CentOS6、nginx、php-fpm)

java - 在没有 Web 服务器的 Spring-Boot 应用程序中,保持它运行的正确方法是什么?

node.js - 404 未找到 | NGINX——尝试将客户端 React 代码部署到 Heroku 和 Webpack