Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: Jak uruchomić skrypt w momencie pojawienia się pulpitu?  (Przeczytany 1897 razy)

Offline groovy

  • Nowy na forum
  • *
  • Wiadomości: 2
    • Zobacz profil
Witam szerokie grono,

W momencie uruchamiania systemu, pewna usługa uruchamia prosty skrypt, który z kolei odtwarza wybrany przeze mnie dźwięk.

Skrypt wygląda następująco:
#!/bin/bash
sleep 4;
aplay /home/groovy/login.wav
Usługa uruchamia skrypt, ten czeka 4 sekundy i odtwarza dźwięk. U mnie trafia to na moment pojawienia się pulpitu.

Problem polega na tym, że nie podoba mi się fragment kodu z komendą sleep. Jest nieelegancki.

Najlepiej byłoby gdyby poprzez instrukcję until/do/done sprawdzał czy pulpit jest uruchomiony. Jeśli nie to niech czeka tak długo aż się załaduje.

#!/bin/bash
until [[ $(systemctl status gdm.service | grep "active") != active ]];
do
  sleep 1;
done
aplay /home/groovy/login.wav
Powyższy kod nie działa, ponieważ gdm.service ładuje się wcześniej, odtwarza dźwięk ale pulpit pojawia się po około 4 sekundach.

Jak ustawić warunek until aby sprawdzał czy wyświetlony jest już pulpit lub ekran logowania?

Offline robson75

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 429
    • Zobacz profil
Odp: Jak uruchomić skrypt w momencie pojawienia się pulpitu?
« Odpowiedź #1 dnia: 2023-09-20, 11:53:34 »
U mnie na xfce4 mam dźwięk powitalny, i używam takiego skryptu
#!/bin/bash
sleep 15s
canberra-gtk-play -f /home/robson/.canberra/logowanie.wav
exit 0
A wartość sleep jest taka, bo najpierw musi się załadować pulpit.

EDIT.
Oczywiście aby skrypt działał, trzeba mu nadać prawa wykonywalności jako program.
« Ostatnia zmiana: 2023-09-20, 12:01:40 wysłana przez robson75 »
Arch Linux Xfce - 64Bit Linux User #621110

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2765
  • 1709
    • Zobacz profil
Odp: Jak uruchomić skrypt w momencie pojawienia się pulpitu?
« Odpowiedź #2 dnia: 2023-09-20, 16:30:08 »
Przedstawię 2 problemy:
1. GDM to menadżer logowania do systemu. Środowisko graficzne jest uruchamiane potem.
2. W systemd większość usług jest uruchamiana losowo. To znaczy że dźwięk może być uruchomiony później lub wcześniej.

Rady.
- Zwykle w środowisku graficznym można ustawić dźwięk, ale możliwe że to dotyczyło menadżera logowania,
( akurat w Ubuntu Mate aktualnie nie mogę znaleźć gdzie można to zmienić )
- Można spróbować wkleić skrypt do " autostart "  https://wiki.archlinux.org/title/XDG_Autostart
Ale może się zdarzyć że np. PulseAudio wystartuje później.
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline groovy

  • Nowy na forum
  • *
  • Wiadomości: 2
    • Zobacz profil
Odp: Jak uruchomić skrypt w momencie pojawienia się pulpitu?
« Odpowiedź #3 dnia: 2023-09-21, 10:47:00 »
U mnie jest akurat tak, że pomija ekran logowania i odrazu uruchamia pulpit (włączone automatyczne logowanie) Ale z tego co wiem, gdm i tak się uruchamia tyle, że poprostu loguje automatycznie i nie pokazuje tego na ekranie.

Pewnie zadziałało by to w odpowiednim czasie gdybym jednak logowanie miał włączone. (muszę to sprawdzić). Tylko co w przypadku gdy gdm jest pomijany i trwa to właśnie około 4 sekundy zanim po gdm-ie załącza się pulpit. Jaka usługa jest odpowiedzialna za załadowanie pulpitu?

To nie może odbywać się losowo ponieważ często jedna usługa jest zależna od innej. Np. właśnie załadowanie pulpitu jest zależne od gdm, którzy przecież musi załadować się pierwszy.

Offline robson75

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 429
    • Zobacz profil
Odp: Jak uruchomić skrypt w momencie pojawienia się pulpitu?
« Odpowiedź #4 dnia: 2023-09-21, 12:26:14 »
Na moim xfce4 używam lightdm, i mam również włączony autologin (bez wpisywania hasła). A lightdm oraz gdm są to tylko display manager które to ładują pulpit i nie mają nic wspólnego z dźwiękami uruchamianymi podczas logowania.
Arch Linux Xfce - 64Bit Linux User #621110

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2765
  • 1709
    • Zobacz profil
Odp: Jak uruchomić skrypt w momencie pojawienia się pulpitu?
« Odpowiedź #5 dnia: 2023-09-21, 20:23:46 »
Cytuj
Ale z tego co wiem, gdm i tak się uruchamia tyle, że po prostu loguje automatycznie i nie pokazuje tego na ekranie.
To prawda. Pomija proces logowania i uruchamia środowisko graficzne.
Gdybyś miał kilka zainstalowanych środowisk graficznych i włączone logowanie się,
to właśnie z niego możesz wybrać środowisko.

Cytuj
To nie może odbywać się losowo ponieważ często jedna usługa jest zależna od innej. Np. właśnie załadowanie pulpitu jest zależne od gdm, którzy przecież musi załadować się pierwszy.
Napisałem  " W systemd większość usług jest uruchamiana losowo. "
Są pewne wyjątki w systemd.
Natomiast środowisko graficzne nie jest uruchamiane przez systemd, a przez display menadżera np. gdm, lightdm , itd.

Także jeśli uparcie chcesz sprawdzić czy środowisko się uruchomiło,
to chyba najlepiej spytać się developerów środowiska którego używasz.

Przykładowo mógłbym sprawdzać czy powstał już proces środowiska graficznego.
U  mnie to jest " mate-session " ,
ten fragment drzewa po uruchomieniu komendy pstree ( wyświetla drzewo procesów )
        ├─lightdm─┬─Xorg───{Xorg}
        │         ├─lightdm─┬─mate-session─┬─caja───4*[{caja}]


Tylko że sprawdzanie co sekundę czy proces już istnieje, to zjada zasoby komputera.
Trochę jak odliczanie sleep.
Powinno się używać inotifywait, ale na razie to działa tylko na plikach i folderach.
Jeśli założymy, że plik  $HOME/.xsession-errors powstaje po uruchomieniu się środowiska,
to można by go obserwować czy się zmienił , np.
#!/bin/bash
inotifywait  -q -e modify,delete_self,move_self /home/nazwa_uzytkownika/.xsession-errors &>/dev/null
aplay /home/groovy/login.wav
Ale czy on rzeczywiście powstaje po, tego nie wiem. Możesz sprawdzić.
Druga sprawa to tego dźwięku, ale też byś musiał sprawdzić.

U mnie odnośnie tego dźwięku pierw powinna wystartować alsa, a później pulseaudio ( ponieważ pulseaudio jest nakładką na alsę )
W systemd znalazłem tylko
$ systemd-analyze blame | grep alsa
  59ms alsa-restore.service
Nie jestem pewien czy to uruchamia alsę.
Natomiast pulse audio startuje wraz ze środowiskiem graficznym,
czyli w moim przypadku środowisko uruchamia skrypt z /etc/xdg/autostart/pulseaudio.desktop
( Podałem wyżej link to XDG Autostart )

Które pierwsze się uruchomi?
Środowisko graficzne, czy Pulseaudio?
W sumie to nie istotne, zawsze możesz sprawdzić oba procesy.
Czy dzwięk również zadziała, gdy Alsa się uruchomiła, ale Pulse Audio jeszcze nie ?
Pozostawię Tobie to do sprawdzenia.
« Ostatnia zmiana: 2023-09-22, 17:42:47 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2765
  • 1709
    • Zobacz profil
Odp: Jak uruchomić skrypt w momencie pojawienia się pulpitu?
« Odpowiedź #6 dnia: 2023-09-22, 16:43:12 »
Nie wiem jakiej Ty dystrybucji i środowiska używasz groovy
Ale bawiłem się tym " XDG Autostart ".
- Skrypt uruchomiony z  z xdg autostartu po prostu u mnie działa,

więc jeśli Tobie też zadziała to nie potrzebujesz już dodawać komendy sleep w skrypcie, ani żadnej innej.

- Jeśli się okaże że raz na jakiś czas dźwięk nie zadziała, bo nie będzie uruchomionego serwera dźwięku to chyba przeszkadzać nie będzie.
- Przeczytałem na https://wiki.archlinux.org/title/Libcanberra
Cytuj
libcanberra no longer requires any backends for ALSA, pulseaudio or gstreamer, as they are now built in to the libcanberra package.
I nie jestem pewien czy chodzi że nie wymaga zależności przy budowaniu pakietu, czy serwerów dźwięku. To mógłbyś sprawdzić doświadczalnie.
- Wyłączyłem u siebie Pulse Audio z xdg autostartu, ale jeszcze coś je uruchomiło, nie mam siły dziś sprawdzać, po drugie to mało istotne.
- Dźwięk mam przy logowaniu się. Nie chce mi się sprawdzać kodu lightdm,
ale skoro działa, to też można podmienić dźwięk na własny ( dosłownie plik dźwięku, u mnie gdzieś w /usr/share/sounds/  ).
Za to nie miałem domyślnie dźwięku przy uruchomieniu się środowiska graficznego.
- Poprawię ten przykład z inotifywait wyżej, ponieważ pętla while w tym przypadku jest zbędna.
Edytowano:
- Oraz w moim przypadku z crontab + inotifywait + plikiem xsession-errors nie działa
« Ostatnia zmiana: 2023-09-22, 17:44:43 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2765
  • 1709
    • Zobacz profil
Odp: Jak uruchomić skrypt w momencie pojawienia się pulpitu?
« Odpowiedź #7 dnia: 2023-09-24, 17:55:47 »
Pobawiłem się jeszcze trochę. ( Ubuntu Mate 22.04 )
Wnioski:

1. Wiadomo skrypt uruchomiony z " XDG Autostart " działa.

2. Cron
2.1. Cron z konta root, tam dźwięku z konta root (mam na myśli sudo) nie udało mi się uruchomić.
cvlc nawet informuje że z konta root nie będzie działał ponieważ jest to nie polecane ze względów bezpieczeństwa.
( Oczywiście po przekierowaniu wyjścia komendy do pliku z logiem )
Po za tym sam skrypt bash powinien uruchomić się.
Natomiast notify-send moze wymagać dodania zmiennych 
Cytuj
export DISPLAY=:0.0 && export XAUTHORITY=/home/twoja_nazwa_uzytkownika/.Xauthority

2.2. Cron z konta użytkownika, tutaj dźwięk udało mi się uruchomić,
ale wymaga dodania zmiennych " export XDG_RUNTIME_DIR="/run/user/1000" && export DISPLAY=:0.0 && "
Z czego zmienna środowiskowa XDG_RUNTIME_DIR jest potrzebna do odtwarzania dźwięku  https://wiki.archlinux.org/title/PulseAudio#Play_sound_from_a_non-interactive_shell_(systemd_service,_cron)

Mój wpis w cronie wygląda tak
@reboot      export XDG_RUNTIME_DIR="/run/user/1000" && export DISPLAY=:0.0 && $(bash /home/moja_nazwa__uzytkownika/Pulpit/test/Welkom2.bash)

Przykład wygląda tak ( Oczywiście musiałem wcześniej doinstalować pakiet inotify-tools )
#!/bin/bash
inotifywait -q -e modify,delete_self,move_self /home/moja_nazwa__uzytkownika/.xsession-errors &>/dev/null
/usr/bin/canberra-gtk-play -i service-login
/usr/bin/notify-send -u normal -i "info" 'Boss !!' 'To jest test ze skryptu'

Jednak mam wątpliwości czy warto używać inotifywait w tym przypadku, ponieważ:
systemy zazwyczaj ładują się dość szybko, a inotifywait nie jest częścią bash i uruchamiając się też zużywa zasoby.
Inotifywait się lepiej sprawdza gdy jest duży czas oczekiwania.

Drugi sposób / przykład o którym wspominałem
#!/bin/bash
until pidof pulseaudio && pidof mate-session ; do 
    sleep 1
done
/usr/bin/canberra-gtk-play -i service-login
/usr/bin/notify-send -u normal -i "info" 'Boss !!' 'To jest test ze skryptu'

Także widzisz, nawet tutaj musiałem użyć komendy sleep.
Jedyna różnica to taka, że pętla się wykonuje tak długo aż oba procesy będą uruchomione.

Mimo wszystko dla każdego przykładu u siebie dodatkowo dałbym 1 sekundę opóźnienia
przed wykonaniem dźwięku dla lepszego efektu,
ponieważ dźwięk u mnie minimalnie pojawia się wcześniej niż pulpit.
« Ostatnia zmiana: 2023-09-25, 16:25:17 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.