Jak mogę się wylogować z GUI za pomocą CLI?


43

Podczas logowania wybrałem Openbox DE, a system ładował się przez całe wieki. Więc przełączyłem się na CLI ( Ctrl+ Alt+ F1) i ponownie uruchomiłem system (ale chciałem się wylogować z GUI i nie restartować całego systemu).

Moje pytanie brzmi: czy mogę wydać polecenie w CLI, aby wylogować mnie z GUI, aby móc wybrać inny język DE. (Nie chcę ponownie uruchamiać mojego systemu za każdym razem, gdy DE zawiesza się.)


$ DISPLAY=:0 gnome-session-quit --force

** (gnome-session-quit:3144): WARNING **: Failed to call logout: The name org.gnome.SessionManager was not provided by any .service files

Odpowiedzi:


45

Aby zakończyć wszystkie procesy użytkownika i zostać odesłanym z powrotem do ekranu logowania, możesz użyć:

kill -9 -1

Nie uruchamiaj go jednak jako root, z powodów omówionych tutaj .


3
Działa świetnie, ale dlaczego? W szczególności, dlaczego LightDM uruchamia się ponownie po zabiciu wszystkiego oprócz init?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件 事件

1
@CiroSantilli 巴拿馬 文件 六四 事件 法轮功 Ponieważ siłą zabija (9) WSZYSTKO, na co pozwala. Co oznacza, że ​​każdy proces jest Twoją własnością. Używanie SIGKILL do zamykania aplikacji absolutnie nie jest zalecane! Użyj SIGTERM (15). Aplikacje mogą reagować na ten sygnał i przeprowadzać czyszczenie.
ManuelSchneid3r

22

Można to zrobić za pomocą gnome-session-quitpolecenia. Potrzebuje --forceopcji, aby ukryć okno dialogowe potwierdzenia, które pojawiłoby się bez niego.

W przeciwieństwie do aplikacji uruchamianych z emulatora terminala X, zakończenie sesji z TTY wymaga dołączenia DISPLAYzmiennej w celu wskazania, który ekran X uruchamia sesję. W związku z tym:

DISPLAY=:0 gnome-session-quit --force

zakładając, że używasz GNOME na: 0, co ma miejsce w normalnych sytuacjach.

  • W Ubuntu 12.04LTS z uruchomionym GNOME, polecenie

    "DISPLAY=:0 gnome-session-quit --logout --no-prompt" 
    

    Pracuje. Argument „--force” nie istnieje na bieżącym poziomie aktualizacji]


dzięki, uruchomiłem polecenie, ale dostałem błąd. Zredagowałem swój post, aby uwzględnić błąd. Udostępnij, jeśli zrobiłem coś złego.
Ankit

Mój zło, nie zauważyłem, że wspomniałeś, że używasz openbox. Niestety, to polecenie będzie działać tylko ze standardową instalacją Ubuntu (Unity / GNOME). Alternatywnie możesz całkowicie zamknąć GUI, a tym samym sesję, uruchamiając sudo service lightdm stop. edycja: jakiego środowiska pulpitu używasz? Openbox to tylko menedżer okien.
Cumulus007

Próbuję użyć KDE / OpenBox lub GNOME / OpenBox.
Ankit

Nie działa, jeśli twój terminal nie jest częścią tej samej sesji dbus, co sesja gnome. Jak dostać się do kolejnej sesji dbus?
Zan Lynx

Czy to polecenie jest wykonywane po kliknięciu przycisku „Wyloguj się ...” za pomocą interfejsu GUI?
Dor

7

Postępuj zgodnie z sugestią Takkata . Standard to Ctrl+ Alt+ Backspace.

Możesz także uruchomić:

$ sudo service lightdm restart

1
gdm został zastąpiony przez lightdm. Ponadto ctrl + alt + backspace jest domyślnie wyłączone.
Cumulus007

@ Cumulus007 Dzięki, odpowiedź zaktualizowana. Wiem, że ctrl + alt + backspace jest domyślnie wyłączony, nigdy nie rozumiem dlaczego, ale jestem tego świadomy. Właśnie informuję PO, jaka jest standardowa, najczęściej używana kombinacja klawiszy. Uważam, że najlepiej trzymać się standardów, ponieważ ułatwia to rozwiązywanie problemów.
terdon

1
Zatrzymanie lightdm będzie oznaczało, że później nie będzie konieczne logowanie, więc nie będzie on miał szansy zalogować się w innym środowisku.
poolie

1
Wystarczająco fair @poolie, odpowiedź zaktualizowana.
terdon

4

Inny sposób,

sudo pkill -u NameOftheUser

lub

sudo pkill x

które zabijają wszystkich użytkowników.


To trochę trudne, nie sądzisz?
akolit

Szorstki? To bardzo głupie.
HörmannHH

2

Prawdziwy problem polega na tym, że zmienne sesji DBUS muszą być ustawione i pasować do sesji, którą próbujesz kontrolować.

Stworzyłem ten skrypt, który ustawia zmienne sesji DBUS ze środowiska sesji gnome na wypadek, gdybyś chciał wylogować innych użytkowników / sesje:

Jak zrestartować Gnome-Shell z linii poleceń?

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
}

Użycie --logout --no-promptlub --forcezamiast po prostu --logoutjest lepszym pomysłem, w przeciwnym razie zostanie wyświetlony monit o wylogowanie.
gioele

1

Jeśli jesteś w sesji xubuntu lub podobnej, musisz użyć polecenia xfce4-session-logout insted z komend sesji gnome, dlatego widzisz ostrzeżenia


1

Oto, co działa najlepiej dla mnie (z Xfce, lightdm i ssh):

$ DISPLAY=:0.0 xfce4-session-logout --logout

Lub

$ sudo service lightdm restart

0

Alternatywnie możesz zakończyć sesje użytkownika, wykonując następujące czynności, dobrze się wylogowuje, z wyjątkiem użytkownika root - na przykład podczas konserwacji.

loginctl | egrep -v "root|SESSION|listed" | awk '{print $1}' | xargs loginctl terminate-session

-2

Możesz użyć polecenia, killall gnome-sessionaby się wylogować. Działa to dla wszystkich sesji GNOME i jeśli dobrze pamiętam wszystkie sesje związane z GNOME. Zabierze Cię z powrotem do LightDM, dzięki czemu możesz wybrać nowego DE lub nowego użytkownika. :)


2
Nie najlepszy sposób na wylogowanie. Sprawdź askubuntu.com/questions/69114/…
jokerdino

Nigdy wcześniej nie widziałem tej opcji. Prawdopodobnie powinienem zacząć z tego korzystać. Przypuszczam, że killall gnome-sessionjest to skuteczny sposób na zamknięcie go.
Ryan McClure,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.