You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 08:48:15