cupsd 使用 100% 的 CPU,导致生成大型(超过80GB)的 error_log。

几天前,我意识到我的Ubuntu机器在登录后无法加载。在一张LiveCD上进行了一些挖掘后,我发现我的硬盘已经满了100%,所以我删除了一些大文件,然后成功登录了。我不再拥有sudo权限,不得不进入恢复模式并更改sodoers文件,最终恢复了root权限。
然后我注意到我的机器有点慢,top显示cupsd占用了100%的CPU。我以前从未见过这个程序,但很快意识到它是一个合法的程序。
于是我删除了大约40GB的视频,结果看到我的磁盘空间几乎在眼前迅速减少。通过一些研究和直觉,我意识到可能是一个日志文件被撑大了,果然ls -lh /var/log/cups/显示了一个80GB+大小的error_log文件。
我使用sudo rm -rf /var/log/cups/error_log命令删除了该文件,然后用sudo service cups end命令停止了服务,然后继续处理其他事情。之后我意识到在删除之前查看error_log的内容可能是个好主意,但我想在再次被锁定之前先摆脱这个问题。
那是昨天的事了。今天,我再次启动我的笔记本电脑,发现cupsd再次以100%的CPU运行,并且我确实看到我的磁盘空间在减少。我停止了服务并运行了tail -f /var/log/cups/error_log命令,结果出现了数百万行的这种错误信息:
W [15/Jul/2015:11:23:03 -0700] Notifier for subscription 911 (dbus://) went away, retrying!
E [15/Jul/2015:11:23:03 -0700] File "/usr/lib/cups/notifier/dbus" has insecure permissions (0100777/uid=0/gid=0).

==编辑=================================================================

ls -l /usr/lib/cups/notifier/dbus显示权限和所有权为-rwxrwxrwx 1 root root,而它们应该是-rwxr-xr-x 1 daemon root,正如评论中所述。使用sudo chown root:root /usr/lib/cups/notifier/dbus也无法解决这些所有权问题。

最后,我尝试了移除并重新安装cups,但没有效果。这些链接被给出作为潜在有用的指南(意外在/上进行了chmod -R,恢复chown权限),但它们最终建议重新安装操作系统本身。


ls -l /usr/lib/cups/notifier/dbus 的输出是什么?很久以前我遇到过类似的问题,唯一简单的解决方法就是禁用CUPS...(那时就无法打印了) - Wilf
1-rwxrwxrwx 1 root 14k Sep 5 2014 /usr/lib/notifier/dbus - wndg
1杯子到底有什么作用呢?我的意思是,如果它可以被禁用而不会造成严重后果的话…… - wndg
1它负责大部分打印工作,所以没有它就无法打印。我认为文件的权限应该是-rwxr-xr-x(这是我在Ubuntu 14.04上安装时的权限),所以你可以尝试通过运行sudo chmod 755 /usr/lib/cups/notifier/dbus来解决问题(然后重新启动CUPs或计算机)。 - Wilf
1打印是指打印纸吗?权限现在是-rwxr-xr-x,但是重启cupsd后仍然以95%+的速度运行,并创建大型error_log文件(尽管似乎不那么快?)。 - wndg
日志的内容有变化吗?打印,就像打印纸一样,是的,一些PDF打印文件可能也需要它。 - Wilf
首先,很抱歉回复不连续,我们刚刚取消了家里的无线网络,我现在是用手机上网。日志中有相同的错误信息。 - wndg
4个回答

对于Ubuntu 15.10,对我有效的方法是:
sudo service cups stop
sudo rm /etc/cups/subscriptions.conf*
sudo rm -r /var/cache/cups
sudo service cups start

(如果你无法停止杯子,请尝试)
ps aux | grep cups

从输出中获取进程ID(pid)并:

kill -9 (pid you have learned here)

2我做了这个,它确实有帮助,但只能持续到我重新启动电脑。有没有办法让这个保持下去? - tobias_k

在Debian 9上

  1. user@machine: sudo su

  2. root@machine:

chown -R root:root /usr/lib/cups/* && \
chmod -R 755 /usr/lib/cups/* && \
/etc/init.d/cups restart

返回:通过systemctl cups.service重新启动cups,并保存我的日志和我的CPU。

我无法评论,所以这是以回答的形式呈现:
sudo chown root:root /usr/lib/cups/notifier/dbus

可能会有所帮助,现在你已经拥有了正确的权限。你系统上的用户1是谁?如果你不知道文件的权限/所有权是如何从默认值改变的,那么问题可能只是冰山一角。如果是这样的话,建议重新安装。

我运行了命令并重新启动,但似乎没有任何变化。不确定如何找出用户1是谁。你认为可能是你所说的“冰山的一角”是什么呢...? - wndg
在一个新安装的Ubuntu系统上,用户1是守护进程(daemon)。你的ls命令返回-rwxrwxrwx 1 root而不是-rwxr-xr-x daemon root,这表明系统文件可能损坏或丢失。守护进程用户1在/etc/passwd中没有与之关联的名称。 - JEL
我刚刚查看了/etc/passwd,发现用户1是daemon,但我猜你说我的问题与此无关。那么我该如何找到用户1是谁呢? - wndg
如果用户1在passwd中是守护进程,那么ls应该显示该用户拥有dbus文件。你尝试重新安装cups了吗?确保先备份/etc/cups。 - JEL
编辑: id daemon 给我返回了 uid=1(daemon) gid=1(daemon) groups=1(daemon) - wndg
我可以试一试,但是我需要先找到互联网。 - wndg
你所做的任何本地配置都应该在你备份的/etc/cups中得到保留,因此你可以从那里恢复它。重新安装后,请检查ls -l命令对于dbus文件的输出是否正确:用户为root,组为root,权限如之前所述。 - JEL
看一下这个讨论,还有:http://askubuntu.com/questions/43621/what-if-i-accidently-run-command-chmod-r-on-system-directories-etc - JEL
这个讨论http://askubuntu.com/questions/300557/how-to-restore-the-default-chown-permissions-on-a-directory-file描述了与您所描述的非常相似的症状,包括错误日志消息失控。该讨论提到了我之前评论中链接的讨论,并且两者的结论是建议重新安装整个系统。祝好运。 - JEL
我已重新下载了 cups (sudo apt-get remove cups, sudo apt-get install cups),在安装过程中,我注意到了这条消息:警告: / 是可写的!警告: / 是组可写的!警告: /usr/sbin/ufw 是可写的!警告: /usr/sbin/ufw 是组可写的!警告: /usr/sbin 是可写的!警告: /usr/sbin 是组可写的!警告: /usr 是可写的!警告: /usr 是组可写的!此外,ls -l /usr/lib/cups/notifier/dbus 仍然显示为 root root。 - wndg
我猜这个文件已经被root所拥有,根据rwxrwxrwx 1 root 14k Sep 5 2014 /usr/lib/notifier/dbusls-l输出来看。@wndg,你能否将这些信息编辑到你的问题中,以便阅读?你是否曾经修改过/的权限(禁用CUPS是否是一个合适的答案)? - Wilf
@wndg,那些警告是关于我之前提到的冰山。如果你想尝试修复权限/所有权问题,请参考我提供的链接,了解一些可能的技巧,但最省时的解决方案可能是重新安装Ubuntu。一定要备份任何重要的配置更改以及个人文件,并在替换保存的配置文件等时仔细检查权限和所有权。在新的安装中。 - JEL
我想我要重新安装一下。我已经使用稳定的Ubuntu机器两年了,似乎发生了一些奇怪的事情,可能是因为我或者与我有关。@Wilf,我不记得曾以那种方式修改过权限。我能记得的最后一件事是,在我将朋友的iPhone连接到电脑上取一些照片之后,这一切就开始了。谢谢大家的帮助。 - wndg
我不小心使用chown命令弄乱了我的权限和所有权,作用于根目录(/)。花了一个晚上来解决这个问题,但是几天前我看到了你的解决方案。它立刻解决了我的问题。如果有人遇到类似的情况,我把这个写在评论里。 - Thermal_insulator

只需按照以下步骤操作,对我来说有效:
1)sudo chmod 755 /usr/lib/cups/notifier/
2)ll /usr/lib/cups/notifier/
3)sudo /etc/init.d/cups restart
完成了!

3请您能否评论一下这个具体是做什么的,或者为什么它能解决问题? - tobias_k