Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2020-09-20 22:34:14

  hi - Użytkownik

hi
Użytkownik
Zarejestrowany: 2016-03-24

openbox - proste wyłączanie/restartowanie systemu [HOW TO]

Do niedawna korzystałem ze skryptów Bunsena (fork Crunchbanga) ale niestety są napisane w pythonie 2x a jako, że używam sida to nie chce mi się ani kombinować ani przetrzymywać przestarzałych libów

Tak więc sprawa okazała się prostsza niż sądziłem, jak wiadomo systemd (dokładniej systemd-logind) umożliwia za pomocą polkit wyłączanie i restartowanie lokalnej maszyny zwykłym użytkownikom bez uprawnień roota i dzięki szatanu :) nie trzeba zaprzęgać do tak trywialnej rzeczy sudo, którego na desktopie nie używam i używać nie zamierzam. Więc do rzeczy:

wymagania:
- systemd > https://packages.debian.org/search?keywords=systemd
- polkit > https://packages.debian.org/search?keywords=policykit-1
- yad > https://packages.debian.org/search?keywords=yad

sprawdzamy czy mamy aktywną sesję:

Kod:

$ loginctl show-session $XDG_SESSION_ID --property=Active
Active=yes

w tym momencie (gdy rzecz jasna używamy systemd i mamy zainstalowany polkit) już możemy wyłączać i restartować maszynę z konta zwykłego usera:

Kod:

$ systemctl poweroff
$ systemctl reboot

a więc potrzeba nam skrypcia który narysuje okienko i przekaże wywołanie:

Kod:

#!/usr/bin/env bash

logoutctl(){
    [[ -z $YAD_PID ]] || kill -SIGUSR1 $YAD_PID
    case $1 in
        cancel ) exit 0;;
        terminate-session | lock-session ) loginctl $1 $XDG_SESSION_ID;;
        suspend | hibernate | hybrid-sleep | reboot | poweroff ) [[ $(command -v systemctl) ]] && systemctl "$1" || loginctl "$1";;
    esac
}
export -f logoutctl

yad --form --class=WmanExit --undecorated --center --on-top --skip-taskbar \
--sticky --form --columns 1 --width=200 --borders=7 --no-buttons \
--field="Cancel":fbtn 'bash -c "logoutctl cancel"' \
--field="Logout":fbtn 'bash -c "logoutctl terminate-session"' \
--field="Restart":fbtn 'bash -c "logoutctl reboot"' \
--field="Shut Down":fbtn 'bash -c "logoutctl poweroff"' &> /dev/null &

oczywiście nadajemy skryptowi prawa do wykonania i umieszczamy go dajmy na to w /usr/local/bin

jeszcze edycja openboksowego menu, przykładowo:
~/.config/openbox/menu.xml

Kod:

<item label="Zamknij">
            <action name="Execute">
                <command>ob-exit</command>

-----------
PS. jeżeli chodzi o blokowanie sesji to polecam i3lock
https://packages.debian.org/search?keywords=i3lock

osobiście preferuję czarne tło bez zbędnych widżetów przy blokowaniu/odblokowywaniu sesji:

Kod:

i3lock -c 000000 -n -u

odwołanie w menu:
~/.config/openbox/menu.xml

Kod:

<item label="Zablokuj">
            <action name="Execute">
                <command>i3lock -c 000000 -n -u</command>

można sobie dodatkowo dla wygody podpiąć pod przykładowo ^+alt+l
~/.config/openbox/rc.xml

Kod:

<keybind key="C-A-l">
      <action name="Execute">
        <command>i3lock -c 000000 -n -u</command>

a tak prezentuje się rysowanie skrypcia w yad

https://i.postimg.cc/R3Vf4w47/openbox.png

Ostatnio edytowany przez hi (2020-10-03 16:35:48)


"Są drogi, którymi nie należy podążać, armie, których nie należy atakować, fortece, których nie należy oblegać, terytoria, o które nie należy walczyć, zarządzenia, których nie należy wykonywać" Sun Tzu

Offline

 

#2  2020-09-21 09:15:31

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: openbox - proste wyłączanie/restartowanie systemu [HOW TO]

A jak wygląda sprawa zabijania procesów? Czeka aż te procesy się same zakończą, czy jak? xD

Offline

 

#3  2020-10-03 16:07:22

  hi - Użytkownik

hi
Użytkownik
Zarejestrowany: 2016-03-24

Re: openbox - proste wyłączanie/restartowanie systemu [HOW TO]

wg dokumentacji systemd-poweroff.service:

systemd-halt.service is a system service that is pulled in by
       halt.target and is responsible for the actual system halt. Similarly,
       systemd-poweroff.service is pulled in by poweroff.target,
       systemd-reboot.service by reboot.target and systemd-kexec.service by
       kexec.target to execute the respective actions.

       When these services are run, they ensure that PID 1 is replaced by
       the /usr/lib/systemd/systemd-shutdown tool which is then responsible
       for the actual shutdown. Before shutting down, this binary will try
       to unmount all remaining file systems, disable all remaining swap
       devices, detach all remaining storage devices and kill all remaining
       processes.

Coś źle zrozumiałem?

Ostatnio edytowany przez hi (2020-10-03 16:33:07)


"Są drogi, którymi nie należy podążać, armie, których nie należy atakować, fortece, których nie należy oblegać, terytoria, o które nie należy walczyć, zarządzenia, których nie należy wykonywać" Sun Tzu

Offline

 

#4  2020-10-03 17:26:42

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: openbox - proste wyłączanie/restartowanie systemu [HOW TO]

Chodzi o to, co się stanie np. z odpalonym Firefox, gdy zostanie zabity xserver? Gdybyś używał usług systemd do stawiania każdego procesu użytkownika (tak jak to jest w przypadku usług systemowych), to wtedy nie było by problemu i system by te usługi poprawnie zatrzymywał zanim zostanie zatrzymany xserver/openbox. Jeśli nie uruchamiasz usług via pliki .service (ja odpalam firefox'a przez plik .desktop albo z terminala), to wtedy systemd nie wie, że ma te usługi zatrzymać przed zatrzymaniem xserver'a. W efekcie jak xserver dostanie sygnał kill/term (wszystkie procesy dostają te sygnały przy zamykaniu systemu), to się natychmiast zakańcza, a że masz stado działających graficznych appek, to one w tej samej chwili tracą połączenie z xserver'em i zwykle crash'ują. Dlatego ja zawsze pierw zamykam wszystkie graficzne appki zanim rozpocznę procedurę restartu/zamykania systemu (choć ja zwykle i tak używam hibernacji xD).

Możesz przetestować sobie to zachowanie, np. odpal graficzny edytor tekstu. Daj tam nową wirtualną kartkę papieru i coś napisz ale bez zapisywania pliku -- chodzi o to by dane były w RAM. Jak teraz wyślesz sygnał term do appki edytora tekstu, to pojawi ci się prośba o zapisanie zmian przed zakończeniem procesu. Czy jak wyjdziesz z systemu sposobem, który opisałeś, to też dostaniesz taki monit? xD

Offline

 

#5  2020-10-03 17:39:05

  hi - Użytkownik

hi
Użytkownik
Zarejestrowany: 2016-03-24

Re: openbox - proste wyłączanie/restartowanie systemu [HOW TO]

ok dzięki za wyjaśnienie a czego używasz na ob do wyłączania maszyny?

Ostatnio edytowany przez hi (2020-10-03 17:39:40)


"Są drogi, którymi nie należy podążać, armie, których nie należy atakować, fortece, których nie należy oblegać, terytoria, o które nie należy walczyć, zarządzenia, których nie należy wykonywać" Sun Tzu

Offline

 

#6  2020-10-03 17:44:57

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: openbox - proste wyłączanie/restartowanie systemu [HOW TO]

No jak pozamykam appki ręcznie, to systemctl reboot z konsoli. A jak chcę tylko restart sesji graficznej, to mam skrót openbox --exit podpięty pod ctrl+alt+q .

Ostatnio edytowany przez morfik (2020-10-03 17:45:32)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)