MeteorCat / systemd用户分配应用启动环境

Created Fri, 29 Sep 2023 17:59:25 +0800 Modified Wed, 29 Oct 2025 23:25:05 +0800
639 Words

systemd用户分配应用启动环境

这里源于多用户登录的时候,想要各自用户达成运行 systemd 以下效果:

# 常见的 systemd 启动服务
sudo systemctl start nginx.service

# 但是现在要求生成某个服务, 让其只允许启动自己家目录的应用, 类似如下:
systemcl start owner-worker.service
# 这个服务会根据当前登录的不同用户在自己 Home 目录下创建自己的工具目录

对于 Linux 这种多用户分配的时候, 需要自己与根据自己根目录生成不同开发配置等就需要这种效果.

常见的系统服务脚本都是放置于 /lib/systemd/system, 但是如果区分个人用户则是放置于 /lib/systemd/user 之中, 所以这里脚本已经放置于此:

# 编写用户级别的启动服务
sudo vim /lib/systemd/user/owner-worker.service

这里需要先科普下 systemd 模板声明变量, 建议先了解好内置模板变量再进行编写.

# owner-worker.service 自动创建根目录下工作目录
[Unit]
Description=Project Worker(Path: %h/workspace)
After=network.target nss-lookup.target

[Service]
# 单次执行的服务
Type=oneshot

# 单次服务需要追加启动项目
RemainAfterExit=yes

# 注意别追加 User/Group 配置项, 因为是需要根据 ssh 用户启动
ExecStart=/bin/mkdir -p %h/workspace

# 这里恶趣味下关闭自动清理目录
ExecStop=/bin/rm -p %h/workspace

[Install]
# 这里采用系统默认配置
WantedBy=default.target

这时候已经编写完成, 需要更新服务并启动临时工作区:

# 启动用户级别服务和系统级差不多
# 仅仅是不需要 sudo 和 追加 --user 配置
systemctl --user daemon-reload


# 创建自己的临时工作区
systemctl --user start owner-worker.service

# 后续查看情况也是直接追加下 --user
systemctl --user status owner-worker.service

# 直接清理工作目录直接 stop 即可
systemctl --user stop owner-worker.service

# 查看日志
journalctl -f

注意: 这里虽然已经满足了, 但是在 ssh 用户全部断开的时候, 用户级别的服务直接会自动开始 stop , 并且没办法达到开机自启的情况, 这里需要让其支持允许自启配置:

# 保证用户不登录的情况服务也在运转
loginctl enable-linger $USER

另外注意 ssh 登录时候可能会丢失某些环境变量, 而 systemd 可能依赖某些环境变量, 所以最好在 /etc/ssh/sshd_config 当中设置启用 UsePAM 来保证环境变量的有效存在