是否有用于将进程作为非特权用户进行守护进程的实用程序?

Chr*_*ick 6 process users process-management not-root-user background-process

我经常想做的一件事是以我自己的非特权用户身份启动一些长时间运行的进程或服务器,然后有办法判断它是否仍在运行,如果没有,则重新启动它。

例如,我可能会设置一个 cron 作业,该作业每隔一段时间运行一次,检查我的进程是否正在运行并在它崩溃时重新启动它。这是 djb 的 daemontools、supervisord、launchd 等进程管理工具的精髓,除了这些工具默认配置为以 root 身份运行并带有配置文件,/etc但我想要一个实用程序,它可以让我做同样的事情。从我的主目录舒适的非特权用户。

raa*_*cer 6

使用systemd:

1.创建服务单元配置文件

~/.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.serviceman systemd.unit了解更多选项。

2.在用户空间启用服务

[Unit]
Description=<Write some description here>

[Service]
ExecStart=<Write some command here>
Restart=always

[Install]
WantedBy=graphical.target
Run Code Online (Sandbox Code Playgroud)

3.立即启动并检查它的状态

$ systemctl --user enable <service_name>
Run Code Online (Sandbox Code Playgroud)

4.确保它自动启动

现在您可以重新加载 PC 并登录到您的图形环境,然后再次检查服务状态。

5.享受吧!


Mat*_*lis 3

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.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 等,则第二种方法很好,这意味着进程有效地成为当前登录用户本身的代理。