Jak uruchomić skrypt podczas logowania / wylogowywania Unity?


8

Mam dwa skrypty - jeden do montowania niektórych folderów przez SSHFS - i jeden do odmontowywania.

Chciałbym uruchomić skrypt montowania, gdy uruchamiany jest mój domyślny pulpit Ubuntu (po zalogowaniu się na konsoli graficznej) - i skrypt odmontowany, gdy „Wylogowuję się” z koła zębatego w prawym górnym rogu pulpit.

Czy ktoś może mi powiedzieć, jak to osiągnąć? Jakie są najwygodniejsze / standardowe zaczepy do uruchamiania poleceń przy uruchamianiu / zamykaniu pulpitu?


Nie oczekuję, że czas będzie miał kluczowe znaczenie. Liczy się to, że pierwszy skrypt zostanie wykonany w ciągu około jednej sekundy ... zanim użytkownik interaktywnie uruchomi aplikację. Po wylogowaniu ważne jest, aby drugi skrypt został wykonany, zanim ktoś inny zaloguje się na konsoli.
— aSteve

Mam dostęp do roota. Instalowanie pakietów nie stanowi problemu. Jeśli to możliwe, chciałbym korzystać tylko z uprawnień na poziomie użytkownika - zakładając, że jest to dobry sposób. Moje skrypty nie wymagają rootowania. Szukam porady, jak najlepiej zainicjować moje skrypty przy uruchamianiu / zatrzymywaniu Unity ... Większość moich doświadczeń związanych z Linuksem / Unixem nie dotyczy GUI. Dzięki oldschoolowym XWindows i waniliowemu menedżerowi okien mogłem to zrobić z .xinitrc. Jak najlepiej korzystać z nowoczesnego, domyślnego pulpitu Unity?
— aSteve

Nie chcę uzależniać operacji wylogowywania od tego, co jest / nie jest zamontowane ... Wszystko to jest obsługiwane dynamicznie przez istniejące skrypty. Potrzebuję zgrabnego sposobu na wykonanie pierwszego skryptu podczas logowania, a drugiego podczas wylogowywania dla sesji GUI na konsoli. Znalazłem „aplikacje startowe” - ale to rozwiązałoby tylko pierwszą połowę problemu.
— aSteve

Nie sądzę, aby „aplikacje do logowania” były właściwą strategią dla obu skryptów. Mam dwa skrypty ... jeden konfiguruje sesję GUI; drugi sprząta po sesji GUI. Oba powinny być uruchamiane jako ten sam użytkownik co sesja GUI. Żadne nie wymaga żadnych argumentów. Muszę znaleźć odpowiedni sposób na uruchomienie skryptów - we właściwym czasie, to wszystko. Żadne założenia dotyczące tego, co faktycznie robią skrypty, nie powinny być konieczne. To pytanie dotyczy sposobu przechwytywania zdarzeń pokrywających się z logowaniem i wylogowywaniem z Unity.
— aSteve

Odpowiedzi:


9

Biorąc pod uwagę wymóg uruchomienia zadania podczas logowania do Unity, a nie innych logowań, zadanie sesji Upstart wydaje się idealne.

Być może zauważyłeś: procesy uruchamiane po zalogowaniu do GUI są w trakcie drugiego initprocesu. Jest initto właściwa inicjacja Upstart i możesz uruchamiać i zatrzymywać zadania sesji na podstawie emitowanych przez nią zdarzeń. Nie są wymagane żadne uprawnienia roota. Jeszcze lepiej (lub gorzej w zależności od perspektywy), nie jest to jeszcze w pełni obsługiwane w systemach bezgłowych. Logowanie SSH nie rozpoczęło inicjacji użytkownika od szybkiego testu, który właśnie wykonałem.

Aby utworzyć zadanie sesji, utwórz nowy .confplik w ~/.config/upstart. Jest to domyślny katalog główny dla zadań sesji Upstart ( $XDG_CONFIG_HOME/upstart), utwórz go, jeśli nie istnieje. Oto przykładowa praca:

tee ~/.config/upstart/myjob.conf <<EOF
description "My job"
start on desktop-start
stop on desktop-end

script 
       firefox 'http://upstart.ubuntu.com/cookbook/#session-job'
end script
EOF

Możesz to kontrolować ręcznie:

start myjob 
# or
initctl start myjob

servicePolecenia służą do kontroli pracy systemu (w tych /etc/init.dlub /etc/init). Aby kontrolować zadania sesji, należy użyć initctlpolecenia, które służy do interakcji z Upstart.

Zobacz man upstart-eventswięcej wydarzeń, których możesz użyć.


Nie zauważyłem ... ale ... zgadzam się - praca na początku wygląda idealnie. Prawdopodobnie brakuje mi czegoś oczywistego ... ale po utworzeniu ~ / .config / upstart / myjob.conf (jak wyżej), kiedy wykonuję „usługa moja robota start” „Dostaję” moja robota: usługa nierozpoznana ”Jakieś pomysły?
— aSteve

Rozwiązany: Musiałem użyć „rozpocznij moją pracę” zamiast „usługi rozpocznij pracę”. Innym przydatnym poleceniem była „lista initctl”
— aSteve

@ aSteve przepraszam za to.
— Naprawiłem

Nie ma problemu. Podejście upstart / sesje zdecydowanie wygląda dobrze. To powiedziawszy, nie znalazłem jeszcze najlepszego sposobu użycia go do uruchamiania osobnych (krótkotrwałych) skryptów start i stop. Czy mogę użyć tylko 1 pliku .conf, czy potrzebuję 2? Czy powinna to być „usługa” czy „zadanie”? Czy powinienem używać przed / po uruchomieniu i przed / po zatrzymaniu? Nie potrzebuję / nie chcę, aby proces działał między startem a zatrzymaniem ... chyba, że ​​istnieje prosty sposób na umieszczenie ikony na pasku narzędzi ... chociaż to prawdopodobnie przesada - dla moich celów.
— aSteve

1
Wreszcie. Po wielu włamaniach ... odkryłem, że potrzebuję zadania myendtask „na koniec sesji”, a nie „na pulpicie”. Jest to nieco sprzeczne z intuicją, ale działa. (Nareszcie!)
— aSteve

1

Rozwiązaniem było użycie zadań upstart. Wymagałem dwóch zadań - jednego uruchomionego podczas inicjalizacji pulpitu dla użytkownika; drugi, kiedy wygasa sesja użytkowników. Poniższe dwa skrypty działają dla mnie pod Ubuntu 14.04.

W ~ / .config / upstart / desktopOpen.conf

description "Desktop Open Task"
start on desktop-start
task
script
# Commands to mount sshfs go here as shell-script.
end script

W ~ / .config / upstart / desktopClose.conf

description "Desktop Close Task"
start on session-end
task
script
# Commands to unmount sshfs go here as shell-script.
end script

Trzymam kciuki, aby wydarzenia te nadal spełniały wymagania w przyszłych wersjach Ubuntu. Pomyślałem, że warto opublikować tutaj moje rozwiązanie - na wypadek, gdyby było przydatne dla innych.


-1

Oto kilka sugestii dotyczących uruchamiania skryptu po zalogowaniu:

Skrypt Linux StackOverflow po uruchomieniu : Cliff zauważa, aby umieścić plik * .sh w /etc/profile.d.

Jeśli chcesz uruchamiać skrypty podczas uruchamiania, oto kilka sugestii:

Skrypt Linux StackOverflow po uruchomieniu : Cliff zauważa, aby użyć /etc/rc.local lub crontab.


1
Żadna z tych opcji nie wygląda „dobrze”. Chcę wykonać skrypt tylko podczas logowania / wylogowywania w sensie rozpoczynania / kończenia sesji jedności. Nie chcę uruchamiać moich skryptów za każdym razem, gdy następuje nowe logowanie. Nowe logowania mogą być inicjowane zdalnie przez ssh itp. - Ale nie chcę, aby wykonywały skrypt, ponieważ nie inicjują nowej sesji Unity (na konsoli).
— aSteve
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.