我有一对应用程序,有很多crons和daemon worker(rabbitmq使用者)。
我想授予某些用户部署应用的权限,但不授予管理权限。问题是:守护进程工作者由systemd单元管理,更改systemd单元需要root访问权。
我们如何解决这个问题?我知道我可以使用supervisord而不是systemd,但这是最后的手段,我真的不想切换到它。
答案 0 :(得分:1)
您不能允许用户以root用户身份(或任何其他用户)启动服务,但用户可以使用user bus
启动单位,只需将其放入~/.config/systemd/user/
(创建目录)如果不存在),那么你可以
systemctl --user daemon-reload
systemctl --user start <your service>.service
systemctl --user status <your service>.service
用户也可以使用相同的用户总线启动“ transient units ”作为他们自己,然后管理它们(启动,停止,终止,重启等)作为常规单位。
瞬态单位与普通单位完全相同,但无法在服务器重启后继续存在......
您使用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
环境变量。