如何让systemd服务在用户注销时运行?
如何让systemd服务在用户注销时运行?
我明白你的问题了——你现在的systemd服务在系统关机、重启时都能正常触发脚本,但用户注销的时候就没反应,对吧?这其实是因为你当前的服务是系统级服务,它监听的是整个系统层面的关机/重启事件,而用户注销是单个用户会话结束的操作,系统级服务根本感知不到这个事件,所以自然不会触发脚本。
那该怎么调整呢?其实很简单,我们需要创建一个用户级的systemd服务,专门用来监听用户会话结束(也就是注销)的事件,具体步骤如下:
1. 创建用户级服务文件
在你自己的用户配置目录下新建服务文件,路径是~/.config/systemd/user/my-logout-script.service(文件名可以自己改,只要后缀是.service就行),把下面的内容复制进去:
[Unit] Description=注销时运行我的自定义脚本 DefaultDependencies=no Before=exit.target [Service] Type=oneshot RemainAfterExit=true ExecStop=/path/to/myscript.sh [Install] WantedBy=default.target
我给你拆解下关键配置的作用:
DefaultDependencies=no:跳过默认的依赖规则,避免服务和会话的其他默认流程冲突,确保脚本能在注销时准时运行Before=exit.target:保证我们的脚本在用户会话完全结束前执行RemainAfterExit=true:让服务在启动后保持激活状态,直到用户注销时被systemd停止ExecStop=/path/to/myscript.sh:这里是核心——当用户注销,systemd会停止这个用户级服务,此时就会触发ExecStop里的脚本执行WantedBy=default.target:把服务绑定到用户会话的默认target,这样你一登录,这个服务就会自动启动
2. 启用并启动用户服务
打开终端,运行下面的命令,让这个用户级服务生效:
systemctl --user enable --now my-logout-script.service
这里的--user参数一定要加,它告诉systemd我们操作的是当前用户的服务实例,不是系统级的服务。
额外说明
如果你还需要保留原来的系统级服务来处理系统关机、重启的场景,完全没问题——两个服务可以共存,系统级服务管系统层面的关机重启,用户级服务管单个用户的注销,这样所有场景就都覆盖到了。
备注:内容来源于stack exchange,提问作者Laphroigh
相关产品推荐
相关产品推荐

