Jak uruchomić skrypty podczas uruchamiania?

464

Jak mogę uruchamiać skrypty automatycznie po uruchomieniu Ubuntu, więc nie muszę uruchamiać ich ręcznie po uruchomieniu?

    
zadawane myusuf3 04.08.2010, 21:54
źródło

9 odpowiedzi

192

W zależności od rodzaju skryptów, które należy uruchomić. W przypadku usług itp. należy skorzystać z usługi upstart . Ale dla skryptu użytkownika powinny one zostać uruchomione jako skrypty sesji przez gnome! Zajrzyj pod System > Preferencje > Aplikacje startowe.

Na marginesie, jeśli potrzebujesz skryptów do uruchomienia na terminalu, możesz dodać je do . Bash_login w twoim katalogu domowym.

Dla wersji 14.04 i starszych

Proste polecenie (które nie musi pozostać uruchomione) może użyć zadania Upstart, takiego jak:

start on startup
task
exec /path/to/command

Zapisz to w pliku .conf w /etc/init (jeśli potrzebujesz, aby działał jako root po uruchomieniu systemu) lub w ~/.config/upstart (jeśli tego potrzebujesz uruchomić jako użytkownik po zalogowaniu).

    
odpowiedział LassePoulsen 05.08.2010, 01:26
źródło
481

Jednym ze sposobów jest dodanie cron zadania:

  1. Uruchomienie crontab -e pozwoli ci edytować twój cron.
  2. Dodanie do niego następującej linii:

    @reboot /path/to/script
    

    wykona ten skrypt po uruchomieniu komputera.

odpowiedział ceejayoz 04.08.2010, 21:57
źródło
138

Co powiesz na dodanie polecenia do /etc/rc.local ? będziesz musiał jednak użyć uprawnienia sudo, aby edytować ten plik.

sudo nano /etc/rc.local
    
odpowiedział paolo granada lim 05.08.2010, 18:40
źródło
68

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

  1. System upstart wykona wszystkie skrypty, z których znajdzie konfigurację w katalogu /etc/init . Skrypty te będą uruchamiane podczas uruchamiania systemu (lub w odpowiedzi na określone zdarzenia, np. Żądanie zamknięcia systemu), a zatem będą miejscem wykonywania poleceń, które nie wchodzą w interakcje z użytkownikiem; wszystkie serwery są uruchamiane przy użyciu tego mechanizmu.

    Możesz znaleźć czytelny wstęp pod adresem: link strony podręcznika man 5 init i man 8 init podaj wszystkie szczegóły.

  2. Skrypt powłoki o nazwie .gnomerc w twoim katalogu domowym jest automatycznie pobierany za każdym razem, gdy logujesz się do sesji GNOME. Możesz tam umieścić dowolne polecenia; Zmienne środowiskowe ustawione w tym skrypcie będą widoczne dla każdego programu uruchomionego w sesji.

    Pamiętaj, że sesja nie rozpocznie się, dopóki nie zakończy się skrypt .gnomerc ; dlatego jeśli chcesz uruchomić autostart jakiś długotrwały 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 pozwalają zdefiniować, które aplikacje powinny być uruchamiane, gdy rozpoczyna się sesja graficzna (Ubuntu predefiniuje całkiem sporo) i dodawać lub usuwać je według własnego gustu. Ma to prawie taki sam cel i zakres działania skryptu .gnomerc , z tym że nie musisz znać składni sh (ale nie możesz użyć żadnej konstrukcji programującej sh ).

odpowiedział Riccardo Murri 05.08.2010, 16:02
źródło
53

Od 15.04 i później:

Aby uruchomić (krótkotrwałe) polecenie 1 podczas uruchamiania przy użyciu systemd, możesz użyć jednostki systemd typu OneShot . Na przykład utwórz /etc/systemd/system/foo.service zawierający:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Następnie uruchom:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Zasadniczo jest to konwersja typowego zadania Upstart na systemd (patrz Systemd dla użytkowników Upstart ).

Można uruchomić wiele poleceń z tego samego pliku usługi, używając wielu linii ExecStart :

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

Polecenie zawsze musi być podane z pełną ścieżką. Jeśli jakaś komenda nie powiedzie się, reszta nie zostanie uruchomiona. - przed ścieżką informuje systemd, aby zignorował niezerowy status wyjścia (zamiast uznać to za błąd).

Istotne:

Dla sesji użytkownika możesz utworzyć jednostkę systemd w ~/.config/systemd . Powinno to działać z wersją 16.04, ale nie z wcześniejszymi wersjami systemu Ubuntu z systemd (ponieważ wciąż używane są Upstart dla sesji użytkownika). Jednostki sesji użytkownika mogą być sterowane tymi samymi komendami, co w przypadku usług systemowych, ale z dodaną opcją --user :

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

1 W przeciwieństwie do długowiecznych demonów.

    
odpowiedział muru 09.01.2016, 20:21
źródło
22
$HOME/.config/autostart
  • Ta lokalizacja zawiera listę uruchamiania aplikacji.
  • Tutaj można umieścić plik .desktop , który zostanie wykonany przy starcie.

Przykładowy przykład dla pliku .desktop :

Umieszczanie następującego pliku .desktop w $HOME/.config/autostart i przy użyciu 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 zamieniany na ścieżkę do twojego script.sh
(zwykle zalecane do /usr/local/bin tak, że można to wykonać bezpośrednio poleceniem powiedz myscript zastąpione "</path/to/script>" ).

Przykładowy przykład script.sh :

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

Wynik: .desktop zostanie uruchomiony z $HOME/.config/autostart , który wykona skrypt przez Exec=

W związku z tym możesz uruchomić żądany skrypt powłoki podczas uruchamiania!

    
odpowiedział Pandya 20.07.2014, 08:14
źródło
18

Dla prostych rzeczy możesz dodać polecenie w System-> Preferencje-> Sesje wskazując lokalizację twojego skryptu.

Alternatywnie możesz dodać go do /etc/init.d/rc.local lub wykonać zadanie upstart , jeśli jest to więcej < em> niski poziom .

Spójrz na link , aby uzyskać więcej informacji

    
odpowiedział tutuca 04.08.2010, 21:59
źródło
5

Do tego celu powinieneś użyć usługi upstart . Upstart jest używany do procesów Ubuntu, które są automatycznie uruchamiane. Jest to ulepszone rozwiązanie, takie jak stare skrypty init-SystemV. Pozwala również na wprowadzenie wymagań wstępnych do początku skryptu (np. Czy sieć jest uruchomiona? Itd.)

    
odpowiedział txwikinger 04.08.2010, 21:58
źródło
3

cron odpowiedzi zaimplementowano inaczej niż od najwyższego głosowanego

Ta odpowiedź nadal używa cron , ale używa innej metody niż najlepsza 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.

Kiedy działa cron ?

W komentarzach ktoś zapytał "kiedy 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 wartych uwagi jest to, że cron może wysłać ci status zadania, a zadania @reboot działają tak wcześnie, że menedżer sieci i poczta e-mail nie będą działać, dopóki nie wprowadzisz komendy sleep do skryptó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, które skonfigurowałem 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'
    
odpowiedział WinEunuuchs2Unix 03.01.2018, 02:02
źródło

Przeczytaj inne pytania na temat tagów