Почему мой терминал зависает?

11

Иногда, когда мой терминал зависает, и он не позволяет мне печатать. Я не могу определить ни причины, ни как поставить диагноз. Какие-либо предложения?

Благодарность!

GNOME Terminal 2.30.2 в Ubuntu 10.04

Дэвид Лебауэр
источник
2
обычно, когда терминал зависает, это вызвано другим приложением в фоновом режиме, использующим слишком много ресурсов, таких как процессор или дисковый ввод-вывод. Если вы работаете topв терминале, вы сможете легко найти проблему.
RolandiXor
@roland - звучит как уловка-22, но хороший совет, потому что иногда, когда один терминал завис, я могу открыть другой, и он будет работать.
Дэвид Лебауэр
Я точно знаю? :) Это что-то вроде ловушки-22, но это часто работает для меня.
RolandiXor

Ответы:

14

Хороший общий способ диагностики загадочных зависаний:

  1. откройте (другой) терминал и используйте, ps axo pid,wchan:32,cmdчтобы найти другой идентификатор процесса
  2. обратите внимание на wchanстолбец, который должен сказать вам, застрял ли он в ядре
  3. запустить sudo strace -p PIDвставив pid этого процесса; вставьте это в сообщение об ошибке или вопрос

Если в столбце wchan есть что-то, кроме тире, то процесс в ядре что-то делает. Некоторые типичные значения:

  • futex_wait_queue_me - ожидание на futex другого потока в том же процессе
  • poll_schedule_timeout - ожидание сетевого или межпроцессного взаимодействия, или просто поспать некоторое время
  • pipe_wait - чтение / запись трубы

Есть тысячи возможностей, поэтому я не могу перечислить их все. Смотрите, что такое «канал ожидания» процесса? для большего.

poolie
источник
Очень полезно для отслеживания ошибок общего назначения. Можете ли вы обновить свой ответ с некоторым подробным описанием? Какое сообщение в столбце wchan указывает на программу, которая застряла в ядре?
Салих Эмин
Спасибо, Салих. Может быть, у нас должен быть другой вопрос о том, как вообще диагностировать зависания?
пул
Если люди интересуются любыми другими значениями wchan, пожалуйста, добавьте комментарий.
пул
Любое wchanозначает, что процесс ожидает в ядре. Если он остается там в течение долгого времени и без веских причин, таких как прослушивание сети, то он застрял. ;)
Poolie
25

Ты случайно нажал Ctrl + S? Это клавиша паузы терминала, которая останавливает весь вывод, пока вы не нажмете Ctrl-Q для возобновления.

Мариус Гедминас
источник