168

I would like to implement a keyboard shortcut to restart gnome-shell whenever this one crashes (some bugs aren't currently fixed just yet). For this I would need a command line to restart the shell.

The Alt+F2 and restart command won't work when the shell is crashed because the prompt is implemented in the shell.

Hence, how to restart the gnome-shell from command line?

muru
  • 207,970
neydroydrec
  • 4,800
  • 1
    NOTE: Alt+F2 and restart will stop all the running programs. (I still don't know how to restart the GUI without stopping the programs.) – Andriy Makukha Aug 17 '18 at 06:38

9 Answers9

125

The easiest way is to Alt+F2 and type r then .

agustibr
  • 1,675
53

Since GNOME Shell 3.30.1: You can also do a killall -3 gnome-shell.

Pablo Bianchi
  • 17,552
Denis
  • 539
  • 1
    Probably because this is a good solution where the other command doesn't work. I tried both, the choosen one is good but didn't solve my problem, while this did. – Mitro Nov 05 '18 at 10:00
  • 4
    As of Ubuntu 18.10, GNOME Shell 3.30.1 - THIS IS THE CORRECT SOLUTION. All other solutions restart the session and kick the user out to the login screen, losing all their work. – C.Rogers Nov 15 '18 at 10:44
  • 3
    SIGQUIT (3) doesn't kill the process – Jack Wasey Jan 01 '19 at 11:22
  • 1
    This seemed to work for me. Whereas I was using gnome-shell --replace & before. It worked but, kept running in the terminal. The issue I was having was with Youtube videos in full screen somehow causing Dash-to-Dock and the panel to freeze closed. https://github.com/micheleg/dash-to-dock/issues/298#issuecomment-473622040 – Natetronn Apr 18 '19 at 23:48
  • Matter of style: a Unix sysadmin might prefer pkill -3 gnome-shell rather than killall, which means something different outside of the GNU OS. – Rich Aug 08 '19 at 18:57
  • On some systems, applications will be child processes of gnome-shell, so when you restart it with this method you will STILL lose your work. – Jelle De Loecker Nov 03 '19 at 18:38
  • @smac89 you should remove your comment. It only serves to confuse users. – admirabilis Jan 20 '21 at 12:23
  • @TeresaeJunior done – smac89 Jan 20 '21 at 19:12
  • You need this if Gnome Shell and desktop is freezing and cursor is the only thing that's moving. Just press Ctrl + Alt + F2 then type the above command. It was successful in 18.04. – fsevenm Jan 27 '21 at 16:54
  • Thank goodness for this when my xrdp session had some weird stuck Meta key issue (which I couldn't disable using the sticky keys or accessibility settings) – Sridhar Sarnobat Jan 12 '23 at 08:03
  • Doesn't work on Ubuntu 24.04/Gnome 46 any more. It shows a screen: "Oops, something went wrong" with a button "Log out" – bmaupin Nov 15 '24 at 22:07
16

In the case where the whole GNOME Shell got frozen, there is a way to restart it from the terminal without restarting the whole X window:

  1. Press Ctrl+Alt+F2 to switch to a TTY terminal.

  2. Log in with your credentials (username and password) and then run:

    DISPLAY=:0 gnome-shell -r & 
    
  3. Log out by running:

    exit 
    
  4. Press Alt+F1 to switch back to a graphical X windows session.

ino
  • 261
7

The Gnome 40 the equivalent of Alt+F2 restart is:

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

Got this tip myself from https://www.linuxuprising.com/2020/07/how-to-restart-gnome-shell-from-command.html.

mipmip
  • 190
  • worked on Debian 11.0 – rofrol Oct 05 '21 at 19:46
  • I wanted to note that this took a few seconds (screen turned black) and then all my apps were closed on 21.10. – LiveWireBT Nov 26 '21 at 03:28
  • This doesn't work for me anymore in GNOME Shell 42.5 – curusarn Oct 26 '22 at 19:03
  • For Gnome Shell 43 (on Xorg), the command is now: busctl --user call org.gnome.Shell /org/gnome/Shell org.gnome.Shell Eval s 'Meta.restart("Restarting…", global.context)'.

    However, executing GJS like this is unfortunately no longer supported by default. You have to run global.context.unsafe_mode = true in Looking Glass first, which makes this rather unhelpful for frequent restarts

    – ZimbiX Jan 18 '23 at 08:24
6

Before GNOME Shell 3.30.1 the command should just be gnome-shell --replace.

Pablo Bianchi
  • 17,552
  • 5
    As of GNOME Shell 3.30.1 on Ubuntu 18.10, this solution no longer works, and will kick the user to the login screen, losing all their work. The correct solution is now commandline: "killall -3 gnome-shell", or ALT+f2 and r (if possible). – C.Rogers Nov 15 '18 at 10:50
  • doesn't work for a remote session, so when gnome shell has frozen, this doesn't work. – Jack Wasey Jan 01 '19 at 11:21
2

Sending TERM signal to Gnome Shell 42.1 works for me on Ubuntu 22.04:

pkill -TERM gnome-shell

Note: TERM is the default signal for pkill.

  • Doesn't work on Ubuntu 24.04/Gnome 46 any more. It shows a screen: "Oops, something went wrong" with a button "Log out" – bmaupin Nov 15 '24 at 22:07
1

In order to proper restart all related, I prefer restarts of whole stack (if tty1..4 works)

sudo killall -9 gdm
sudo killall -9 gdm3
sudo killall -9 lightdm
1

I came up with this function to logout users (see at the bottom)

It assumes

  • you have sudo permissions
  • you have bash
  • the users have 1 running X session (although you should be able to issue the same logout command multiple times to get rid of remaining sessions)

You can give it multiple usernames:

logout john jane mike elisa

And you can give it additional options:

logout john --force

So, I have the following helper function:

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

Notes:

  • This is a blunt instruments and works by just copying the entire session environment. This could be more selective.
  • Sometimes logout seems to take a while
  • In rare occasions the session keeps being reported until someone visits the vt where the session ran, but nothing is there anymore)

CODE

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
}
sehe
  • 223
  • logout USERNAME --force, gives me an output telling me a number is necessary. – Quidam Jun 04 '20 at 05:11
  • 2
    @Quidam That indicates that the variable is not set to a value. You need to set it (which is what happens in the script) – sehe Jun 04 '20 at 09:39
1

I defined an alias: alias gnomeshellrestart='echo "gnome-shell --replace -d" $(w| grep "$USER"| awk "{print \$3}"|grep ":"|head -1)| at now'

You may be able to start a terminal by right-clicking with the mouse on background and type there (alt-tab is dysfct then, too), if not, login to a tty with e.g. ctrl-alt-F2 and run from there.

MoreIT
  • 111