Wykonaj skrypt po wylogowaniu / ponownym uruchomieniu / zamknięciu w Ubuntu


30

Chciałbym uruchomić .shplik przy użyciu bash podczas wylogowywania i zamykania systemu Ubuntu. Przeszukałem Internet i znalazłem tylko poprawki dla KDE i GNOME. Skrypt jest prosty, muszę tylko wiedzieć, czy mogę dodać wiersz kodu do pliku „wylogowania / zamknięcia” lub czy muszę odwoływać się do niego w innym skrypcie.


1
Umieść dowiązania symboliczne do plików wykonywalnych w /etc/init.d w /etc/rc0.d i /etc/rc6.d
Yet Another User

2
Rozważ zaakceptowanie zaktualizowanej odpowiedzi (użycie systemd), aby ludzie zobaczyli ją na górze.
Jonathan Y.

Odpowiedzi:


18

Aby wykonać skrypt po wylogowaniu:

Dodaj następujący wiersz:

session-cleanup-script=/path/to/script

w /etc/lightdm/lightdm.confpliku

Musisz ponownie uruchomić lightdm, aby ta zmiana zaczęła obowiązywać. Aby to zrobić, przejdź do tty1 za pomocą Ctrl+ Alt+ F1, zaloguj się za pomocą nazwy użytkownika i hasła i uruchom następującą komendę:

sudo service lightdm restart

Uwaga: użyj Ctrl+ Alt+, F7aby przejść do sesji graficznej

Aby wykonać skrypt po ponownym uruchomieniu:

  1. Wprowadź swój skrypt /etc/rc0.d
  2. Spraw, by był wykonywalny: sudo chmod +x K99_script
  3. Uwagi:
    • Skrypty w tym katalogu są wykonywane w kolejności alfabetycznej.
    • Nazwa skryptu musi zaczynać się od, K99aby uruchomić się we właściwym czasie.

Aby wykonać skrypt podczas zamykania:

  1. Wprowadź swój skrypt /etc/rc6.d
  2. Spraw, by był wykonywalny: sudo chmod +x K99_script
  3. Uwagi:
    • Skrypty w tym katalogu są wykonywane w kolejności alfabetycznej.
    • Nazwa skryptu musi zaczynać się od, K99aby uruchomić się we właściwym czasie.

Źródła:


4
Jest to konwencjonalny nazwać skrypty zaczynające się Kna „Kill” i Sna „Start”.
kiri

Co jeśli skrypt wymaga uprawnień sudo? O ile wiem, skrypty /etc/rc6.d są uruchamiane jako użytkownik i nie mogą używać gksudo.
Urhixidur

1
nie działa dla mnie z 14.04, czy jest jakaś zmiana lub nieokreślony ważny fakt?
tomasb

2
Porada K99 nie nadaje się do zamykania / restartowania, jeśli chcesz zapisać niektóre dane, ponieważ dzieje się to PO odinstalowaniu, a K służy do wyłączenia skryptu (patrz /etc/rcS.d/README), użyj S do uruchomienia i umieść go przed odmontowaniem, w przypadku bootowania umieść skrypt po zamontowaniu, utknąłem na tym, ponieważ ta dezinformacja została rozwiązana za pomocą S jako pierwszej litery
tomasb

6
Jest to bardzo złe: i) nazwy skryptów muszą zaczynać się od Kdla poziomów uruchamiania 0, 1 i 6 oraz Sdla poziomów uruchamiania 2, 3, 4 i 5; ii) nie musisz wywoływać skryptu K99_foo, liczba określa tylko kolejność uruchamiania skryptów. Musisz wybrać taki, który jest większy niż pozostałe, jeśli chcesz, aby był uruchamiany jako ostatni; iii) Runlevel 0 nie jest przeznaczony do ponownego uruchomienia! ; To jest do zamknięcia. 6 służy do ponownego uruchomienia. iv) skrypty nie działają w /etc/rcN.dkatalogach. Powinny one zamiast tego być powiązane/etc/init.d i powiązane z nimi /etc/rcN.d.
terdon

14

Jak to zrobić za pomocą systemd

Jeśli znajdziesz ten wątek po czerwcu 2016 r., Ubuntu i jego pochodne, w tym Mint, będą używać systemd do kontroli inicjalizacji i zamykania systemu. Miałem problemy ze starym podejściem, więc zbadałem systemowy sposób.

Za pomocą systemd możesz utworzyć jeden lub dwa pliki do wywoływania skryptów przy użyciu poniższych szablonów i wykonać polecenie. Prosty.


Wersja GUI

Najpierw utwórz skrypty, które chcesz uruchomić podczas uruchamiania i / lub zamykania systemu. Utworzyłem .scopening_atstart i .scfullcopy_atend.

Następnie upewnij się, że oba są wykonywalne, klikając prawym przyciskiem myszy plik, wybierając właściwości i upewniając się, że w uprawnieniach zaznaczyłeś opcję Zezwalaj na uruchamianie pliku jako programu.

Dwa utworzone przeze mnie pliki zapełniają się i zapisują zawartość ramdysku. Tworzą również plik w moim katalogu domowym, aby udowodnić, że usługa działa. Były w formie:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Następnie otworzyłem menedżera plików jako root, otworzyłem /etc/systemd/systemi utworzyłem plik startup.service i plik save-ramdisk.service. Oczywiście możesz wybrać własne nazwy, a nazwy ogólne mogą zawierać plik startowy o nazwie johns_start.service i plik zamykania o nazwie johns_shutdown.service. Po prostu nie wybieraj istniejących nazw usług.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

i

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Możesz użyć tych samych plików usługi, zastępując pełną ścieżkę skryptu wykonywalnego moim.

Na koniec dla każdego z nich wykonaj polecenie systemctl włącz nazwę_plików (ale bez usługi sufiksu). Więc mój pierwszy byłsystemctl enable startup

Uruchom ponownie komputer raz, aby uruchomić usługi. Usługa start będzie wykonywana za każdym razem, gdy systemd wejdzie do celu dla wielu użytkowników, a usługa stop, gdy opuści cel dla wielu użytkowników. Alternatywne pliki usług z różnymi warunkami aktywacji zostaną opisane poniżej.


Wersja CLI (wiersza poleceń)

W tym opisie założono, że operujesz z katalogu domowego zamiast / home / john, w razie potrzeby korzystasz z sudo, a wybór edytora, w którym piszę vim lub svim.

Utwórz skrypty powłoki uruchamiania i zamykania w pierwszym wierszu #!/bin/shi włącz ich uruchamianie za pomocą chmod +x my_new_filename.

Utwórz dwa pliki jak wyżej lub w tym przykładzie jeden plik do obsługi zadań uruchamiania i zamykania. Będę wykonywać skrypty w moim katalogu domowym, ale @don_crissti pokazał kilka alternatyw na Stack Exchange.

svim /etc/systemd/system/start_and_stop.service

i skopiuj zawartość pliku:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Następnie włącz usługę za pomocą polecenia:

systemctl enable start_and_stop

i uruchom ponownie system, po którym usługi będą aktywne. Polecenia systemctl is-enabled start_and_stopi systemctl is-active start_and_stopmogą być używane do monitorowania nowych usług.


Zmiana warunków wyzwalania dla zamknięcia

Przede wszystkim pliki używają otwartego lub zamkniętego środowiska wielu użytkowników, aby zainicjować uruchamianie skryptów. Poniższy plik wykorzystuje początek czterech potencjalnych procesów zamykania do inicjowania swoich skryptów. Dodanie lub usunięcie celów w linii Przed + linia WantedBy pozwoli ci na dokładniejsze rozróżnienie:

Ten plik został zaproponowany w odpowiedzi na Unix i Linux przez @Matthias, ale nie mogłem go uruchomić, dopóki nie dodałem sekcji Instaluj.

Ponownie edytuj skrypt /etc/systemd/service/i włącz go, używając systemctl enable your_file_name. Kiedy zmieniłem cele, użyłem systemclt disable file_namepolecenia, a następnie ponownie je włączyłem, co dowiązało go do katalogów docelowych. Uruchom ponownie, a usługa będzie działać.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target

1
Mimo że Twój post jest poprawny, sugeruję ulepszenie go, dodając przykład, w jaki sposób można wykonać takie kroki w systemach. Daj mi znać, kiedy edytujesz swój post. Dzięki i witamy w AskUbuntu
Sergiy Kolodyazhnyy

Cześć Serg, czy masz na myśli przykłady, takie jak w łączonym poście, czy masz na myśli coś innego? Po drugie, nie jestem pewien, jak „powiadomić”, ponieważ nie mogę znaleźć mechanizmu kontaktowania się z innym użytkownikiem SO.
John 9631,

Tak, możesz podać przykład taki sam jak w innym poście. Samo powiedzenie „przejdź do tego innego linku” nie jest zbyt dobre i sprawia, że ​​twoja odpowiedź wydaje się leniwa. Również do skontaktowania się z innym użytkownikiem SO użyj @ przed nazwą użytkownika, na przykład @Serg
Sergiy Kolodyazhnyy

Bardzo ulepszony. Bardzo dobrze, kontynuujcie dobrą robotę!
Sergiy Kolodyazhnyy

1
zgodnie z man systemd.unitutworzonymi przez użytkownika plikami można umieszczać w $XDG_CONFIG_HOME/systemd/userinnych lokalnych lokalizacjach użytkowników
Antonios Hadjigeorgalis
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.