linux 啟動腳本 /etc/init 與特定使用者
我在 /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"
不起作用,我沒有錯誤,但該過程沒有開始。
當您執行 exec
su
時,shell 將替換為su
程序。su
然後分叉和執行bash
。bash
設置輸出重定向,然後 fork 和 execsenv
。env
搜尋 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