Как перезапустить GNOME Shell из командной строки?

Я хотел бы реализовать сочетание клавиш для перезапуска gnome-shell всякий раз, когда происходит сбой (некоторые ошибки в настоящее время еще не исправлены). Для этого мне понадобится командная строка, чтобы перезапустить оболочку.

То Alt+F2 и restart команда не будет работать при сбое оболочки, потому что реализована подсказка в раковина.

Следовательно, как перезапустить gnome-shell из командной строки?

GNOME Shell 3.30.1 на Ubuntu 18.10

Команда для замены gnome-shell будет посылать СИГКВИТ сигнал к нему с помощью:

killall -3 gnome-shell

или:

killall -SIGQUIT gnome-shell

Начиная с GNOME Shell 3.30.1 в Ubuntu 18.10, приведенное ниже решение больше не работает и приведет пользователя к экрану входа в систему, потеряв всю его работу.

До GNOME Shell 3.30.1

Команда для замены gnome-shell было бы:

gnome-shell --replace &

Амперсанд добавляется для возврата командной строки после выполнения команды; нажатие Ctrl+C или закрытие терминала вместо этого сделало бы рабочий стол непригодным для использования и потребовало бы полной перезагрузки.

Из страница руководства от gnome-shell:

-r, --заменить       Замените запущенный оконный менеджер

Не уверены, какую версию вы используете?

Команда для проверки вашей версии GNOME Shell выглядит следующим образом:

gnome-shell --version

Самый простой способ - это Alt+F2 и введите r затем .

Начиная с GNOME Shell 3.30.1: Вы также можете выполнить killall -3 gnome-shell.

В случае, если весь gnome-shell завис есть способ, как перезапустить его из терминала, не перезапуская все окно X:

  • Ctrl+Alt+F2 для переключения на терминал
  • войдите в систему, используя свои учетные данные (имя пользователя и пароль), а затем запустите:
  • DISPLAY=:0 gnome-shell -r &
  • выйти из системы exit и
  • Alt+F1 чтобы вернуться к графическому интерфейсу X Window.

Перед GNOME Shell 3.30.1 команда должна быть просто gnome-shell --replace.

Гном 40 эквивалент Alt+F2 restart является:

busctl --user call org.gnome.Shell /org/gnome/Shell org.gnome.Shell Eval s 'Meta.restart("Restarting…")'

Я сам получил этот совет от https://www.linuxuprising.com/2020/07/how-to-restart-gnome-shell-from-command.html.

Я определил псевдоним:alias gnomeshellrestart='echo "gnome-shell --replace -d" $(w| grep "$USER"| awk "{print \$3}"|grep ":"|head -1)| at now'

Возможно, вы сможете запустить терминал, щелкнув правой кнопкой мыши в фоновом режиме и введя там (alt-tab тоже не работает), если нет, войдите в tty, например, с помощью ctrl-alt-F2 и запустите оттуда.

Я придумал эту функцию для выхода пользователей из системы (см. Внизу)

Это предполагает

  • у вас есть права доступа к sudo
  • у тебя есть баш
  • у пользователей есть 1 запущенный сеанс X (хотя вы должны иметь возможность выполнять одну и ту же команду выхода несколько раз, чтобы избавиться от оставшихся сеансов)

Вы можете присвоить ему несколько имен пользователей:

logout john jane mike elisa

И вы можете предоставить ему дополнительные опции:

logout john --force

Итак, у меня есть следующая вспомогательная функция:

function forcelogout() {    logout "$@" --no-prompt --force}

Записи:

  • Это тупые инструменты, и они работают, просто копируя всю среду сеанса. Это могло бы быть более избирательным.
  • Иногда кажется, что выход из системы занимает некоторое время
  • В редких случаях о сеансе продолжают сообщать до тех пор, пока кто-нибудь не посетит vt, где проводился сеанс, но там больше ничего нет)

код

function logout() {    local USERNAME    export USERNAMES=( )     while [ -n "$1" ]; do case "$1" in        -* ) break ;;        *) USERNAMES+=( "$1" ); shift ;;    esac; done    for USERNAME in "${USERNAMES[@]}"; do        local SESSION_PID=$(pgrep -fu "$USERNAME" gnome-session|head -1)        if [ -n "$SESSION_PID" ]; then            (                sudo -u "$USERNAME" cat "/proc/$SESSION_PID/environ" | xargs -0 -n 1 echo export                echo "gnome-session-quit --logout $@"            ) | sudo -u "$USERNAME" sh -;        fi    done}

Чтобы правильно перезапустить все связанные, я предпочитаю перезапуск всего стека (если работает tty1..4)

sudo killall -9 gdmsudo killall -9 gdm3sudo killall -9 lightdm

ПРИМЕЧАНИЕ: Alt+F2 и перезагрузка остановят все запущенные программы. (Я до сих пор не знаю, как перезапустить графический интерфейс, не останавливая программы.)