如何识别向终端发送错误消息的进程?

如何识别向终端发送错误消息的进程?

我的终端中偶尔会出现以下错误消息:

Failed to open VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such file or directory

...这很烦人。

我已在线搜索此错误的解决方案,但没有成功。

有没有什么方法可以至少识别出负责向我的终端发送这些错误消息的进程?

让我澄清一下,据我所知,这些错误消息“突如其来”地出现。事实上,它们与我与终端的交互是异步出现的(通常,当我返回一段时间无人看管的终端窗口时,我才会第一次看到它们)。我确信这些消息肯定有确定的原因,但我无法轻易识别。简而言之,我没有注意到它们出现的任何模式或规律。

尤其是我的情况它们的出现与运行 MPlayer 或任何其他视频播放程序无关。 (请参阅我之前发布过关于它的帖子。)首先,有问题的机器是一台工作机器,我很少用它看视频。在极少数情况下,我用这台机器看视频时使用的是 VLC,而不是 MPlayer,而这些错误从未在我使用 VLC 的少数情况下出现过。

答案1

lsof "$(tty)"按照您的要求进行操作,列出您的终端打开以进行读取或写入的内容。

如果您的终端仍处于打开状态,您可以检查写入终端的内容,通常情况如此,至少如果它仍在运行。它可能会向您的终端输出错误消息,关闭文件描述符,但仍继续运行。但您无法检查的更可能的原因是,如果进程本身仅间歇性运行。

  • jobs显示你的后台作业. 如果您自己运行了该过程&因此它异步运行 - 或者用Ctrl+暂停它Z- 并且它仍在运行,那么jobs内置命令将显示它,除非您已经disown编辑它。
  • 如果这还不够的话,lsof "$(tty)"列出你的终端打开以供读取或写入的所有内容。即使在某些程序从未从终端启动或从其他进程继承的情况下写入终端的罕见情况下,这种方法也能发挥作用。
  • 但针对您的具体情况,我建议您阅读此答案末尾解决该错误消息的部分。

你可能许多打开终端进行写入的图形程序:

  • 如果您从终端运行桌面环境的主要部分(启动许多其他程序)(例如 Unity 或其他图形 shell),则可能会发生这种情况。
  • unity --replace &特别是,如果你从终端运行了类似的命令,这可以解释其中出现的应用程序意外错误
  • 那么,如果您的目标是让消息静音,您要么不运行它,要么以不同的方式运行它(或从不同的终端运行)。最好的方法取决于您运行它的原因。
  • 你可以运行pstree看到你的进程树,这可能会有帮助。

您的终端设备是一个“文件”您可以将其文件名传递给lsof

您可以通过将路径传递给其来获取当前终端(运行命令的终端)打开以进行读取或写入的进程列表设备节点lsof命令。由于tty输出该路径,您可以运行它,然后lsof按照它显示的内容运行,或者您可以使用以下任一项:

lsof "$(tty)"        # "$(tty)" may expand to /dev/tty1, /dev/pts/0, /dev/pts/1, etc.
lsof $(tty)          # bad form, but device names rarely have whitespace/globbing characters
lsof `tty`           # same as above, just with the old disfavored backtick syntax
lsof /proc/$$/fd/1   # the shell expands $$ to its own process ID (fd/0, fd/1, or fd/2 work)

lsof如果你在终端中运行的唯一程序是你的 shell 以及它自己,那么输出通常看起来像这样:

lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
      Output information may be incomplete.
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    27763   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    2u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek  255u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29311   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29311   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29311   ek    2u   CHR  136,0      0t0    3 /dev/pts/0

如果你正在运行更多从终端读取或写入的内容,它们应该会显示出来。请注意上面显示的命令必须从您看到烦人消息的终端运行。您也可以从单独的终端执行此操作,但必须提供lsof您感兴趣的终端的路径。例如,您可以tty在想要了解的终端中运行,然后使用它显示的路径作为您想要从中运行它的终端中的参数lsof

关于访问和权限,您可能想知道:

  • 警告tracefs可能会出现,也可能不会出现。无论哪种情况,您也许不必担心。通常是因为调试文件系统完全不可用,而不是受到限制,所以...
  • 它是可能的lsof以 root 身份运行可能会对您有所帮助sudo,但可能并非如此。通常您可以查看有关所有进程的信息,即使您的系统配置不允许这样做,执行此操作的任何进程可能都是以您的身份运行的。

有些进程会出现多次,因为它们打开了你的终端不止一次。我并不建议尝试仅显示终端打开的进程但是,因为:

  • 当同一个过程出现多次时,它们会一起显示,因此额外的条目不会造成混淆。
  • 除了你的 shell 和你从中运行的程序之外,很少有其他东西阅读从您的终端。您通常可以使用jobsanyway 查看这些内容,这样每个进程只显示一行(或更少)。如果您使用的是lsof,您需要详细信息。
  • 只出现一次的进程会让你的终端只为写入(或只为读取)而打开,这些进程特别令人感兴趣。

一个lsof例子:cat从一个终端到另一个终端。

你不必这么做——这真的只是一个演示。本节存在的唯一原因是:

  • 您可能无法在输出中看到任何可以解释您的问题的内容lsof,并且希望得到某种确认,即它确实显示了写入终端的进程,即使这些进程不是从终端启动的。
  • 您可能对其工作原理感兴趣并想在您可控制的情况下尝试一下。
  • 由于不同原因对该主题感兴趣的其他读者可能希望获得比上一节更多的解释,以便他们可以弄清楚如何使用它来解决自己的不同问题。

如果您只是tty在终端中运行,它会自行打印到终端设备节点的路径:

ek@Io:~$ tty
/dev/pts/0

这并不总是如此/dev/pts/0。您可以打开另一个终端并运行tty,路径会有所不同。继续这样做。

在第二个终端中,运行cat但将其输出重定向到第一个终端。为此,运行此命令但将其替换为在第一个终端中运行它时显示的/dev/pts/0内容:tty

cat >/dev/pts/0

在第二个终端中输入文本并按Enter它将出现在您的第一个终端中。

lsof在第一个终端中,运行上面显示的任何命令。

ek@Io:~$ lsof "$(tty)"
lsof: WARNING: can't stat() tracefs file system /sys/kernel/debug/tracing
      Output information may be incomplete.
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
bash    27763   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek    2u   CHR  136,0      0t0    3 /dev/pts/0
bash    27763   ek  255u   CHR  136,0      0t0    3 /dev/pts/0
cat     29476   ek    1w   CHR  136,0      0t0    3 /dev/pts/0
lsof    29479   ek    0u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29479   ek    1u   CHR  136,0      0t0    3 /dev/pts/0
lsof    29479   ek    2u   CHR  136,0      0t0    3 /dev/pts/0

您的终端不会突出显示该行cat——我这样做只是为了显示差异。

cat(在正在运行的第二个终端中,您可以通过在行首按Ctrl+来退出它,或者直接按+ 。如果您在一行中键入文本,然后按+ ,则即使您没有按 ,也会刷新输入缓冲区,并且您将在第一个终端上看到文本。)DCtrlCCtrlDEnter

调试“无法打开 VDPAU 后端”错误

虽然这是对如何找到写入终端的内容这一问题的一般性回答,并且可能对您有所帮助,但对于您在此处描述的特定问题,您还应该考虑其他方法。除了内核消息虚拟控制台--这不是--你的终端上显示的消息通常来自你从终端运行的某个程序,或者来自某个程序那些程序已经运行等等

作为NickTh 的回答说,如果你没有从终端手动运行任何似乎可以产生这些消息的东西,请检查shell 启动时可能运行命令的文件,尤其.profile.bashrc(如NickTh 提到) 因为这些可能是您已经修改过的内容。

您看到的错误可能不是 MPlayer 本身的错误,而是它使用的库中的错误,该库被许多其他程序使用。如果您正在运行任何如果您从终端运行图形程序(尤其是如果您使用 将它们置于后台&,因此它们与您的 shell 异步运行),那么其中一个或多个几乎肯定是您看到这些消息的原因。Web 浏览器特别有可能产生这些消息,主要是因为它们可能运行使用受影响库的插件(例如 Adob​​e Flash)。

Launchpad 上报告了许多与此类似的错误消息相关的错误。错误 808254与您描述的特别相似。错误 1300215尤其突出,尽管它涉及英特尔视频驱动程序。您可以在 Launchpad 上搜索消息中的文本找到更多错误。您可能会发现解决方法——要么只是让消息保持沉默,要么针对错误采取更多措施——在此类错误报告及其评论中。此外,虽然另一个问题链接到NickTh 的回答是有关该问题是否发生在 MPlayer 中,并有几种针对 MPlayer 的解决方法作为答案,目前得票最高的答案并非特定于 MPlayer,并且可能适合您。

如果您从终端运行许多程序,您可能已经在输出中看到许多条目lsof(如果您决定在故障排除中使用该方法)。找出哪个程序正在生成输出的一种方法是从单独的终端运行程序。即使您的单独终端已启动,这种方法也有效彼此--GNOME Terminal 等 GUI 终端仿真器不会传递错误消息或其他文本显示到它本身运行的终端(如果有的话)。同样,避免被这个问题困扰的一种方法——假设烦人的消息是唯一真正的问题——是不从终端运行你不想在终端中输出的东西。通常,你可以通过使用图形菜单来实现这一点。但请参阅此答案的顶部,了解为什么你可能从终端运行了比你需要或打算的更多的内容。

答案2

通常,终端中的错误消息不会自动出现。您必须运行某些东西,而这些东西必须失败,并且可能会出现这样的消息。例如,请参阅此问答: GNOME Mplayer:“无法打开 VDPAU 后端 libvdpau_nvidia.so”错误

那么,您在终端内运行的哪个应用程序导致了这样的错误?

如果打开终端时出现此消息,则查看是否在.bashrc文件或.profile文件内部添加了某些内容。

在类似情况下对我有用的解决方法是创建一个如上述答案所述的链接(我给出的链接)。

相关内容