Ошибка загрузки с помощью xubuntu 16.04.4 LTS после обновления ядра до 4.4.0-119 и выше

В ситуации с одним пользователем, если взять пример xterm, мы можем просто подсчитать количество pids из xterm; xterm создает отдельный pid для каждого окна. gnome-terminal однако запускает один pid, но хорошей новостью является то, что он создает дочерний процесс для каждого окна и / или вкладки. мы можем восстановить эти дочерние процессы с помощью команды:

pgrep -P <pid_of_gnome-terminal>

Однако есть несколько осложнений:

Считая ваш вопрос, мы можем предположить, что пользователь в этом случае фактически является владельцем x-сессии. Обычно мы можем просто использовать $USER -variable, но это может не соответствовать зарегистрированному в данный момент пользователю $DISPLAY. В многопользовательской ситуации pids, принадлежащие терминальному приложению (или который), необязательно относятся к текущему $DISPLAY. Нам нужно отделить только соответствующие pids и child-pids. В Unity (15.10 или ниже), если второй пользователь входит в систему, запускается дополнительный процесс (gnome-pty-helper), который появляется как дочерний процесс в gnome-terminal, но процесс (очевидно) не имеет окна или вкладки. В Mate процесс все равно существует.

Короче

Чтобы подсчитать количество вкладок и / или окон терминального приложения, нам необходимо:

Читая ваш вопрос, мы может предположить, что пользователь в этом случае фактически является владельцем x-сессии. Обычно мы можем просто использовать $USER -variable, но это может не соответствовать зарегистрированному пользователю $DISPLAY. Из запущенных процессов отделяются только соответствующие pids, работающие на этом $DISPLAY В многопользовательской ситуации pids, принадлежащие терминальному приложению (или который), необязательно относятся к текущему $DISPLAY. Нам нужно отделить только соответствующие pids и child-pids.

Это может быть очень хорошо написано, чтобы надежно найти количество открываемых в настоящее время окон и / или вкладок.

Сценарий

В приведенном ниже сценарии целевое приложение терминала используется в качестве аргумента. Скрипт работает на многих терминалах, на которых я тестировал его. Исключением является Tilda в этот момент.

Пример

Из запущенных процессов отделяются только соответствующие pids, работающие на этом $DISPLAY [!d18 ]

Команда:

/path/to/get_terms.sh gnome-terminal

выходы:

3

, а

/path/to/get_terms.sh xterm
[d36 ]:

2

Сценарий

#!/bin/bash

terminal=$1

# get the user running the current x-session
username=$(who | grep $DISPLAY | head -1 | awk '{print $1}')
# get the pid of the terminal for the current user
userpid=$(pgrep -u $username $terminal)
# check what type the terminal is (multi pid/single pid)
npids="$(echo "$userpid" | wc -w)"
# in case of a single pid, count the children
if [ "$npids" -eq 1 ]; then
  # check if gnome-pty-helper runs (starts when multiple users are logged in)
  ptpid=$(pgrep gnome-pty-helpe)
  # get number of child- procs
  let "orig = $( pgrep -P $(pgrep -u $username $terminal) | wc -w )" 
  # if pty-helper runs, correct the number of child procs
  if [ -n "$ptpid" ] && [ -n "$userpid" ]; then
    let "n_terms = $orig-1"; else let "n_terms = $orig"
  fi
  # if no child procs run, n-terminals = n-counted pids (difference Mate <> Unity)
  if [ "$n_terms" -eq 0 ]; then echo $orig; else echo $n_terms; fi
# in case of multiple pids, count the pids
elif [ "$npids" -gt 1 ]; then echo $npids
fi

Использовать

Считая ваш вопрос, мы можем предположить, что пользователь в этом случае фактически является владельцем x-сессии. Обычно мы можем просто использовать $USER -переменная, но это может не соответствовать зарегистрированному пользователю $DISPLAY.

/path/to/get_terms.sh <terminal_application>
1
задан 25 April 2018 в 17:28

4 ответа

ядро ​​4.4.0-122 снова работает отлично, пока это не было. Я продолжал использовать 4.4.0-116. Что касается вас, то 119 и 121 не загрузились для меня.

1
ответ дан 17 July 2018 в 16:10

Итак, никакой помощи отсюда. К счастью, это не было опасной для жизни ситуацией, и я смог загрузить машину, используя 4.4.0.116. Но реальным решением было обновление всей ОС до 18.04 LTS. Но было бы неплохо узнать, что вызвало этот неожиданный провал.

Но случай закрыт - ответ заключается в том, чтобы перейти к следующей версии LTS.

1
ответ дан 17 July 2018 в 16:10

ядро ​​4.4.0-122 снова работает отлично, пока это не было. Я продолжал использовать 4.4.0-116. Что касается вас, то 119 и 121 не загрузились для меня.

1
ответ дан 23 July 2018 в 17:04

Итак, никакой помощи отсюда. К счастью, это не было опасной для жизни ситуацией, и я смог загрузить машину, используя 4.4.0.116. Но реальным решением было обновление всей ОС до 18.04 LTS. Но было бы неплохо узнать, что вызвало этот неожиданный провал.

Но случай закрыт - ответ заключается в том, чтобы перейти к следующей версии LTS.

1
ответ дан 23 July 2018 в 17:04

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

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