Badałem to i odpowiedź grawitacji wydaje się nieaktualna. Możesz teraz skonfigurować usługi użytkownika w systemie, które działają w ramach sesji użytkownika. Mogą mieć ustawiony WYŚWIETLACZ i XAUTHORITY (obecnie w Arch i Debian Stretch).
Ma to sens w porównaniu z poprzednimi zaleceniami używania plików autostartu na pulpicie, ponieważ zarządzanie procesem jest takie samo, jak w przypadku aplikacji na poziomie systemu (restart itp.).
Najlepszymi dokumentami w tej chwili są Arch Arch; Systemd / Użytkownik
Wersja TLDR;
- Utwórz żądany plik * .service w
~/.config/systemd/user/
- Uruchom
systemctl --user enable [service]
(wyklucz sufiks .service)
- Opcjonalnie uruchom,
systemctl --user start [service]
aby rozpocząć teraz
- Służy
systemctl --user status [service]
do sprawdzania, jak sobie radzi
Kilka innych przydatnych poleceń.
systemctl --user list-unit-files
- zobacz wszystkie jednostki użytkownika
- s
ystemctl --user daemon-reload
- jeśli edytujesz plik .service
-- Później...
Zaktualizowałem i przekonwertowałem większość moich demonów sesji do systemowych plików .service. Mogę więc dodać kilka dodatkowych notatek.
Nie było domyślnego haka do uruchamiania usług przy logowaniu, więc musisz sam je uruchomić. Robię to z mojego pliku ~ / .xsession.
systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target
Pierwszy wiersz importuje niektóre zmienne środowiskowe do systemowej sesji użytkownika, a drugi rozpoczyna cel. Mój plik xsession.target;
[Unit]
Description=Xsession running
BindsTo=graphical-session.target
Mój xbindkeys.service jako przykład.
[Unit]
Description=xbindkeys
PartOf=graphical-session.target
[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always
[Install]
WantedBy=xsession.target
Zwykła wskazówka to „nie”.
redshift
nie jest usługą ogólnosystemową - miałby osobną instancję dla każdej sesji i musi wiedzieć, jak połączyć się z Xorgiem konkretnej sesji.(Xorg też nie jest usługą systemową - jest tylko menedżer wyświetlania i uruchamia osobny Xorg dla każdej sesji. //
graphical.target
powie ci, kiedy menedżer wyświetlania jest gotowy, ale nie mówi nic o tym, kiedy DM faktycznie uruchamia pierwszy - lub wszystkie - wyświetla).Samo uruchomienie przy rozruchu
DISPLAY=:0
nie wystarcza, ponieważ nie ma gwarancji, że w danym momencie jest dokładnie jeden ekran, ani że zawsze tak jest:0
(na przykład, jeśli Xorg ulegnie awarii, pozostawiając nieaktualny plik blokujący, następny uruchomi się,:1
gdy pomyślałby, że:0
wciąż jest zajęty); musisz także ustawić ścieżkę doXAUTHORITY
pliku, ponieważ X11 wymaga uwierzytelnienia; i upewnij się, żeredshift
zostanie ponownie uruchomiony, jeśli kiedykolwiek się wylogujesz i zalogujesz ponownie.Jak więc zacząć? Prawie zawsze środowisko pulpitu ma kilka metod uruchamiania własnych usług sesji . Zobacz starszy post, który już opisuje dwa zwykłe;
~/.xprofile
skrypt i~/.config/autostart/*.desktop
lokalizacja.Jeśli używasz startx , możesz użyć
~/.xinitrc
do uruchomienia takich rzeczy. Samodzielne menedżery okien często mają własne skrypty startowe / init; np.~/.config/openbox/autostart
dla Openbox.Wspólne dla wszystkich tych metod jest to, że program jest uruchamiany z poziomu sesji - unikając wszystkich problemów wymienionych powyżej.
źródło
Oto, co właśnie stworzyłem jako obejście niedostępnego
graphical-session.target
(w moim systemie Kubuntu 16.04):Utwórz
~/.config/systemd/user/xsession.target
z następującą zawartością:Poinformuj systemd o tym nowym urządzeniu:
xsession.target
pośrednictwem obecnie dostępnej mechaniki pulpitu Ubuntu 16.04.Utwórz
~/.config/autostart-scripts/xsession.target-login.sh
z następującą zawartością:Utwórz
~/.config/plasma-workspace/shutdown/xsession.target-logout.sh
z następującą zawartością:Spraw, by skrypty były wykonywalne:
Uwaga: te dwa pliki są umieszczane tam, gdzie KDE je pobierze w celu automatycznego uruchomienia i zamknięcia. Pliki mogą być umieszczone gdzie indziej dla innych środowisk pulpitu (np. Gnome) - ale nie wiem o tych środowiskach.
Uwaga: w tym obejściu brakuje obsługi wielu sesji pulpitu. Obsługuje tylko
graphical-session.target
poprawnie, o ile tylko jedna aktywna sesja X11 jest uruchomiona na komputerze (ale tak jest w przypadku większości użytkowników Linuksa).graphical-session.target
nich, i dbaj o to, aby działały bez zakłóceń podczas logowania na komputerze.Jako przykład jednostka @ mkaito powinna wyglądać następująco:
(Nie zapomnij zrobić
daemon-reload
po edycji jednostek!)W przyszłości (czy będzie to Ubuntu 17.04?) Moje obejście stanie się przestarzałe, ponieważ system
graphical-session.target
sam sobie poradzi . Tego dnia po prostu usuń skrypt autostartu i zamykania, a takżexsession.target
- twoje niestandardowe jednostki użytkownika mogą pozostać nietknięte i po prostu działać.źródło
To rozwiązanie robi dokładnie to, o co pyta autor pytania:
Chociaż mogą istnieć lepsze sposoby, jak już odpowiedzieli inni użytkownicy, jest to inne podejście do tego problemu.
Jest podobny do systemd- systemd-networkd-wait-online.service, który blokuje do spełnienia określonych kryteriów. Inne usługi, które od niego zależą, zostaną uruchomione, gdy tylko usługa uruchomi się pomyślnie lub upłynie limit czasu.
Zgodnie z instrukcją (sekcja „Pliki”) serwer X utworzy gniazdo UNIX
/tmp/.X11-unix/Xn
(gdzien
jest wyświetlany numer).Monitorując obecność tego gniazda, możemy ustalić, że serwer dla konkretnego wyświetlacza został uruchomiony.
confirm_x_started.sh
:x_server_started.service
:Teraz włącz
x_server_started.service
uruchamianie w tym samym czasie z serwerem X.Zależy od innych usług (które wymagają uruchomienia serwera X)
x_server_started.service
jednostka zależna:
Jeśli serwer X uruchomi się bez problemu,
x_server_started.service
uruchomi się prawie natychmiast, a systemd przystąpi do uruchomienia wszystkich jednostek zależnychx_server_started.service
.źródło