![用户注销后启动服务](https://linux22.com/image/914065/%E7%94%A8%E6%88%B7%E6%B3%A8%E9%94%80%E5%90%8E%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1.png)
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
您可以通过多种方式在用户注销后启动脚本。可能还有更多,但以下是我所知道的两种
- 使用孕期在注销后启动脚本(位于 /etc/gdm/PostSession 中)。有关此内容的更多信息 这里。
- 使用两个新的独立systemd服务。第二个服务应在第一个服务停止时由第一个服务启动。通过将第一个服务绑定到已经存在的用户会话服务 ([电子邮件保护])。
我不熟悉第一条路线的细节或优点,所以我只描述第二条路线。
在一次快速测试中,我以不同的用户身份在不同的 tty 上登录,并检查我的进程(一条简单echo
消息)是否在该用户注销(cmd)时成功启动/执行logout
。它在基于 debian 的系统上使用 systemd v232 运行良好。
我的例子包含三个元素:
# /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
# /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]
- 创建第二个服务单元文件,在用户注销后运行脚本
# /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 包含在其名称中(例如,[电子邮件保护])