前几天我得到了自己的 linode 服务器,并将我正在使用的小型 nodejs / express 从 aws linux 移过来。一切运行良好,但如果我用 upstart 启动应用程序,它不会以正确的权限运行,也无法将文件写入磁盘。我尝试了 upstart 脚本的各种变体,以 root 身份、以我的用户名、www-data 身份运行,但都不起作用。我将public
express 的目录设置为 777,即使只是作为测试,也没有成功。我用 启动我的 upstart 作业sudo start now-images-manager
。运行时,ps -ef
我得到以下输出:
root 25150 1 0 11:26 ? 00:00:00 sudo node /home/myusername/sites/now-images-manager/app.js
root 25151 25150 0 11:26 ? 00:00:03 node /home/myusername/sites/now-images-manager/app.js
这是我的 upstart 脚本:
#!upstart
description "now-images-manager startup script"
author "[email protected]"
start on startup
stop on shutdown
script
export HOME="/root"
echo $$ > /var/run/now-images-manager.pid
exec sudo node /home/myusername/sites/now-images-manager/app.js >> /home/myusername/sites/now-images-manager/now-images-manager.sys.log 2>&1
# exec sudo -u myusername /usr/bin/node /home/myusername/sites/now-images-manager/app.js >> /home/myusername/sites/now-images-manager/now-images-manager.sys.log 2>&1
end script
pre-start script
# Date format same as (new Date()).toISOString() for consistency
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/now-images-manager.sys.log
end script
pre-stop script
rm /var/run/now-images-manager.pid
echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/now-images-manager.sys.log
end script
以下是日志的一个示例:
downloadFileFromURL { [Error: ENOENT, open 'public/images/tumblr_m9h1uh4KSi1qzl9k6o1_500.jpg']
errno: 34,
code: 'ENOENT',
path: 'public/images/tumblr_m9h1uh4KSi1qzl9k6o1_500.jpg' }
当我在 shell 中启动该应用程序时,node app.js
它运行正常。
答案1
我发现了这个问题。如果你使用节点应用程序创建目录,你首先需要进入节点应用程序的目录。所以我的 upstart 脚本如下所示:
script
export HOME="/var/www"
cd $HOME/mywebsite/
exec node index.js >> /var/log/node.log 2>&1
end script
您可以通过向上移动目录然后尝试运行节点应用程序来测试这一点。它应该会抛出与上述更改之前的 upstart 脚本相同的错误。