无法确定补充组:不允许操作

the*_*row 8 systemd systemd-unit

我正在尝试将守望者设置为用户服务。

我已经尽可能地密切关注他们的文档。这就是我所拥有的:

套接字文件:

[Unit]
Description=Watchman socket for user %i

[Socket]
ListenStream=/usr/local/var/run/watchman/%i-state/sock
Accept=false
SocketMode=0664
SocketUser=%i
SocketGroup=%i

[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)

服务文件:

[Unit]
Description=Watchman for user %i
After=remote-fs.target
Conflicts=shutdown.target

[Service]
ExecStart=/usr/local/bin/watchman --foreground --inetd --log-level=2
ExecStop=/usr/bin/pkill -u %i -x watchman
Restart=on-failure
User=%i
Group=%i
StandardInput=socket
StandardOutput=syslog
SyslogIdentifier=watchman-%i

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

Systemd 尝试运行 watchman,但卡在重启循环中。
这些是我得到的错误:

Apr 16 05:41:00 debian systemd[20894]: watchman@user.service: Failed to determine supplementary groups: Operation not permitted
Apr 16 05:41:00 debian systemd[20894]: watchman@user.service: Failed at step GROUP spawning /usr/local/bin/watchman: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

我 100% 确定我启用此服务和套接字的组和用户存在。我究竟做错了什么?

小智 23

我遇到了同样的问题。谷歌搜索我发现这个线程:https ://bbs.archlinux.org/viewtopic.php?id =233035

问题在于服务是如何启动的。如果您在单元文件中指定用户/组,那么您应该将服务作为系统服务启动。

如果你想启动该服务为用户服务,则用户/不需要组,可以从单元配置中删除。您只需在以当前用户身份登录时启动服务,将--user标志传递给 systemctl。

  • 这有效。似乎此错误消息应该更能描述实际问题,因为从消息来看这不是很直观 (2认同)
  • 请注意 `User=` 和 `--user` 之间的区别。请参阅https://unix.stackexchange.com/a/548526/150125 (2认同)

the*_*row 6

我还没有找到问题的解决方案,但将单元文件放入~/.config/systemd/user并删除用户参数化为我解决了这个问题。