在18.04版本中,添加一个群组后,仅仅注销再登录是不够的吗?

在Ubuntu 18.04的默认桌面环境中,注销/登录的行为发生了变化:
以前,在Ubuntu系统上,当我发现需要将我的用户ID添加到某个组中时,只需执行以下操作即可:
sudo adduser ludwig docker # adds me to group docker

然后我不得不注销并重新登录以使组更改生效。
我注意到在Ubuntu 18.04中,添加组并注销并重新登录后,有效组列表仍然没有变化。
作为一种解决方法,我重新启动了系统,这很不方便(需要在grub中进行正确选择并重新输入磁盘加密密码)。
1. 为什么现在的行为是这样的? 2. 除了重新启动之外,我还能做些什么吗?
(我知道我可以通过ssh进入本地主机,并且只能在ssh会话中获取正确的组。但这也太麻烦了。)

我在18.04中测试了sudo usermod -a -G group user,然后退出登录再重新登录,它有效果。 - Terrance
还有默认的桌面吗? - Ludwig Schulze
你是指GNOME、Xubuntu、Kubuntu等之间的区别吗?如果你是说GNOME是默认的,那么不,我不使用GNOME。但是命令应该是相同的,无论是哪个桌面环境,因为这些都是核心密码/组相关的内容,应该在所有桌面环境中都是一样的。 - Terrance
好的,我刚刚安装了GNOME进行测试,sudo usermod -a -G 组名 用户名在那里也正常工作。退出并重新登录后,我的更改生效了。 - Terrance
我知道了。@Terrance你没有使用默认桌面。默认桌面名称为"ubuntu"。我知道它基于Gnome,但我理解"Gnome"是另一个桌面环境。"ubuntu"被修改以类似Unity的外观。 - Ludwig Schulze
3个回答

命令loginctl terminate-user $USER对我有效。不过,当你已登录时最好不要运行此命令,因为它会终止所有进程。

已确认在Ubuntu 18.04上可正常工作。比ps和grep要简单得多! - AqD
同意,这个比我自己的解决方案打字更短。它也适用于Ubuntu 19.04。我选择了点赞并接受这个解决方案,而不是使用我自己的。 - Ludwig Schulze
1如果你将答案更新为loginctl terminate-user ${USER},你就不需要替换用户的指示了,尤其是因为这个问题是关于他们自己的用户的。甚至可以使用$(whoami) - perennial_noob
工作于20.04,并且它将终止用户发送给您的登录 :) - Aquarius Power

在Ubuntu 18.04中,“注销”默认桌面时,一些用户的进程不会立即终止,而是会持续存在。这些情况是由另一个用户观察到的:
$ ps axu | grep ^ludwig
ludwig    26508  0.3  0.2  77052  8308 ?        Ss   23:32   0:00 /lib/systemd/systemd --user
ludwig    26509  0.0  0.0 261776  2968 ?        S    23:32   0:00 (sd-pam)
ludwig    26691  0.2  0.3 381288 12204 ?        S<l  23:32   0:00 /usr/bin/pulseaudio --start --log-target=syslog
ludwig    27352  0.0  0.0  49796  3756 ?        Ss   23:33   0:00 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only

当在这些进程自愿退出之前重新登录时,不会创建新的登录会话,而是重用旧的会话。这就是为什么新的组成员资格不可见,它仍然是相同的旧登录会话的原因。
避免重新启动的一种解决方法是在注销后等待约20秒,然后再重新登录。在注销后的10至20秒之间,进程会退出。
编辑: 如下面的评论所述,有时即使等待,残留的进程也不会退出,并且在重新登录后,组成员资格也没有更新。我发现在这种情况下,以下操作有所帮助。
ps axu | grep ^ludwig | awk '{print $2}' | xargs kill -9

用你的用户名替换 ludwig。这将结束属于你的所有进程。请确保你已经保存了所有打开程序中的数据后再使用。


这是我的问题。但是在注销并等待后,进程并没有消失。 我不得不杀掉“systemd --user”进程,并运行“sudo systemctl daemon-reexec”。 还需要杀掉所有的dbus进程,因为重新启动systemd会搞乱dbus。 也需要重启网络管理器。“systemctl restart network-manager” 或许需要重启所有依赖于dbus/systemd的东西。 - niknah
1@niknah哦,那太糟糕了。听起来在你的情况下重新启动可能会更容易。谢谢你告诉大家这可能更困难。 - Ludwig Schulze
@niknah 今天我遇到了和你一样的问题。在退出登录并等待之后,一些进程就是无法停止。我找到了一个解决办法,并将在这个答案中更新。 - Ludwig Schulze

在当前的shell中,一个解决方法是运行"su "来获得新的组,而无需重新启动。
正如我所说,这个技巧必须应用于每个shell。这不是全局的。

1这可以用来修复在将用户添加到adbusers(也称为sudo usermod -a -G adbusers $USER)后,adb无法识别设备的问题。然后,您可以执行su $USERsudo adb kill-server && adb start-server来解决此问题。 - xdevs23