非 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_ADDRESS
和 XDG_RUNTIME_DIR
环境变量.
我有一对包含大量 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_ADDRESS
和 XDG_RUNTIME_DIR
环境变量.