Teraz, gdy warianty Ubuntu i Mint zostały przeniesione do systemd, moje stare rozwiązania oparte na powyższym są mniej satysfakcjonujące. Szukałem w Internecie, aby dowiedzieć się, jak to zrobić za pomocą systemd, i ostatecznie połączyłem mądrość innych i udokumentowałem to jako post na blogu na blogspot.com.au zawierający następujący samouczek.
Za pomocą systemd możesz utworzyć jeden lub dwa pliki do wywoływania skryptów za pomocą poniższych szablonów i wykonać kilka poleceń. 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 ramach uprawnień 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/system
i 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 uruchamiania będzie wykonywana za każdym razem, gdy systemd wejdzie do celu dla wielu użytkowników, a usługa zatrzymania, 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/sh
i 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. Wykonam skrypty w moim katalogu domowym, ale @don_crissti pokazuje kilka alternatyw w Stack Exchange .
vim /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_stop
i systemctl is-active start_and_stop
mogą 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 drugiej odpowiedzi tego postu, 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_name
polecenia, 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