用户注销后启动服务

用户注销后启动服务

MyUnit2.服务

[Unit]
Description = MyUnit2
[Service]
RemainAfterExit=true
ExecStart=/usr/mscript2
Type=oneshot
[Install]
WantedBy=shutdown.target reboot.target

mscript2

\> /var/log/mlog2.log
echo "Time:" >> /var/log/mlog2.log
date >> /var/log/mlog2.log
echo "Uptime:" >> /var/log/mlog2.log
uptime >> /var/log/mlog2.log

根据任务,需要在关机、重启、用户退出后执行脚本。我选择了前两个选项。我该如何完成这项工作?

答案1

您可以通过多种方式在用户注销后启动脚本。可能还有更多,但以下是我所知道的两种

  1. 使用孕期在注销后启动脚本(位于 /etc/gdm/PostSession 中)。有关此内容的更多信息 这里
  2. 使用两个新的独立systemd服务。第二个服务应在第一个服务停止时由第一个服务启动。通过将第一个服务绑定到已经存在的用户会话服务 ([电子邮件保护])。

我不熟悉第一条路线的细节或优点,所以我只描述第二条路线。

在一次快速测试中,我以不同的用户身份在不同的 tty 上登录,并检查我的进程(一条简单echo消息)是否在该用户注销(cmd)时成功启动/执行logout。它在基于 debian 的系统上使用 systemd v232 运行良好。

我的例子包含三个元素:

  1. 修改现有的[电子邮件保护]使其启动服务实例([电子邮件保护]) 结合至[电子邮件保护]。这样可以实现两件事:
    • 你可以获得可轻松链接到用户的实例化服务(用于登录等)
    • 当用户注销时,帮助服务将停止

# /lib/systemd/system/[email protected]

[Unit]
Description=User Manager for UID %i
After=systemd-user-sessions.service

[Service]
User=%i
PAMName=systemd-user
Type=notify
ExecStart=-/lib/systemd/systemd --user
Slice=user-%i.slice
KillMode=mixed
Delegate=yes
TasksMax=infinity
TimeoutStopSec=120s

# /etc/systemd/system/[email protected]/afterlogout.conf
[Service]
Environment="USERUID=%i"
ExecStartPost=+/bin/systemctl start helperunit@${USERUID}.service
  1. 创建 helperunit 服务文件(绑定到[电子邮件保护]),用于启动第二个服务([电子邮件保护])在停止时(即用户注销时)

# /etc/systemd/system/[email protected]

[Unit]
Description=helper-to-start-afterlogout-service Service
BindsTo=user@%i.service

[Service]
Environment="USERUID=%i"
RemainAfterExit=yes
Type=oneshot
ExecStart=/bin/true
ExecStopPost=/bin/systemctl start afterlogout@${USERUID}.service

[Install]
  1. 创建第二个服务单元文件,在用户注销后运行脚本

# /etc/systemd/system/[email protected]

[Unit]
Description=trigger-script-after-user-logout Service
Before=reboot.target shutdown.target

[Service]
Environment="USERUID=%i"
Type=oneshot
ExecStart=/bin/echo "user UID=${USERUID} has logged out"

[Install]

设置服务实例的方式是将用户 UID 包含在其名称中(例如,[电子邮件保护]

相关内容