Process

是否有用於將程序守護為非特權使用者的實用程序?

  • December 20, 2017

我經常想做的一件事是以我自己的非特權使用者身份啟動一些長時間執行的程序或伺服器,然後有辦法判斷它是否仍在執行,如果沒有則重新啟動它。

因此,例如,我可能會設置一個經常執行的 cron 作業,檢查我的程序是否正在執行,如果它崩潰則重新啟動它。這是 djb 的 daemontools、supervisord、launchd 等程序管理工具的本質,除了這些工具預設配置為使用配置文件以 root 身份執行,/etc但我想要一個實用程序,它可以讓我做與我相同的事情從我的主目錄舒適的非特權使用者。

deamontools您提到作為使用者工作得很好。見https://cr.yp.to/daemontools/supervise.html

更新 - 解決方案

根據上述建議,OP在嘗試了兩種不同的方法後使用該svscan程序進行了這項工作:daemontools

  1. 像這樣把它放在一個現代的 crontab 中:@reboot /usr/bin/svscan $HOME/.local/service 2>&1 > $HOME/.local/service/log
  2. ~/.config/autostart/svscan.desktopExec=...設置為svscan使用包裝腳本啟動。我的包裝腳本如下所示:
#!/usr/bin/env sh
(
 echo "Starting svscan."
 date
 /usr/bin/svscan $HOME/.local/service 2>&1
) >> $HOME/.local/service/log

兩種方法都有效,但每種方法都適用於不同的情況。如果您在無頭機器上執行此操作,則第一種方法很好,您希望允許非特權使用者安裝他們自己的長時間執行的服務和程序。如果您希望所有服務都繼承您目前登錄的 X 使用者的環境、ssh-agent 等,則第二種方法很好,這意味著程序實際上成為目前登錄使用者自己的代理。

使用系統:

1.創建服務單元配置文件

~/.config/systemd/user/<service_name>.service

[Unit]
Description=&lt;Write some description here&gt;

[Service]
ExecStart=&lt;Write some command here&gt;
Restart=always

[Install]
WantedBy=graphical.target

查看man systemd.serviceman systemd.unit了解更多選項。

2.在使用者空間啟用服務

$ systemctl --user enable &lt;service_name&gt;

3. 立即啟動並檢查其狀態

$ systemctl --user start &lt;service_name&gt;
$ systemctl --user status &lt;service_name&gt;

4.確保它自動啟動

現在您可以重新載入 PC 並登錄到您的圖形環境,然後再次檢查服務狀態。

5.享受!

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