我在 CentOS 上的服务配置为在其配置文件中的某个用户下运行/etc/systemd/system
:
[Service]
User=buildman
当我su
作为 buildman 时,我可以运行:
systemctl status myservice.service
但如果我尝试执行start
或stop
,它会提示我输入密码。
如果我做:
sudo systemctl status myservice.service
它不会提示我,因为我已经配置了visudo
:
%buildman ALL= NOPASSWD: /bin/systemctl * myservice.service
但为什么服务不像状态那样停止和开始工作呢?我想让 buildman 能够在没有 sudo 或密码的情况下执行这些服务命令。
主要原因是我需要从 Jenkins 启用服务重新启动,并且我在从其容器运行 sudo 时遇到了问题,该容器抱怨我需要一个“TTY”来运行它。
答案1
start/stop
和之间的区别status
在于status
不改变系统状态。
对系统范围状态或配置的任何修改都需要系统范围管理权限——因此需要 sudo。读取服务的“状态”是只读操作,因此通常不受保护。
值得注意的是,用户服务不需要sudo。例如
systemctl --user start bobsburgers
由 bob 发出时会成功,但只能由 bob 发出。 (root 将无法启动此服务,因为它不是 root 用户服务。)
因此,如果您在这里感兴趣的服务不会改变系统范围的状态,您可以将其安装为用户服务
systemctl --user enable bobsburgers
标准配置是将您的服务文件放在~/.config/systemd/user
.只要服务本身不需要全局权限,您就可以开始使用。
答案2
status
命令不需要超级用户权限,它也可以工作sudo
。
start
并且stop
确实需要sudo
.您可以避免输入密码但不指定 sudo。