Jak mogę uruchamiać skrypty automatycznie podczas uruchamiania systemu Ubuntu, aby nie trzeba było uruchamiać ich ręcznie po uruchomieniu?
Jak mogę uruchamiać skrypty automatycznie podczas uruchamiania systemu Ubuntu, aby nie trzeba było uruchamiać ich ręcznie po uruchomieniu?
Odpowiedzi:
W zależności od rodzaju skryptów, które musisz uruchomić. W przypadku usług i tym podobnych powinieneś użyć upstart . Ale dla skryptu użytkownika powinny one być uruchamiane jako skrypty sesji przez gnome! Zajrzyj do System> Preferencje> Aplikacje startowe.
Na marginesie, jeśli potrzebujesz skryptów, które będą uruchamiane przy logowaniu do terminala, możesz dodać je do pliku .bash_login w twoim katalogu domowym.
Proste polecenie (takie, które nie musi pozostawać uruchomione) może użyć zadania Upstart, takiego jak:
start on startup
task
exec /path/to/command
Zapisz to w .conf
pliku w /etc/init
(jeśli potrzebujesz, aby działał jako root podczas uruchamiania systemu) lub w ~/.config/upstart
(jeśli potrzebujesz, aby działał jako użytkownik podczas logowania).
system->pref->startup applications
nie można znaleźć /etc/init/
ani w ~/.config/upstart
. Więc gdzie są zdefiniowane aplikacje startowe?
Jednym z podejść jest dodanie zadania cron @reboot :
crontab -e
pozwoli ci na edycję twojego crona.Dodanie do niego takiej linii:
@reboot /path/to/script
wykona ten skrypt po uruchomieniu komputera.
@reboot
kluczowe jest dobrą wskazówką, ponieważ nie jest powszechnie znane.
man 5 crontab
mówi, że @reboot
jest wykonywany przy starcie (kiedy uruchamiany jest demon cron).
rc.local
ponieważ system wydaje się w tym momencie bardziej skonfigurowany (ŚCIEŻKA itp.). Dziwne, że tak trudno jest zadzwonić po uruchomieniu systemu ..
Co powiesz na dodanie polecenia /etc/rc.local
? będziesz musiał użyć dostępu sudo, aby edytować ten plik.
sudo nano /etc/rc.local
chmod 755 rc.local
i dodać #!/bin/bash
do pierwszego wiersza.
Aby uruchomić (krótkotrwałe) polecenie 1 przy uruchomieniu systemd
, możesz użyć systemowej jednostki typu OneShot
. Na przykład utwórz /etc/systemd/system/foo.service
zawierające:
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Następnie uruchomić:
sudo systemctl daemon-reload
sudo systemctl enable foo.service
Zasadniczo jest to po prostu konwersja typowego zadania Upstart na systemowe (patrz Systemd dla użytkowników Upstart ).
Możesz uruchomić wiele poleceń z tego samego pliku usługi, używając wielu ExecStart
wierszy:
[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure
Polecenie należy zawsze podawać z pełną ścieżką. Jeśli dowolne polecenie nie powiedzie się, pozostałe nie zostaną uruchomione. -
Przed ścieżką opowiada Systemd ignorować status wyjścia niezerową (zamiast uznając je awarii).
Istotnych:
W przypadku sesji użytkownika możesz ~/.config/systemd
zamiast tego utworzyć jednostkę systemową . Powinno to działać od 16.04 r., Ale nie we wcześniejszych wersjach Ubuntu z systememd (ponieważ te nadal używały Upstart do sesji użytkowników). Jednostkami sesji użytkownika można sterować za pomocą tych samych poleceń, co w przypadku usług systemowych, ale z --user
dodaną opcją:
systemctl --user daemon-reload
systemctl --user status foo.service
Zauważ, że w przeciwieństwie do Upstart, systemd nie uruchamia Exec*
poleceń przez powłokę. Wykonuje pewne ograniczone rozszerzanie zmiennych i wiele poleceń (oddzielonych przez ;
), ale to tyle, jeśli chodzi o składnię podobną do powłoki. W przypadku czegoś bardziej skomplikowanego, na przykład przekierowania lub potoki, wpisz polecenie w sh -c '...'
lub bash -c '...'
.
1 W przeciwieństwie do długowiecznych demonów.
WantedBy
Stosowane tutaj, na przykład, sprawia, że zaczynają gdy multi-user.target
zostanie osiągnięta. Można użyć Before
, After
, Requires
, itd. Patrzman systemd.unit
RemainAfterExit
zależy to od usługi, którą uruchomisz i jej pożądanego zachowania. Na przykład /bin/df -h
<s> będzie </s> powinien mieć RemainAfterExit=no
.
df
tym nic nieodłącznego RemainAfterExit=no
. Chyba że chcesz wielokrotnie wykonywać polecenie przy każdym uruchomieniu systemctl start foo
.
Istnieją różne sposoby automatycznego uruchamiania poleceń:
Dorobkiewicz system będzie wykonać wszystkie skrypty z której znajdzie konfigurację w katalogu /etc/init
. Skrypty te będą uruchamiane podczas uruchamiania systemu (lub w odpowiedzi na pewne zdarzenia, np. Żądanie zamknięcia), a więc są miejscem uruchamiania poleceń, które nie wchodzą w interakcje z użytkownikiem; wszystkie serwery są uruchamiane przy użyciu tego mechanizmu.
Możesz znaleźć czytelne wprowadzenie do: http://upstart.ubuntu.com/getting-started.html strony podręcznika użytkownika man 5 init
i man 8 init
podać pełne szczegóły.
Skrypt powłoki nazwany .gnomerc
w katalogu domowym jest automatycznie pozyskiwany przy każdym logowaniu do sesji GNOME. Możesz tam wstawiać dowolne polecenia; zmienne środowiskowe ustawione w tym skrypcie będą widoczne dla każdego programu uruchomionego w sesji.
Pamiętaj, że sesja nie rozpoczyna się, dopóki .gnomerc
skrypt nie zostanie zakończony; dlatego jeśli chcesz automatycznie uruchomić jakiś długo działający program, musisz dołączyć &
do wywołania programu, aby odłączyć go od działającej powłoki.
Opcja menu System -> Preferencje -> Aplikacje startowe pozwala określić, które aplikacje powinny być uruchamiane po rozpoczęciu sesji graficznej (Ubuntu predefiniuje całkiem sporo) oraz dodawać lub usuwać je według własnego gustu. Ma to prawie ten sam cel i zakres .gnomerc
skryptu, z tym wyjątkiem, że nie musisz znać sh
składni (ale nie możesz też użyć żadnej sh
konstrukcji programowej).
.gnomerc
najwyraźniej działa przed załadowaniem Unity i Startup Applications
najwyraźniej działa po załadowaniu Unity. Musiałem uruchomić program, który znajduje się na pasku menu Unity, co w tym przypadku zrobiło ogromną różnicę!
sudo update-rc.d myscript.sh defaults
, gdzie /etc/init.d/myscript.sh jest twoim skryptem, uruchamia go również podczas uruchamiania.
$HOME/.config/autostart
.desktop
tutaj można umieścić plik, który zostanie wykonany przy uruchomieniu.Przykładowy .desktop
plik:
Wstawianie i podawanie następującego .desktop
pliku :$HOME/.config/autostart
chmod +x
[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script
Tutaj "</path/to/script>"
jest zastąpiony ścieżką do twojego script.sh
(zwykle zalecane, aby /usr/local/bin
można go było wykonać bezpośrednio poleceniem powiedz myscript
zastąpiony "</path/to/script>"
).
Przykładowy przykład script.sh
:
#!/bin/bash
<commands to be executed>
exit
Wynik:
.desktop
plik zostanie uruchomiony, z $HOME/.config/autostart
którego wykona skryptExec=
Dlatego możesz uruchomić żądany skrypt powłoki podczas uruchamiania!
Dla prostych rzeczy możesz dodać polecenie w System-> Preferencje-> Sesje wskazujące lokalizację twojego skryptu.
Alternatywnie możesz dodać go do /etc/init.d/rc.local lub zrobić upstart, jeśli jest to coś na niższym poziomie .
Więcej informacji na https://help.ubuntu.com/community/UbuntuBootupHowto
cron
odpowiedź zaimplementowana inna niż najczęściej głosowanaTa odpowiedź wciąż używa, cron
ale używa innej metody niż najczęściej głosowana odpowiedź. Działa to od wersji Ubuntu 16.04, ale prawdopodobnie jest obsługiwane znacznie wcześniej. Po prostu zacząłem używać cron
do uruchamiania zadań, gdy komputer uruchamia się od 16.04.
cron
?W komentarzach ktoś zapytał „kiedy oni biegną?”. Możesz powiedzieć w syslog / journalctl:
$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD ( /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root
Jedną z rzeczy, na które należy zwrócić uwagę, jest cron
wysłanie wiadomości e-mail o statusie uruchomionych zadań i @reboot
zadań uruchomionych, aby wczesny menedżer sieci i poczta e-mail nie były uruchomione, chyba że wprowadzisz sleep
polecenie do skryptu (ów).
Umieść swoje skrypty w katalogu /etc/cron.d
:
$ ll /etc/cron.d
total 44
drwxr-xr-x 2 root root 4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r-- 1 root root 244 Dec 28 2014 anacron
-rw-r--r-- 1 root root 148 Feb 18 2017 cycle-grub-background
-rw-r--r-- 1 root root 138 Mar 5 2017 display-auto-brightness
-rw-r--r-- 1 root root 460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r-- 1 root root 102 Feb 9 2013 .placeholder
-rw-r--r-- 1 root root 224 Nov 19 2016 touch-vmlinuz
-rw-r--r-- 1 root root 700 Aug 5 11:15 turn-off-hyper-threading
Oto kilka skryptów skonfigurowanych do uruchamiania każdego rozruchu:
$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root /usr/local/bin/cron-reboot-cycle-grub-background
$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root touch "/boot/vmlinuz-"`uname -r`
@reboot
.
crontab -e
co niektórzy uważają za jedną z czarnych sztuk ze względu na interfejs podobny do vima. Z drugiej strony odpowiedź ta może spodobać się tym, których mózgi są w pewien sposób okablowane. Nie wszyscy jesteśmy odlewani z tej samej formy. Z drugiej strony ta odpowiedź ma już jeden głos w dół, więc pozwolimy demokracji pójść jej kursem.
crontab -e
przywołuje wspomnienia gwiazdek („*”) na minuty, godziny itp., Dla których zawsze uważałem, że muszę szukać instrukcji w Google. Nadal znajduję używanie /etc/cron.d
i /etc/cron.daily
mój wybór. Zwłaszcza, że odzwierciedla /etc/udev/rules.d
i /etc/systemd/system-sleep
metody. Wygląda na to, że dobrze pasuje.
W tym celu powinieneś użyć upstart . Upstart jest używany w procesach Ubuntu, które są uruchamiane automatycznie. Jest to ulepszone rozwiązanie, takie jak stare skrypty init.d System-V. Pozwala także na wprowadzenie wstępnych warunków do uruchomienia skryptu (tj. Czy potrzebujesz sieci działającej? Itp.)