非 sudo 用户可以添加 systemd 单元吗?

Can non-sudo user add systemd units?

我有一对包含大量 crons 和守护进程工作者(rabbitmq 消费者)的应用程序。

我想授予某些用户部署应用程序的权限,而不是管理权限。问题是:守护进程由 systemd 单元管理,更改 systemd 单元需要 root 访问权限。

我们如何解决这个问题?我知道我可以使用 supervisord 而不是 systemd,但这是不得已而为之,我真的不想切换到它。

您不能允许用户以 root(或任何其他用户)身份启动服务,但用户可以使用 user bus 启动单元,只需将​​它们放在 ~/.config/systemd/user/ 中(创建如果目录不存在),那么你可以

  systemctl --user daemon-reload
  systemctl --user start <your service>.service
  systemctl --user status <your service>.service

用户也可以像自己一样启动“瞬态单元”,使用相同的user-bus,然后管理它们(启动、停止、终止、重启等)作为常规单元。

瞬态单位 与常规单位完全一样,但无法在服务器重启后存活...

你从 systemd-run --user 开始,然后用 systemctl --user

管理它们

例子

$ systemd-run --user /bin/sleep 300
Running as unit: run-r6545f2e54ffc4f30b15f5dcabb280e5a.service

$ systemctl --user status run-r6545f2e54ffc4f30b15f5dcabb280e5a.service
● run-r6545f2e54ffc4f30b15f5dcabb280e5a.service - /bin/sleep 300
    Loaded: loaded (/run/user/1000/systemd/transient/run-r6545f2e54ffc4f30b15f5
    Transient: yes
    Active: active (running) since Thu 2018-03-15 20:31:52 PDT; 15s ago
    Main PID: 21095 (sleep)
    CGroup: /user.slice/user-1000.slice/user@1000.service/run-r6545f2e54ffc4f30
           └─21095 /bin/sleep 300

$ systemctl --user stop run-r6545f2e54ffc4f30b15f5dcabb280e5a.service

$ systemctl --user status run-r6545f2e54ffc4f30b15f5dcabb280e5a.service
Unit run-r6545f2e54ffc4f30b15f5dcabb280e5a.service could not be found.

注意旧的 systemd,确保 dbus 在你的系统上是 运行,并且用户可以访问,通常确保你设置了 DBUS_SESSION_BUS_ADDRESSXDG_RUNTIME_DIR 环境变量.