Ubuntu

新貴:為什麼在以不同使用者身份執行時有兩個程序?

  • July 2, 2014

我想保持 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 的使用者),我希望應用程序在崩潰時啟動。

這是我的新貴腳本:

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 就會持續存在,因此解決方案是使用 upstart 的 setuid 和 setgid 節。問題在於發送守護程序 PID 的行需要 root 權限。這是一種解決方法:

$$ name $$.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

$$ name $$-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

引用自:https://serverfault.com/questions/608240