当我启动(Ubuntu 18.04)时,systemd 正在用户 gdm 下启动 pulseaudio。我不想这样 - 我想以我的用户身份运行 pulseaudio,因为 gdm 和 mpd 下的 pulseaudio 存在问题。
所以我试图杀死它,但没有什么能杀死这个怪物。它不断重生。人们以前问过这个问题,以下所有解决方案均失败:
- 将“autospawn=no”添加到“/etc/pulse/client.conf” 将“autospawn=no”添加到“/var/lib/gdm3/.config/pulse/client.conf”
- 同时将“daemon-binary = /bin/true”添加到client.conf
- “sudo rm -f /etc/xdg/autostart/pulseaudio.desktop”
- “sudo systemctl kill pulseaudio”(返回“无法终止单元 pulseaudio.service:单元 pulseaudio.service 未加载。”)
- 删除 /etc/xdg/autostart/pulseaudio*
- systemctl --user 停止 pulseaudio.socket
- systemctl --user 停止 pulseaudio.service
- systemctl 禁用 pulseaudio
根据 pstree,它会不断被 systemd 使用用户 gdm 重新启动,如果我(以 root 身份)终止它,该进程就会终止,然后 systemd 会重新启动它。
但我不知道为什么 systemd 要启动它:
% systemctl --type=service | grep pulse
% systemctl list-units --type=service | grep pulse
事实上,systemctl 甚至认为它没有运行:
% systemctl | grep pulse
% systemctl --state=running | grep pulse
这就是为什么:
% systemctl disable pulseaudio
Failed to disable unit: Unit file pulseaudio.service does not exist.
并且 systemd 不承认启动它:
% systemd --test | grep -i pulse
Loaded units and determined initial transaction in 27ms.
但是 pstree 告诉我们它在撒谎:
% pstree
.....
|-systemd-+-(sd-pam)
...
| |-pulseaudio---{pulseaudio}
它也没有在 init.d 或 Xsession.d 脚本中列出:
% ls /etc/init.d/*pulse*
ls: cannot access '/etc/init.d/*pulse*': No such file or directory
% ls /etc/X11/Xsession.d/*pulse*
ls: cannot access '/etc/X11/Xsession.d/*pulse*': No such file or directory
尽管此文件确实存在:
/var/lib/gdm3/.config/systemd/user/sockets.target.wants/pulseaudio.socket 声称“WantedBy=sockets.target”不管这意味着什么..
我认为这可能部分是 systemd 的路径问题 - 它不在 /etc/systemd 路径中:
% find /etc/systemd/ -name '*pulse*'
但:
% find /usr/lib/systemd | grep pulseaudio
/usr/lib/systemd/user/pulseaudio.socket
/usr/lib/systemd/user/pulseaudio.service
我注意到其他人在 redhat 上也遇到了这个错误:
https://bugzilla.redhat.com/show_bug.cgi?id=1635119
令人沮丧的是,它被作为 NOTABUG 关闭,没有任何解释。
如何才能终止该进程并保持其终止状态,而无需采取诸如临时移动二进制文件之类的措施?
答案1
在文件中:
/usr/lib/systemd/user/pulseaudio.socket
/usr/lib/systemd/user/pulseaudio.service
就在下面这行:
ConditionUser=!root
添加:
ConditionUser=!gdm
就是这样!