
有沒有辦法讓應用程式在啟動時以某個使用者帳戶啟動?
例如,我想a_small_app
在使用者帳戶bob
(位於 group 中bobsgroup
)下運行。我要添加一些東西嗎/etc/init.d
?
注意:我不想啟動應用程式使用者登入後而是當計算機啟動時。
答案1
一種與啟動系統無關的方法。您可以在/etc/rc.local
腳本/etc/init.d/...
、Upstart 設定檔以及可能的 systemd 設定中使用它。
sudo -u oli /full/path/to/application
該命令將以 root 使用者身分執行,sudo
並將下拉至「oli」使用者。顯然,根據您的目的更改使用者和命令。
我應該補充一點,至少有十幾種方法可以做到這一點......但根據我的經驗,它們的效果基本上都是相同的。這是一個使用其節的新貴範例setuid
:
start on (filesystem and stopped udevtrigger)
stop on runlevel [06]
setuid oli
respawn
exec /full/path/to/application
答案2
不確定舊版本的 Ubuntu,但最近的版本也允許使用@reboot
(參見例如在 Ubuntu Wiki 中,向下滾動一點或按 Ctrl+F 即可@重啟)。
當您希望使用者能夠在啟動時運行自己的命令而不必成為 root(或讓有權訪問 root 帳戶的人為他們執行此操作)甚至不必登入時,這可能是有用的選擇。如果有效,則無需登入即可運作。
因此,輸入“bob”,crontab -e
然後在開啟的檔案底部新增一行,例如:
# bottom of bob's crontab
@reboot /path/to/a_small_app
如果它不起作用,您可能需要檢查您的環境變量,尤其是PATH
.我通常在 crontab 上明確設定HOME
和設定。PATH
就像是:
# top of bob's crontab
HOME=/home/bob
PATH=/home/bob/.local/bin:/usr/local/bin:/usr/bin:/bin
找出它可能不起作用的原因的技術:
# bottom of bob's crontab
* * * * * /path/to/a_small_app 2>&1 | tee /tmp/a_small_app.log # will run every minute
....然後/tmp/a_small_app.log
60 秒後在您最喜歡的編輯器中打開,看看其中是否有任何有用的信息。
今天嘗試@reboot
發起一個多路復用器要運行的命令應該存在於會話中,今天我偶然發現了一個頑固的腳本,它最終使用了這個小技巧。結合上面的日誌記錄來顯示它:
@reboot tmux new-session -d -s mysession "bash -c '/path/to/a_small_app 2>&1 | tee /tmp/a_small_app.log'"
答案3
似乎第一個答案在 Ubuntu 14.10 中不再適用。
這就是我在那裡的做法(將其放入 /etc/rc.local 中)
su <username> - -c "<command>"