Jak spouštět skripty při spuštění?

461

Jak mohu spustit skripty automaticky při spuštění Ubuntu, takže po spuštění nemusím spustit ručně?

    
dané myusuf3 04.08.2010 21:54

9 odpovědí

192

V závislosti na typu skriptů, které je třeba spustit. Pro služby a podobně byste měli použít upstart . Ale pro uživatelský skript by měly být spouštěny jako skripty relace pomocí gnome! Podívejte se pod systémem > Předvolby > Spouštěcí aplikace.

Pokud jste potřebovali nějaké skripty pro spuštění při přihlášení k terminálu, můžete je přidat na stránku soubor bash_login ve vašem domovském adresáři.

Pro 14.04 a starší

Jednoduchý příkaz (ten, který nepotřebuje zůstat spuštěn) mohl použít úlohu Upstart jako:

start on startup
task
exec /path/to/command

Uložte to do souboru.conf v/etc/init (pokud jej potřebujete spustit jako root při spuštění systému) nebo v~/.config/upstart (pokud ho potřebujete spustit jako uživatel při přihlášení).

    
odpověděl LassePoulsen 05.08.2010 01:26
479

Jedním z přístupů je přidat úlohu @reboot cron :

  1. Spuštěnícrontab -e vám umožní upravit váš cron.
  2. Přidáním tohoto řádku:

    @reboot /path/to/script
    

    tento skript spustí po spuštění počítače.

odpověděl ceejayoz 04.08.2010 21:57
137

Přidání příkazu do/etc/rc.local? budete muset použít sudo přístup k úpravě tohoto souboru.

sudo nano /etc/rc.local
    
odpověděl paolo granada lim 05.08.2010 18:40
68

Existují různé způsoby automatického spouštění příkazů:

  1. Systém upstart provede všechny skripty, ze kterých nalezne konfiguraci v adresáři/etc/init. Tyto skripty budou spuštěny během spouštění systému (nebo v reakci na určité události, např. Žádost o vypnutí), a tak jsou místo pro spouštění příkazů, které s uživatelem nereagují; všechny servery jsou spuštěny pomocí tohoto mechanismu.

    Čtecí úvod naleznete na: Odkaz stránky manman 5 init aman 8 init give všechny podrobnosti.

  2. Skript s názvem.gnomerc ve vašem domovském adresáři je automaticky zakoupen pokaždé, když se přihlásíte do relace GNOME. Můžete zadat libovolné příkazy; proměnné prostředí, které nastavíte v tomto skriptu, budou vidět všechny programy spuštěné v relaci.

    Všimněte si, že se relace nezačne, dokud neskončí skript.gnomerc; proto chcete-li autostart nějaký dlouhotrvající program, musíte připojit& k vyvolání programu, abyste jej odpojili od běžícího shellu.

  3. Možnost nabídky Systém - > Předvolby - > Aplikace při spouštění umožňuje definovat, které aplikace by měly být spuštěny po zahájení grafické relace (Ubuntu předdefinuje docela málo) a přidávat nebo odstraňovat podle vašeho vkusu. To má téměř stejný účel a rozsah skriptu.gnomerc, kromě toho, že nepotřebujete znátsh syntaxe (ale ani nemůžete použít žádnou konstrukcish).

odpověděl Riccardo Murri 05.08.2010 16:02
53

Pro 15.04 a později:

Pro spuštění příkazu 1 při spuštění pomocí systemd můžete použít systémovou jednotku typuOneShot. Například vytvořte/etc/systemd/system/foo.service obsahující:

[Unit]
Description=Job that runs your user script

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

[Install]
WantedBy=multi-user.target

Spusťte:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

V podstatě se jedná pouze o konverzi typické úlohy Upstart na systémovou (viz Systémový uživatel pro spouštění ).

Můžete spustit více příkazů ze stejného souboru služeb s použitím víceExecStart řádků:

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

Příkaz musí být vždy zadán s celou cestou. Pokud nějaký příkaz selže, zbytek není spuštěn. A- před cestou říká systemd ignorovat stav nenulového ukončení (namísto toho, že považuje za selhání).

Relevantní:

Pro relace uživatelů můžete vytvořit systémovou jednotku v~/.config/systemd místo toho. To by mělo fungovat s 16.04, ale ne dřívějšími verzemi Ubuntu se systemd (od těch, které stále používají Upstart pro uživatele relace). Jednotky relace uživatelů mohou být ovládány stejnými příkazy jako se systémovými službami, ale s přidáním volby--user:

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

1 Na rozdíl od démonů s dlouhou životností.

    
odpověděl muru 09.01.2016 20:21
22

$HOME/.config/autostart
  • Toto umístění obsahuje seznam spouštěcích aplikací.
  • Zde může být vložen.desktop soubor, který bude spuštěn při spuštění.

Ukázkový příklad pro soubor.desktop:

Uvedení následujícího.desktop souboru do$HOME/.config/autostart a danéhochmod +x:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Zde"</path/to/script>" se nahradí cestou k vašíscript.sh
(obvykle doporučeno pro/usr/local/bin so-to může být provedeno přímo příkazem saymyscript nahrazeno"</path/to/script>"

Ukázkový příkladscript.sh:

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

Výsledek: Soubor.desktop bude spuštěn z$HOME/.config/autostart, který spustí skript podleExec=

Proto můžete spouštět požadovaný shellový skript při spuštění!

    
odpověděl Pandya 20.07.2014 08:14
18

Jednoduché věci můžete přidat příkazem System-> Preferences-> Sessions , který odkazuje na umístění vašeho skriptu.

Případně jej můžete přidat do adresáře /etc/init.d/rc.local nebo provést práci upstart , pokud je to < nízká úroveň .

Podívejte se na Odkaz , kde najdete další informace

    
odpověděl tutuca 04.08.2010 21:59
5

Pro tento účel byste měli používat spustit . Upstart se používá pro procesy Ubuntu, které se automaticky spouštějí. Jedná se o vylepšené řešení, jako staré skripty System-V init.d. Umožňuje také nastavit předpoklady pro začátek skriptu (tj. Potřebujete síť spuštěnou? Atd.)

    
odpověděl txwikinger 04.08.2010 21:58
3

cron answer implementované odlišné od nejvyššího hlasování

Tato odpověď stále používácron, ale používá jinou metodu než odpověď s nejvyšším hlasováním. To funguje od Ubuntu 16.04, ale pravděpodobně podporováno mnohem dříve. Je to jen to, že jsem spustil prácicron při spuštění počítače od 16.04.

Kdy se spouštícron?

V komentářích se někdo zeptal "Kdy běží?". Můžete to říct v 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

Jedna věc, kterou je třeba vzít na vědomí, je, žecron vám může posílat stav e-mailů o stavu úloh a spouštět@reboot úloh tak brzy, že správce sítě a e-mail nebudou spuštěny, pokud do skriptu nezařadíte příkazsleep.

Kde skriptovat

Vložte své skripty do adresáře/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 vypadá skript?

Zde je několik skriptů, které mám nastaven pro spuštění každé zavádění:

$ 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'
    
odpověděl WinEunuuchs2Unix 03.01.2018 02:02