新贵:为什么两个进程作为不同的用户运行?

我想保持一个nodejs应用程序运行,所以我遵循这个: http ://howtonode.org/deploying-node-upstart-monit并安装了Monit和Upstart已经完美的工作了几个月。 我刚刚添加了一个function,我的应用程序,允许磁盘写入和获取权限错误。 我去寻找一切,因为它似乎权限错误不应该是问题。 事实certificate,我从Upstart开始的用户实际上并不是正在运行应用程序的用户!

当我运行:

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

无论是通过Monit / Upstart,还是通过SSH,它都会创build2个进程。 从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用户身份login并运行:

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

只有一个过程!

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

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

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

这是我的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 ...以运行它作为你想要的用户。 但那是造成问题的原因。

谢谢!

保罗

只要进程正在运行,sudo就会一直存在,所以解决办法是使用新手的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