čtvrtek 27. srpna 2015

GNOME Shell - restart po pádu s reaktivací rozšíření


GNOME Shell na mém Ubuntu 14.04 tu a tam padne. Většinou se automaticky restartuje, ale občas to nezvládne a zůstane padlý. Po aktualizaci Firefoxu na verzi 40 se to stávalo neustále, dokud jsem FF nezakázal HW akceleraci grafiky. Někdy se také při restartu rozhodne, že jeho pád způsobuje nějaké rozšíření a tak preventivně zakáže úplně všechna. Tu a tam restartovat GS ručně, případně si naklikat aktivaci potřebných rozšíření, jistě není takový problém, ale jediný stisk klávesové zkratky je bezpochyby příjemnějším řešením. Samozřejmě není od věci, aby se záloha seznamu aktivních rozšíření automaticky aktualizovala při změně. Tak jestli vás něco takového zajímá, můžete se kouknout na mé řešení.

Restart padlého GNOME Shellu z konzole není řešením

Pokud GS opravdu nadobro lehne a neprojeví snahu se opět zprovoznit, nemáte k dispozici správce oken, ani spouštěč aplikací, pokud tedy nepoužíváte ještě něco nezávislého, jako třeba externí dok, nebo dropdown terminál s vlastním řešením aktivace. Pokud zrovna nemáte aktivní okno terminálu, musíte do konzole (Ctrl+Alt+F[1-6]), odkud sice GS restartujete, ale protože tu nejsou definovány všechny potřebné proměnné grafického prostředí, nebude plně funkční. Mně pak třeba nefungují multimediální klávesy, dokonce nelze systém z menu ani vypnout, nebo uspat, nefunkční je i drtivá většina modulů v nastavení systému. S tím se dá těžko smířit.

Je potřeba restart provést z původního prostředí, ve kterém GS běžel před pádem a to se dá zajistit nejjednodušeji nezávislou klávesovou zkratkou přes Xbindkeys. (Doinstalujete jako balík xbindkeys, po instalaci se automaticky spouští s X11 session uživatele při přihlášení, pokud existuje konfigurační soubor ~/.xbindkeysrc a podle jeho obsahu pak reaguje spouštěním příkazů v shellu, při stisku definovaných kláves, či tlačítek myši a jejich libovolných kombinací.)

Do konfiguračního souboru ~/.xbindkeysrc pak můžete dopsat třeba takovéto řádky:

"gnome-shell --replace"
        Control+Mod4+Delete

Po restartu xbindkeys začnou nové zkratky fungovat. Mod4 zastupuje klávesu Super, na které je běžně symbol oken.

Kdysi jsem stejný problém řešil s Unity a z nějakého důvodu mi ani klávesové zkratky xbindkeys po pádu Compizu nefungovaly. Nevím čím to bylo způsobeno, jisté je, že na U14.04 s GNOME 3.12 mi xbindkeys funguje podle očekávání nezávisle na prostředí.


Reaktivace rozšíření pokud je GS preventivně zakáže

Pojme-li GNOME Shell podezření, že padl kvůli nějakému rozšíření a pokud se jeho restart nepodaří opakovaně, automaticky zakáže rozšíření všechna a nastartuje úplně čistý. Občas to udělá, aniž by k tomu byl zřejmý důvod, výsledkem je ale v každém případě holé prostředí, které se dá používat jen se zapřením. Nutnost naklikat si rozšíření znovu může mít sice pozitivní dopad v tom, že si znovu rozmyslíte, co vlastně potřebujete, což může vést ke zdravé odtučňovací kůře, i tak si ale jistě pomyslíte něco o pakárně.

Seznam rozšíření si GS ukládá do klíče enabled-extensions pod schématem org.gnome.shell v gsettings a tak není problém je odtud přečíst a uložit do souboru na disku:

gsettings get org.gnome.shell enabled-extensions >soubor

a v případě potřeby zase odtud obnovit:

gsettings set org.gnome.shell enabled-extensions "$(cat soubor)"

Sice už s rozšířeními neblbnu tak často, jako dřív, ale stejně tu a tam udělám nějakou změnu. Vzpomenout si po každé aktivaci, či deaktivaci rozšíření na to, že bych měl aktuální stav zapsat do zálohy, i kdyby to mělo být na jeden klik, není nejpohodlnější a tak jsem si napsal jednoduchý skript, který se automaticky spustí po přihlášení do prostředí a pak každých pět minut (nebo libovolný jiný čas) zkontroluje, zda nedošlo k nějaké změně v enabled-extensions a případně zapíše do zálohy nový stav. Samozřejmě by to nedávalo smysl, kdyby takto reagoval i na deaktivaci všech rozšíření, které GS provede při problémech a tak skript změnu nezapisuje, pokud žádné rozšíření aktivní není.


backup-gs-extensions
#!/bin/bash
# © GdH 2015 GPLv2
se_path="$HOME/.local/share/gnome-shell/enabled-extensions"
[ -e "$se_path" ] || touch "$se_path"

se="$(cat $se_path)"

case "$1" in
restore)
        gsettings set org.gnome.shell enabled-extensions "$se"
        gnome-shell -r &
        exit 0 ;;

*)
        my_name=$(basename "$0")
        c=$(pgrep -f $my_name|wc -l)

        if [[ $c -gt 2 ]]; then # 2 because pgrep adds process with subshell in which is executed 
                echo $my_name already running
                exit 1
        fi

        interval=$1
        [[ $interval ]] || interval=300
        echo "interval is set to $interval sec"
        while :; do
                ee=`gsettings get org.gnome.shell enabled-extensions`
                if [[ "$ee" != "$se" ]]; then 
                        if [[ "$ee" != "@as []" ]] ; then
                                echo "$ee" > $se_path
                                echo "Active extensions stored into $se_path"
                                se="$ee"
                        fi
                fi
        [[ $interval -eq 0 ]] && exit 0
        sleep $interval
        done ;;
esac
exit 1


Skript je schopen pobrat žádný, nebo jeden argument, možnosti funkce jsou následující:

žádný argument - skript se spustí v režimu sledování a ukládání změn s výchozím intervalem kontrol pět minut 
čas validní pro příkaz sleep - skript se spustí v režimu sledování a ukládání změn s intervalem kontrol daným tímto řetězcem. Základem jsou sekundy, ale můžete použít i suffixy m, h, d pro minuty, hodiny a dny. Číslo také nemusí být celé, můžete půl hodiny zapsat jako 0.5h
0 - nula zajistí jen jednu kontrolu/zálohu a skript se hned ukončí
restore - s tímto argumentem skript naopak obnoví klíč s aktivními rozšířeními v gsettings z předtím uložené zálohy a restartuje GS, aby se všechny změny projevily

Příklady:

Spuštění hlídače s intervalem kontrol výchozích 5 minut
backup-gs-extensions

Spuštění s intervalem 10 minut:
backup-gs-extensions 600

Spuštění jednorázové zálohy:
backup-gs-extensions 0

Obnovení rozšíření ze zálohy:
backup-gs-extensions restore


Záloha se tvoří v $HOME/.local/share/gnome-shell/enabled-extensions, pokud byste rádi jinou destinaci, stačí cestu ve skriptu přepsat.

Vstup není nijak ošetřen, takže když zadáte špatný argument, maximálně skript někde spadne.


Pokud si skript uložíte do adresáře ~/bin/, nebo jiného adresáře obsaženého v $PATH, budete ho moct spouštět bez zadávání cesty k němu. Jméno skriptu si můžete změnit podle sebe, jen do něj nepište mezery. A nezapomeňte nastavit spustitelný příznak.

Skript také kontroluje, zda již neběží jeho jiná instance (jen kontroluje procesy podle jména souboru ze kterého je spuštěn) a pokud ano, ukončí se. I v případě, že ho spustíte s nulou, to jsem neřešil. Také při každé kontrole změn nečte znovu soubor z disku, načte ho jen při startu a následně si již jen pamatuje, co naposledy na disk ukládal.


Mezi aplikace spouštěné po přihlášení si skript můžete přidat následujícím příkazem (pokud ho nemáte v adresáři z $PATH, musíte za Exec= zadat celou cestu):

echo "[Desktop Entry]
Name=Watch Extensions
Exec=backup-gs-extensions
Type=Application
X-GNOME-Autostart-enabled=true" > ~/.config/autostart/backup-gs-extensions.desktop

Nebo obsah uvozovek zapíšete do souboru za > ručně. Samozřejmě můžete v Exec použít i argument měnící interval kontrol podle vašeho přání.

No a v .xbindkeysrc jsem si výše zmíněný příkaz pro restart GS změnil na:

"backup-gs-extensions restore"
        Control+Mod4+Delete

protože backup-gs-extensions restore udělá restart GS také a že se mi případně zbytečně aktualizuje enabled-extensions je fuk. Pokud tedy skript dělá, co předpokládám. Zatím mi na mém systému běží bezchybně a testuju to opravdu hodně.

Samozřejmě by bylo lepší použít nějaký rozumnější jazyk a napsat to tak, aby to reagovalo přímo na změny klíče místo kontrolování v intervalech, ale za to mi to nestojí.


3 komentáře:

  1. Už dlouho tady není žádný nový příspěvek. Asi není nic, co by stálo za řeč?
    Zdravím.

    OdpovědětVymazat
    Odpovědi
    1. Tak nějak došlo nadšení, zjevně nejen moje, a podnětů kolem *buntu mám čím dál tím méně. Něco ale rozepsaného mám, tak snad zas něco vyhodím, i když se teď motám hlavně kolem zpracování raw fotografií. Třeba i něco vyplyne z mého aktuálního přesunu z Ubuntu GNOME 14.04 na 16.04, i když to zatím vypadá dost nudně, přestože musím opustit uzavřené ovladače AMD grafiky.

      Každopádně děkuji za zájem, mějte se krásně.

      Vymazat
    2. Tak hlavně, že to není nic horšího. Přeji hodně úspěchů s fotkama a zdravím.

      Vymazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.