Как определить процесс отправки сообщений об ошибках на терминал?

В моем терминале иногда появляется следующее сообщение об ошибке:

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

... что довольно раздражает.

Я искал в Интернете решения этой ошибки, но безуспешно.

Есть ли способ, по крайней мере, идентифицировать процесс, ответственный за отправку этих сообщений об ошибках на мой терминал?

Позвольте мне уточнить, , насколько я могу судить , эти сообщения об ошибках появляются "из ниоткуда". Фактически они отображаются асинхронно в отношении моих взаимодействий с терминалом (чаще всего я вижу их впервые, когда возвращаюсь к окну терминала, которое некоторое время оставалось без присмотра). Я уверен, что есть определенная, детерминистская причина для этих сообщений, но я не могу ее легко идентифицировать. Короче говоря, я не заметил какой-либо закономерности или закономерности их появления.

В частности, в моем случае их появление не имеет ничего общего с запущенным MPlayer или любой другой программой воспроизведения видео. (Пожалуйста, обратитесь к моему предыдущему сообщению об этом .) Во-первых, рассматриваемая машина является рабочей машиной, и я редко смотрю любые видео с ней. В тех немногих случаях, когда я смотрел видео на этой машине, я использовал VLC, а не MPlayer, и эти ошибки никогда не возникали в тех редких случаях, когда я использовал VLC.

3
задан 22 September 2017 в 20:50

2 ответа

Обычно, сообщения об ошибках в терминале не, появляются собой. Необходимо выполнить что-то, и это что-то должно перестать работать, и сообщение как это могло появиться. Посмотрите, например, это Вопросы и ответы: GNOME Mplayer: "Не удалось открыть бэкенд VDPAU libvdpau_nvidia.so" ошибка

Таким образом, каково приложение, которое Вы запустили из терминала, который производит такую ошибку?

Если это сообщение появляется при открытии терминала то посмотрите, добавили ли Вы что-то внутри .bashrc файл или .profile файл.

Обходное решение, которое работало на меня в подобном случае, было созданием ссылки, как описано в вышеупомянутом ответе (Ссылка, которую я дал).

1
ответ дан 22 September 2017 в 20:50

lsof "$(tty)" делает то, что вы просите, перечисляя, что ваш терминал открыт для чтения или записи.

Вы можете проверить, что было записано на ваш терминал, если он все еще имеет открытый терминал, что обычно имеет место, по крайней мере, если он все еще работает. Возможно, он вывел сообщение об ошибке на ваш терминал, закрыл для него дескриптор файла, но продолжил работу. Но более вероятная причина, по которой вы не сможете проверить, заключается в том, что сам процесс выполняется только периодически.

  • jobs показывает ваши фоновые задания . Если вы запустили процесс самостоятельно с помощью & , чтобы он выполнялся асинхронно - или приостановили его с помощью Ctrl + Z - и это все еще работает, тогда встроенная функция jobs покажет его, если вы не disown его редактировали.
  • В случае, если этого недостаточно, lsof "$(tty)" перечисляет все, что ваш терминал открыт для чтения или записи . Это работает даже в редких случаях, когда что-то записывается на ваш терминал, даже если он не был запущен с него или не произошел от какого-то другого процесса, который был.
  • Но для вашей конкретной ситуации я рекомендую прочитать часть в конце этого ответа, которая касается этого сообщения об ошибке.

Возможно, у вас есть много графических программ, в которых ваш терминал открыт для записи:

  • Это может произойти, если вы выполняете основную часть среда вашего рабочего стола (которая запускает много других программ) из вашего терминала, например Unity или другой графической оболочки.
  • В частности, если вы запустили команду, подобную 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:

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, но, вероятно, нет. Обычно вы можете просматривать информацию обо всех процессах, и даже если ваша система настроена так, чтобы не допускать этого, то, что бы вы ни делали, это, вероятно, работает в любом случае.

Некоторые процессы появляются более одного раза, потому что они открывают ваш терминал более одного раза . Я действительно не рекомендую пытаться показывать только процессы, в которых ваш терминал открыт для записи, однако , потому что:

  • Когда один и тот же процесс появляется несколько раз, они отображаются вместе. поэтому дополнительные записи не должны сбивать с толку.
  • Редко что-нибудь, кроме вашей оболочки и программ, которые вы запускаете из нее, читает из вашего терминала. Обычно вы можете просмотреть их с помощью jobs в любом случае, что дает одну строку (или меньше) на процесс. Если вы используете 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 + D в начале строки или просто нажав < kbd> Ctrl + C . Если вы наберете текст в строке, а затем нажмите Ctrl + D , это очистит ввод буфера, даже если вы не нажали Enter , и вы увидите текст на первом терминале.)

Отладка «Не удалось открыть внутреннюю часть VDPAU» Ошибки

Хотя это общий ответ на вопрос о том, как найти то, что пишет на ваш терминал, и это может вам помочь, есть другие подходы, которые вы должны рассмотреть, для конкретной проблемы, которую вы описали здесь. Помимо сообщений ядра на виртуальных консолях - что это не так - сообщения, отображаемые на вашем терминале , обычно приходят от какой-то программы, которую вы запустили с вашего терминала, или какая-либо программа, запущенная одной из этих программ и т. д.

Как сказано в в ответе NickTh , если вы не запускаете вручную с терминала ничего, что может выдавать эти сообщения, проверьте файлы, которые может запускать ваша оболочка команды с момента его запуска , особенно .profile и .bashrc (как упоминает NickTh ), потому что это те, которые вы, вероятно, изменили.

Ошибка, которую вы видите, вероятно, не ошибка в самом MPlayer, а в используемой библиотеке, которая используется многими другими программами. Если вы запускаете какие-либо графические программы с вашего терминала - особенно если вы поместили их в фоновом режиме с помощью &, поэтому они работают асинхронно с вашей оболочкой - тогда одна или несколько из них почти наверняка причина, по которой вы видите эти сообщения. Веб-браузеры, скорее всего, будут их создавать, в основном потому, что они могут запускать плагины, такие как Adobe Flash, которые используют уязвимую библиотеку.

На Launchpad сообщается о нескольких ошибках, связанных с сообщениями об ошибках, подобных этой. Ошибка 808254 особенно похожа на то, что вы описали. Ошибка 1300215 особенно заметна, хотя в ней используется видеодрайвер Intel. Вы можете найти на Launchpad текст из сообщения , чтобы найти больше ошибок. В таких отчетах об ошибках и их комментариях вы можете найти обходные пути - либо просто для того, чтобы заставить сообщения замолчать, либо для более подробной информации об ошибке. Кроме того, в то время как другой вопрос , связанный с ответом NickTh , касается проблемы, он возникает в MPlayer и имеет несколько обходных путей для MPlayer в качестве ответов, в настоящее время получивший наибольшее количество голосов ответ не относится к MPlayer и может работать на вас.

Если вы запускаете много программ с вашего терминала, вы, возможно, видели много записей в выходных данных lsof (если вы решили использовать этот метод при устранении неполадок). Один из способов выяснить, какая программа генерирует вывод, - запускать ваши программы с отдельных терминалов. Это работает, даже если ваши отдельные терминалы запускаются друг от друга - эмулятор терминала GUI, такой как GNOME Terminal, не передает сообщения об ошибках или другой текст, который отображается до терминала из который сам был запущен (если есть). Точно так же, один из способов перестать беспокоить эту проблему - предполагая, что раздражающие сообщения - единственная реальная проблема - это не запускать вещи с вашего терминала, которые вы не хотите выводить с вашего терминала. Обычно вы можете достичь этого, используя вместо этого свои графические меню. Но, пожалуйста, обратитесь к началу этого ответа, чтобы узнать, почему вы работаете с вашего терминала больше, чем вам нужно или вы намерены.

0
ответ дан 22 September 2017 в 20:50
  • 1
    положительная сторона, но я думаю, что это рекомендуемо сначала для рассмотрения ignorelist прежде, чем запустить rsync – rubo77 4 November 2014 в 21:17
  • 2
    положительная сторона, но я думаю, что это рекомендуемо сначала для рассмотрения ignorelist прежде, чем запустить rsync – rubo77 4 November 2014 в 21:17
  • 3
    положительная сторона, но я думаю, что это рекомендуемо сначала для рассмотрения ignorelist прежде, чем запустить rsync – rubo77 4 November 2014 в 21:17
  • 4
    положительная сторона, но я думаю, что это рекомендуемо сначала для рассмотрения ignorelist прежде, чем запустить rsync – rubo77 4 November 2014 в 21:17
  • 5
    положительная сторона, но я думаю, что это рекомендуемо сначала для рассмотрения ignorelist прежде, чем запустить rsync – rubo77 4 November 2014 в 21:17
  • 6
    положительная сторона, но я думаю, что это рекомендуемо сначала для рассмотрения ignorelist прежде, чем запустить rsync – rubo77 4 November 2014 в 21:17

Другие вопросы по тегам:

Похожие вопросы: