Upstart:以不同用户身份运行时为什么会出现两个进程?

Upstart:以不同用户身份运行时为什么会出现两个进程?

我想保持 nodejs 应用程序运行,因此我遵循了以下步骤:http://howtonode.org/deploying-node-upstart-monit并安装了 Monit 和 Upstart,它们已经完美运行了几个月。我刚刚为我的应用程序添加了一项允许磁盘写入的功能,但出现了权限错误。我查找了所有信息,因为权限错误似乎不是问题所在。结果发现,我使用 Upstart 启动的用户实际上并不是运行该应用程序的用户!

当我跑步时:

sudo -u deploy NODE_ENV=production node /srv/www/[name of my app]/dist/app.js

无论是通过 Monit/Upstart,还是仅通过 SSH,它都会创建 2 个进程。来自ps ax

2869 ?        Ss     0:00 sudo -u deploy node /srv/www/[name of my app]/dist/app.js
2878 ?        Sl     0:01 node /srv/www/[name of my app]/dist/app.js

当我以用户身份登录deploy并运行时:

NODE_ENV=production node /srv/www/[name of my app]/dist/app.js

仅 1 个流程!

3131 pts/1    Sl+    0:04 node /srv/www/[name of my app]/dist/app.js

这个问题是由于某种原因,第二个进程没有正确的写入权限,但似乎是在执行该工作。当我不使用 Upstart 时,包括写入在内的一切都很完美,但我需要 Upstart/Monit 来保持我的 nodejs 应用程序运行。

那么,在这种情况下配置 Monit/Upstart 的最佳方法是什么?我想保持较低的权限(因此用户deploy没有 sudo),并且我希望应用程序在崩溃时启动。

这是我的 Upstart 脚本:

start on startup
stop on shutdown

script
    export HOME="/home/deploy"

    echo $$ > /var/run/[name of my app].pid
    exec sudo -u deploy NODE_ENV=production node /srv/www/[name of my app]/dist/app.js >> /srv/www/log/[name of my app].sys.log 2>&1
end script

有什么问题吗?

教程说要使用sudo -u user ...才能以您想要的用户身份运行它。但这正是导致问题的原因。

谢谢!

保罗

答案1

只要进程正在运行,sudo 就会一直存在,因此解决方案是使用 upstart 的 setuid 和 setgid 节。这样做的问题是,发送守护进程的 PID 的行需要 root 权限。以下是解决方法:

[名称].conf:

start on runlevel [2345]
stop on runlevel [016]

env HOME=/home/deploy
env NODE_ENV=production

setuid deploy
setgid deploy

exec node /srv/www/[name]/dist/app.js

[名称]-pidfile.conf

start on started [name]
stop on stopped [name]

pre-start script
    initctl status name | cut -d" " -f4 > /var/run/[name].pid
end script

post-stop exec rm -f /var/run/[name].pid

相关内容