it-swarm.dev

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

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

560
myusuf3

Podle toho, jaké skripty musíte spustit .. Pro služby a podobně byste měli použít pstart . Ale pro uživatelský skript by měly být spuštěny jako relační skripty od gnome! Podívejte se do části Systém> Předvolby> Spouštěcí aplikace.

Pokud chcete, aby se přihlašovací údaje k terminálu spouštěly, musíte na straně poznámku přidat skripty, které můžete přidat do souboru . Bash_login ve vašem domovském adresáři.

Pro 14.04 a starší

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

start on startup
task
exec /path/to/command

Uložte to do .conf soubor v /etc/init (pokud potřebujete, aby se spouštělo jako root při spuštění systému), nebo v ~/.config/upstart (pokud potřebujete, aby se po přihlášení spustil jako uživatel).

213
LassePoulsen

Jedním z přístupů je přidání úlohy @reboot cron :

  1. Běh crontab -e vám umožní upravit váš cron.
  2. Přidání řádku jako je tento:

    @reboot /path/to/script
    

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

581
ceejayoz

Příkazy můžete přidat do /etc/rc.local:

Sudo nano /etc/rc.local

Tím se spustí příkazy jako root.

Chcete-li provádět příkazy jako konkrétní uživatel, použijte Sudo -i -u (-i také spusťte přihlašovací prostředí). Například k vytvoření trvalého tunelu SSH, kde myhost je definde v johndoes ~/.ssh/config file:

Sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

Všimněte si, že pokud /etc/rc.local/ bylo prázdné, asi neexistovalo, takže je třeba na začátek přidat řádek Shebang (např. #!/bin/bash) a ujistěte se, že soubor je spustitelný:

Sudo chmod +x /etc/rc.local
171

Pro 15.04 a novější:

Spustit (krátkodobé)1 příkaz při spuštění pomocí systemd , můžete použít systémovou jednotku typu OneShot. 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

Pak spusťte:

Sudo systemctl daemon-reload
Sudo systemctl enable foo.service

V podstatě jde pouze o převod typická úloha Upstart na systémovou (viz Systemd pro uživatele Upstart ).

Ze stejného souboru služeb můžete spouštět více příkazů pomocí více řádků ExecStart:

[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 úplnou cestou. Pokud některý příkaz selže, zbytek se nespustí. A - před cestou řekne systemd ignorovat nenulový stav ukončení (místo toho, aby to považoval za poruchu).

Relevantní:


Pro uživatelské relace můžete vytvořit jednotku systemd v ~/.config/systemd namísto. To by mělo fungovat s 16.04 a dále, ale nikoli s dřívějšími vydáními Ubuntu s systemd (protože ty stále používaly Upstart pro uživatelské relace). Jednotky uživatelských relací lze ovládat pomocí stejných příkazů jako u systémových služeb, ale pomocí --user přidána možnost:

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

Syntaxe prostředí

Všimněte si, že na rozdíl od Upstart, systemd nespustí Exec* příkazy přes Shell. Provádí určité omezené rozšíření proměnných a více příkazů (oddělených ;) sám, ale o tom jde, pokud jde o syntaxi podobnou Shell. Pro cokoli složitější, řekněme přesměrování nebo dýmky, zabalte svůj příkaz do sh -c '...' nebo bash -c '...'.


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

86
muru

Existují různé způsoby, jak automaticky spouštět příkazy:

  1. Systém pstart provede všechny skripty, ze kterých najde konfiguraci v adresáři /etc/init. Tyto skripty se budou spouštět během spouštění systému (nebo v reakci na určité události, např. Požadavek na vypnutí) a jsou tedy místem pro spouštění příkazů, které s uživatelem neinteragují; všechny servery jsou spuštěny pomocí tohoto mechanismu.

    Čitelný úvod najdete na: http://upstart.ubuntu.com/getting-started.html manuálové stránky man 5 init A man 8 init všechny podrobnosti.

  2. Skript Shell s názvem .gnomerc Ve vašem domovském adresáři je automaticky získán při každém přihlášení k relaci GNOME. Můžete do něj vkládat libovolné příkazy; Proměnné prostředí, které nastavíte v tomto skriptu, uvidí každý program, který spustíte v relaci.

    Nezapomeňte, že relace se nespustí, dokud není dokončen skript .gnomerc; proto, pokud chcete autostartovat nějaký dlouhodobý program, musíte k vyvolání programu připojit &, abyste jej oddělili od běžícího prostředí.

  3. Možnost nabídky Systém -> Předvolby -> Spouštěcí aplikace umožňuje definovat, které aplikace by se měly spustit při spuštění grafické relace (Ubuntu předdefinuje některé), a podle potřeby je přidejte nebo odeberte. Toto má téměř stejný účel a rozsah jako skript .gnomerc, S výjimkou toho, že nemusíte znát syntaxi sh (ale také nemůžete použít žádný programovací konstrukt sh).

71
Riccardo Murri

$HOME/.config/autostart Obsahuje seznam spouštěcích aplikací. Soubory .desktop V této složce budou spuštěny při spuštění. Může vyžadovat spustitelné oprávnění (chmod +x startup.desktop).

Ukázkový příklad souboru .desktop:

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

Zde je "</path/to/script>" Nahrazen cestou k vašemu script.sh Pokud umístíte skript myscript do /usr/local/bin Tak, aby mohl být proveden přímo příkazem, můžete napsat myscript místo "</path/to/script>".

Ukázkový příklad myscript.sh:

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

Výsledek: Soubor .desktop Bude spuštěn z $HOME/.config/autostart, Který provede skript pomocí Exec=

31
Pandya

Pro jednoduché věci můžete přidat příkaz v Systém-> Předvolby-> Sessions směřující na umístění skriptu.

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

Podívejte se na https://help.ubuntu.com/community/UbuntuBootupHowto pro více informací

18
tutuca

cron odpověď implementována odlišně od nejlepších hlasovaných

Tato odpověď stále používá cron, ale používá jinou metodu, než je nejvyšší hlasovaná odpověď. Funguje to od Ubuntu 16.04, ale pravděpodobně podporováno mnohem dříve. Je to jen to, že jsem začal používat cron ke spouštění úloh, když se počítač spouštěl od 16.04.

Kdy se spustí cron?

V komentářích se někdo zeptal „kdy běží?“. V syslog/journalctl můžete říct:

$ 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 k poznámce je, že cron vám může poslat e-mailem stav spuštěných úloh a @reboot Úlohy spuštěny, takže dřívější správce sítě a e-mail nebudou spuštěny, dokud do příkazu nevypíšete příkaz sleep skript (y).

Kam umístit skripty

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 skript vypadá?

Zde je několik skriptů, které mám nastaveno pro spuštění každého spuště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`
8

K tomu byste měli použít pstart . Upstart se používá pro procesy Ubuntu, které se automaticky spouštějí. Jedná se o vylepšené řešení, jako jsou staré skripty init-V systému System V. Také vám umožňuje nastavit předpoklady pro spuštění skriptu (tj. Potřebujete síť běžet? Atd.)

5
txwikinger