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?

aSteve
źródło
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ć.

muru
źródło
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.

aSteve
źródło
-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.

Higgs
źródło
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