Jak uruchamiać skrypty przy uruchamianiu?


520

Jak mogę uruchamiać skrypty automatycznie podczas uruchamiania systemu Ubuntu, aby nie trzeba było uruchamiać ich ręcznie po uruchomieniu?


3
Gdyby ktoś mógł pokazać zarówno KIEDY, jak i GDZIE, byłoby to niesamowite. Mówię to, ponieważ wiem, że istnieją co najmniej 2 sposoby uruchomienia skryptu, który zostanie uruchomiony przed uruchomieniem innych aplikacji (takich jak X11)
Buttink

1
Cały wątek odpowiedzi to bałagan. Format Stack Exchange nie wydaje się najlepiej pasować do tego pytania
Gabriel Fair

1
To jest naprawdę zabawne. Ile może być różnych sposobów?
devios1

Odpowiedzi:


206

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.

Dla 14.04 i starszych

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 .confpliku 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).


58
Biorąc pod uwagę sposób działania SO i StackExchange, czy mógłbyś podać przykład skryptu upstart i gdzie będzie on umieszczony? To uczyniłoby to znacznie lepszą odpowiedź. Twój link mówi, że nie jest utrzymywany i spojrzeć na nową książkę kucharską, która jest ogromna. Nie mam pojęcia, od czego zacząć.
Ehtesh Choudhury

2
Co zrobić, jeśli muszę uruchomić polecenie jako root?
dopatraman

1
@dopatraman Odpowiedź stwierdza, że ​​wszystkie procesy z tym są uruchamiane jako root.
AStopher

4
Zaktualizuj tę odpowiedź, aby wyjaśnić, co robić w systemach z systemem systemd zamiast upstart (Ubuntu 15.04+).

3
Ta odpowiedź nie ma dla mnie sensu. Aplikacje wymienione w system->pref->startup applicationsnie można znaleźć /etc/init/ani w ~/.config/upstart. Więc gdzie są zdefiniowane aplikacje startowe?
Blauhirn,

553

Jednym z podejść jest dodanie zadania cron @reboot :

  1. Uruchomienie crontab -epozwoli ci na edycję twojego crona.
  2. Dodanie do niego takiej linii:

    @reboot /path/to/script
    

    wykona ten skrypt po uruchomieniu komputera.


85
Słowo @rebootkluczowe jest dobrą wskazówką, ponieważ nie jest powszechnie znane.
jathanism

12
Miły. Wiesz , kiedy to się uruchomi?
Oli

2
Więc ... to nie zadziałałoby, jeśli straciłem zasilanie, a komputer ponownie się obrócił po przywróceniu zasilania?
Mike Wills

18
@siamii: man 5 crontabmówi, że @rebootjest wykonywany przy starcie (kiedy uruchamiany jest demon cron).
jfs

9
To jest niesamowite. Jak dotąd wydaje się to lepsze niż rc.localponieważ system wydaje się w tym momencie bardziej skonfigurowany (ŚCIEŻKA itp.). Dziwne, że tak trudno jest zadzwonić po uruchomieniu systemu ..
Karthik T

161

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

19
To najbardziej bezpośrednio odpowiada na pytanie: jak po prostu uruchomić niektóre skrypty podczas uruchamiania systemu. upstart wykonuje bardziej złożone zadanie: uruchamia procesy demona.
Dogweather,

1
Więc upstart uruchamia procesy demona, podczas gdy /etc/rc.local uruchamia skrypty bash?
Donato,

5
Powinien? To już nie działa, prawda?
DaVince

4
Doenst działa z systemem Ubuntu 17.04 systemd
qodeninja

3
Zauważ, że jeśli sam utworzysz ten plik (tak jak ja), będziesz musiał zmienić plik na wykonywalny chmod 755 rc.locali dodać #!/bin/bashdo pierwszego wiersza.
psitae

77

W przypadku wersji 15.04 i nowszych:

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.servicezawierają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 ExecStartwierszy:

[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/systemdzamiast 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 --userdodaną opcją:

systemctl --user daemon-reload
systemctl --user status foo.service

Składnia powłoki

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.


czy można ustawić priorytet w pracy? lub określić, że zależy to od uruchomienia innej usługi w pierwszej kolejności?
r3wt 25.04.17

1
@ r3wt tak, są na to różne sposoby. WantedByStosowane tutaj, na przykład, sprawia, że zaczynają gdy multi-user.targetzostanie osiągnięta. Można użyć Before, After, Requires, itd. Patrzman systemd.unit
Muru

@PerlDuck nie jedyne, czego jej brakowało. Dzięki!
muru

Nie ma za co. - Przy okazji, RemainAfterExitzależ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.
PerlDuck

@PerlDuck Nie ma w dftym nic nieodłącznego RemainAfterExit=no. Chyba że chcesz wielokrotnie wykonywać polecenie przy każdym uruchomieniu systemctl start foo.
muru

71

Istnieją różne sposoby automatycznego uruchamiania poleceń:

  1. 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 initi man 8 initpodać pełne szczegóły.

  2. Skrypt powłoki nazwany .gnomercw 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 .gnomercskrypt 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.

  3. 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 .gnomercskryptu, z tym wyjątkiem, że nie musisz znać shskładni (ale nie możesz też użyć żadnej shkonstrukcji programowej).


11
3) „Ma to prawie ten sam cel i zakres skryptu .gnomerc”, z wyjątkiem tego, że .gnomercnajwyraźniej działa przed załadowaniem Unity i Startup Applicationsnajwyraź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ę!
Ten Brazylijczyk

1
@ ruda.almeida Dzięki za zwrócenie na to uwagi. Odpowiedź została napisana w czasach sprzed Jedności.
Riccardo Murri

1
sudo update-rc.d myscript.sh defaults, gdzie /etc/init.d/myscript.sh jest twoim skryptem, uruchamia go również podczas uruchamiania.
Dan Dascalescu,

27
$HOME/.config/autostart
  • Ta lokalizacja zawiera listę aplikacji startowych.
  • .desktop tutaj można umieścić plik, który zostanie wykonany przy uruchomieniu.

Przykładowy .desktopplik:

Wstawianie i podawanie następującego .desktoppliku :$HOME/.config/autostartchmod +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/binmożna go było wykonać bezpośrednio poleceniem powiedz myscriptzastąpiony "</path/to/script>").

Przykładowy przykład script.sh:

#!/bin/bash
<commands to be executed>
exit

Wynik: .desktopplik zostanie uruchomiony, z $HOME/.config/autostartktórego wykona skryptExec=

Dlatego możesz uruchomić żądany skrypt powłoki podczas uruchamiania!



7

cron odpowiedź zaimplementowana inna niż najczęściej głosowana

Ta odpowiedź wciąż używa, cronale 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ć crondo uruchamiania zadań, gdy komputer uruchamia się od 16.04.

Kiedy działa 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 cronwysłanie wiadomości e-mail o statusie uruchomionych zadań i @rebootzadań uruchomionych, aby wczesny menedżer sieci i poczta e-mail nie były uruchomione, chyba że wprowadzisz sleeppolecenie do skryptu (ów).

Gdzie umieścić swoje skrypty

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

Jak wygląda skrypt?

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`

1
Istnieje wiele różnych sposobów dodawania cronjobs, ale rdzeń wysoko głosowanej odpowiedzi, a twoja odpowiedź jest nadal @reboot.
muru

Alternatywne metody dodawania crontabs należy opublikować na stronie askubuntu.com/q/2368/158442 , która wyraźnie dotyczy dodawania zadań Cron.
muru

1
Pozwolę sobie być innego zdania. W rdzeniu tej odpowiedzi wykorzystano to, crontab -eco 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.
WinEunuuchs2Unix

2
Oh proszę. Oboje wiemy, że edytor można zmienić.
muru

@muru Tak prawdopodobnie dlatego, że mnie nauczyłeś, a ja nauczyłem się zmieniać edytora na coś takiego jak nano lub kilka innych CLI. Ale jestem w obozie Gedit. Poza tym crontab -eprzywoł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.di /etc/cron.dailymój wybór. Zwłaszcza, że ​​odzwierciedla /etc/udev/rules.di /etc/systemd/system-sleepmetody. Wygląda na to, że dobrze pasuje.
WinEunuuchs2Unix

5

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.)

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.