Ubuntu
新貴:為什麼在以不同使用者身份執行時有兩個程序?
我想保持 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