В моем терминале иногда появляется следующее сообщение об ошибке:
Failed to open VDPAU backend libvdpau_nvidia.so: cannot open shared object file: No such file or directory
... что довольно раздражает.
Я искал в Интернете решения этой ошибки, но безуспешно.
Есть ли способ, по крайней мере, идентифицировать процесс, ответственный за отправку этих сообщений об ошибках на мой терминал?
Позвольте мне уточнить, , насколько я могу судить , эти сообщения об ошибках появляются "из ниоткуда". Фактически они отображаются асинхронно в отношении моих взаимодействий с терминалом (чаще всего я вижу их впервые, когда возвращаюсь к окну терминала, которое некоторое время оставалось без присмотра). Я уверен, что есть определенная, детерминистская причина для этих сообщений, но я не могу ее легко идентифицировать. Короче говоря, я не заметил какой-либо закономерности или закономерности их появления.
В частности, в моем случае их появление не имеет ничего общего с запущенным MPlayer или любой другой программой воспроизведения видео. (Пожалуйста, обратитесь к моему предыдущему сообщению об этом .) Во-первых, рассматриваемая машина является рабочей машиной, и я редко смотрю любые видео с ней. В тех немногих случаях, когда я смотрел видео на этой машине, я использовал VLC, а не MPlayer, и эти ошибки никогда не возникали в тех редких случаях, когда я использовал VLC.
Обычно, сообщения об ошибках в терминале не, появляются собой. Необходимо выполнить что-то, и это что-то должно перестать работать, и сообщение как это могло появиться. Посмотрите, например, это Вопросы и ответы: GNOME Mplayer: "Не удалось открыть бэкенд VDPAU libvdpau_nvidia.so" ошибка
Таким образом, каково приложение, которое Вы запустили из терминала, который производит такую ошибку?
Если это сообщение появляется при открытии терминала то посмотрите, добавили ли Вы что-то внутри .bashrc
файл или .profile
файл.
Обходное решение, которое работало на меня в подобном случае, было созданием ссылки, как описано в вышеупомянутом ответе (Ссылка, которую я дал).
lsof "$(tty)"
делает то, что вы просите, перечисляя, что ваш терминал открыт для чтения или записи.
Вы можете проверить, что было записано на ваш терминал, если он все еще имеет открытый терминал, что обычно имеет место, по крайней мере, если он все еще работает. Возможно, он вывел сообщение об ошибке на ваш терминал, закрыл для него дескриптор файла, но продолжил работу. Но более вероятная причина, по которой вы не сможете проверить, заключается в том, что сам процесс выполняется только периодически.
jobs
показывает ваши фоновые задания . Если вы запустили процесс самостоятельно с помощью &
, чтобы он выполнялся асинхронно - или приостановили его с помощью Ctrl kbd> + Z kbd> - и это все еще работает, тогда встроенная функция jobs
покажет его, если вы не disown
его редактировали. lsof "$(tty)"
перечисляет все, что ваш терминал открыт для чтения или записи . Это работает даже в редких случаях, когда что-то записывается на ваш терминал, даже если он не был запущен с него или не произошел от какого-то другого процесса, который был. Возможно, у вас есть много графических программ, в которых ваш терминал открыт для записи:
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 KBD>. Он появится в вашем первом терминале.
В первом терминале выполните любую из команд 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 kbd> + D kbd> в начале строки или просто нажав < kbd> Ctrl kbd> + C kbd>. Если вы наберете текст в строке, а затем нажмите Ctrl kbd> + D kbd>, это очистит ввод буфера, даже если вы не нажали Enter kbd>, и вы увидите текст на первом терминале.)
Хотя это общий ответ на вопрос о том, как найти то, что пишет на ваш терминал, и это может вам помочь, есть другие подходы, которые вы должны рассмотреть, для конкретной проблемы, которую вы описали здесь. Помимо сообщений ядра на виртуальных консолях - что это не так - сообщения, отображаемые на вашем терминале , обычно приходят от какой-то программы, которую вы запустили с вашего терминала, или какая-либо программа, запущенная одной из этих программ и т. д.
Как сказано в в ответе NickTh , если вы не запускаете вручную с терминала ничего, что может выдавать эти сообщения, проверьте файлы, которые может запускать ваша оболочка команды с момента его запуска , особенно .profile
и .bashrc
(как упоминает NickTh ), потому что это те, которые вы, вероятно, изменили.
Ошибка, которую вы видите, вероятно, не ошибка в самом MPlayer, а в используемой библиотеке, которая используется многими другими программами. Если вы запускаете какие-либо графические программы с вашего терминала - особенно если вы поместили их в фоновом режиме с помощью &
, поэтому они работают асинхронно с вашей оболочкой - тогда одна или несколько из них почти наверняка причина, по которой вы видите эти сообщения. Веб-браузеры, скорее всего, будут их создавать, в основном потому, что они могут запускать плагины, такие как Adobe Flash, которые используют уязвимую библиотеку.
На Launchpad сообщается о нескольких ошибках, связанных с сообщениями об ошибках, подобных этой. Ошибка 808254 особенно похожа на то, что вы описали. Ошибка 1300215 особенно заметна, хотя в ней используется видеодрайвер Intel. Вы можете найти на Launchpad текст из сообщения , чтобы найти больше ошибок. В таких отчетах об ошибках и их комментариях вы можете найти обходные пути - либо просто для того, чтобы заставить сообщения замолчать, либо для более подробной информации об ошибке. Кроме того, в то время как другой вопрос , связанный с ответом NickTh , касается проблемы, он возникает в MPlayer и имеет несколько обходных путей для MPlayer в качестве ответов, в настоящее время получивший наибольшее количество голосов ответ не относится к MPlayer и может работать на вас.
Если вы запускаете много программ с вашего терминала, вы, возможно, видели много записей в выходных данных lsof
(если вы решили использовать этот метод при устранении неполадок). Один из способов выяснить, какая программа генерирует вывод, - запускать ваши программы с отдельных терминалов. Это работает, даже если ваши отдельные терминалы запускаются друг от друга - эмулятор терминала GUI, такой как GNOME Terminal, не передает сообщения об ошибках или другой текст, который отображается до терминала из который сам был запущен (если есть). Точно так же, один из способов перестать беспокоить эту проблему - предполагая, что раздражающие сообщения - единственная реальная проблема - это не запускать вещи с вашего терминала, которые вы не хотите выводить с вашего терминала. Обычно вы можете достичь этого, используя вместо этого свои графические меню. Но, пожалуйста, обратитесь к началу этого ответа, чтобы узнать, почему вы работаете с вашего терминала больше, чем вам нужно или вы намерены.