Su

linux 啟動腳本 /etc/init 與特定使用者

  • February 28, 2012

我在 /etc/init/mms-agent.conf 創建了一個腳本:

start on runlevel [2345]
stop on runlevel [06]

exec /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1

服務 mms-agent 啟動/停止工作正常,但我想以使用者“mms”啟動此服務

當我嘗試如下更改腳本時:

exec su mms -c "/usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1"

我執行了 3 個程序,而不是預期的 1 個(su、bash + 我的 python 腳本):

mms       8864  0.0  0.2  37816  1332 ?        Ss   22:30   0:00 su mms -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8865  0.0  0.2  11452  1196 ?        S    22:30   0:00 bash -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8866  4.0  1.8  54672 10640 ?        Sl   22:30   0:00 python /home/mms/mms-agent/agent.py

那是什麼意思 ?

使用不同於 root 的使用者啟動腳本的最佳方法是什麼?

謝謝

PS:

exec start-stop-daemon --start -u mms --exec "/usr/bin/env python /home/mms/mms-agent/agent.py"

不起作用,我沒有錯誤,但該過程沒有開始。

當您執行 execsu時,shell 將替換為su程序。 su然後分叉和執行bashbash設置輸出重定向,然後 fork 和 execs envenv搜尋 PATH,找到python並執行它。所以你剩下三個程序, 1) su,等待bash退出, 2) bash,等待python(以前env)退出,和 3) python,它正忙於執行你的腳本。

這並沒有錯。 su是 Unix 歷史悠久的臨時切換使用者的方式,所以這就是你應該使用的。類似地,執行命令行的方法是使用 shell,所以su執行bash並讓我們bash處理它。同樣,這遵循了通用的 Unix 工具箱方法,讓 shell 做 shell 擅長的事情,而不是在另一個應用程序中重新發明 shell 命令行和 PATH 搜尋功能。

此外,由於bash已經在進行 PATH 搜尋,因此您可以放棄使用env並直接呼叫python

請參閱Upstart 手冊中的以其他使用者身份執行作業。使用start-stop-daemon是推薦的方法。

start-stop-daemon您只是犯了一個小錯誤:您傳遞了期望執行檔路徑的整個命令行。分別傳遞參數。

您的呼叫的另一個問題是您告訴start-stop-daemon將任何 Python 程序視為您的服務的實例。這可能會導致它殺死其他不相關的 Python 程序。要確保只有一個服務實例執行,請使用 pidfile。

exec start-stop-daemon --start -c mms -u mms -m -p /var/run/mms-agent.pid \
                      --startas /usr/bin/env -- python /home/mms/mms-agent/agent.py

引用自:https://unix.stackexchange.com/questions/32880