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/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 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/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. 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_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 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_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