Chr*_*ick 6 process users process-management not-root-user background-process
我经常想做的一件事是以我自己的非特权用户身份启动一些长时间运行的进程或服务器,然后有办法判断它是否仍在运行,如果没有,则重新启动它。
例如,我可能会设置一个 cron 作业,该作业每隔一段时间运行一次,检查我的进程是否正在运行并在它崩溃时重新启动它。这是 djb 的 daemontools、supervisord、launchd 等进程管理工具的精髓,除了这些工具默认配置为以 root 身份运行并带有配置文件,/etc
但我想要一个实用程序,它可以让我做同样的事情。从我的主目录舒适的非特权用户。
~/.config/systemd/user/<service_name>.service
[Unit]
Description=<Write some description here>
[Service]
ExecStart=<Write some command here>
Restart=always
[Install]
WantedBy=graphical.target
Run Code Online (Sandbox Code Playgroud)
查看man systemd.service
和man systemd.unit
了解更多选项。
[Unit]
Description=<Write some description here>
[Service]
ExecStart=<Write some command here>
Restart=always
[Install]
WantedBy=graphical.target
Run Code Online (Sandbox Code Playgroud)
$ systemctl --user enable <service_name>
Run Code Online (Sandbox Code Playgroud)
现在您可以重新加载 PC 并登录到您的图形环境,然后再次检查服务状态。
deamontools
你提到作为用户工作得很好。请参阅https://cr.yp.to/daemontools/supervise.html
根据上述建议,OP在尝试了两种不同的方法后使用该svscan
程序实现了此工作:daemontools
@reboot /usr/bin/svscan $HOME/.local/service 2>&1 > $HOME/.local/service/log
将~/.config/autostart/svscan.desktop
行设置为使用包装器脚本Exec=...
启动。svscan
我的包装脚本如下所示:
#!/usr/bin/env sh
(
echo "Starting svscan."
date
/usr/bin/svscan $HOME/.local/service 2>&1
) >> $HOME/.local/service/log
Run Code Online (Sandbox Code Playgroud)两种方法都有效,但每种方法适用于不同的情况。如果您在无头计算机上执行此操作,并且希望允许非特权用户安装自己的长期运行的服务和进程,则第一种方法很好。如果您希望所有服务继承当前登录的 X 用户的环境、ssh-agent 等,则第二种方法很好,这意味着进程有效地成为当前登录用户本身的代理。