我需要运行一些后台进程,只要我以某个用户登录,这些进程就会一直存在。
是否存在类似每用户守护进程的东西?我只知道从计算机启动到关闭(或手动启动/终止)的全局守护进程。
现在我制作了一个脚本来检查该进程是否已存在,如果不存在则创建该进程。然后使用nohup
我的.profile
.这样,该流程在启动时启动,并且仅启动一次(即使有多个rxvt
术语来来去去)。然而,在我登录后它永远不会被杀死(这不是灾难,但终止进程会更干净)。
答案1
systemd 允许用户运行自己的 systemd 实例来管理私有守护进程。
如果您已经安装了 systemd,您所要做的就是systemd --user
通过运行 来启动和管理您的服务systemctl --user
。将在 中搜索用户服务~/.config/systemd/user
。
默认情况下,systemd 将在注销时终止用户服务(根据您的请求)。可以通过使用该命令为用户启用延迟来更改此行为loginctl --enable-linger $USER
。
更多信息可以在建筑维基页面。
答案2
dbus 服务正是用于此目的...好吧,它可以用于此目的:-)。每用户 dbus 守护进程在用户登录到桌面环境时启动,并在用户注销时终止(请参阅 的手册页dbus-launch
和选项--exit-with-session
)。 dbus 服务可以与 dbus 实例一起启动,也可以在第一次通过 dbus 调用该服务的接口时启动。每个用户都可以有自己的 dbus 服务规范,定义在用户主目录的隐藏目录中,或者全局定义在/etc
.看freedesktop 上的 dbus 主页大量文档和参考实现。
这些天我只使用基于 Debian 的发行版。所有这些脚本都有/etc/X11/Xsession.d
经常修改字符串的脚本,该字符串最后将被评估为启动所选桌面环境的命令。 dbus 有一个这样的脚本,它在命令前面加上 dbus 包装器dbus-launch
。这个包装器启动了一个 dbus 服务器,并且至少在 vanilla Debian 上(我愿意说“在所有基于 Debian 的发行版上”)dbus-launch
提供了选项--exit-with-session
。
您应该能够在用户登录 dbus 服务时包装您想要运行的进程,并且 IIRC dbus 会在退出之前自动终止其服务。