Obsah

Automatické spouštění skriptů po startu systému

V minulosti bylo běžné nastavovat akce po spuštění systému pomocí souboru /etc/rc.local. Pokud však používáte moderní distribuci Linuxu, jako je Xubuntu nebo Raspberry Pi OS (Debian-based distribuce), pravděpodobně jste zjistili, že tento soubor již neexistuje nebo není funkční.

Důvodem je přechod na nový inicializační systém systemd, který nabízí robustnější a flexibilnější způsob správy služeb. Pokud potřebujete nastavit automatické spouštění vlastních skriptů po startu systému, zde jsou dvě doporučené metody.

1. Použití systemd service

Systemd umožňuje vytvoření vlastní služby, která se spustí při startu systému.

Postup vytvoření služby:

Otevřete terminál a vytvořte nový soubor služby:

sudo nano /etc/systemd/system/moje_sluzba.service

Do souboru vložte následující konfiguraci:

[Unit]
Description=Můj startovací skript
After=network.target
 
[Service]
ExecStart=/cesta/k/mojemu_skriptu.sh
Restart=always
User=root
 
[Install]
WantedBy=multi-user.target

Ujistěte se, že je skript spustitelný:

sudo chmod +x /cesta/k/mojemu_skriptu.sh

Načtěte novou službu:

sudo systemctl daemon-reload

Povolte službu, aby se spouštěla při každém startu systému:

sudo systemctl enable moje_sluzba.service

Spusťte ji hned pro otestování:

sudo systemctl start moje_sluzba.service

Ověřte její stav:

sudo systemctl status moje_sluzba.service

2. Alternativní metoda: Použití crontab

Pokud chcete jen jednoduše spustit skript po startu systému bez vytváření služby, můžete použít cron.

Otevřete crontab pro uživatele root:

sudo crontab -e

Přidejte na konec souboru tento řádek:

@reboot /cesta/k/mojemu_skriptu.sh

Tím zajistíte, že se skript spustí při každém startu systému.

Shrnutí

Metoda Výhody Nevýhody
systemd service Doporučený způsob, robustní správa, automatické restartování, kontrola stavu Vyžaduje vytvoření služby
crontab @reboot Jednoduché a rychlé Žádná správa služeb, horší debugování

Doporučujeme systemd, protože je spolehlivější a lépe integrovaný do moderních distribucí Linuxu. Pokud však hledáte jednoduché řešení, crontab @reboot může být dostatečné.

Použití /etc/rc.local v systemd

V systému se stále můžeme spoléhat na /etc/rc.local pro spouštění vlastních skriptů při startu. systemd kontroluje existenci tohoto souboru a pokud existuje, automaticky ho zařadí do spouštěných služeb pomocí systemd-rc-local-generator.

Jak ověřit dostupnost systemd-rc-local-generator

systemd-rc-local-generator je součástí systemd a vytváří službu `rc-local.service`, která umožňuje spouštění `/etc/rc.local`. Ne všechny distribuce jej však mají povolený.

Zkontrolujte jeho přítomnost v systému pomocí:

systemd-analyze dump | grep systemd-rc-local-generator

nebo:

ls -l /usr/lib/systemd/system-generators/systemd-rc-local-generator

(Podle distribuce může být umístěn i v `/lib/systemd/system-generators/`.)

Pokud existuje, znamená to, že je součástí systemd a můžeme ho využít.

Aktivace /etc/rc.local v systemd

1. Ujistěte se, že soubor existuje a je spustitelný:

sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local

2. Přidejte do něj požadované příkazy, například:

sudo nano /etc/rc.local

A vložte:

#!/bin/bash
echo "Spuštěno při bootu" > /tmp/test.log
exit 0

Uložte soubor a zavřete editor.

3. Ověřte stav služby:

systemctl status rc-local

Pokud není aktivní, povolte ji:

sudo systemctl enable rc-local

A spusťte ji ručně:

sudo systemctl start rc-local

Co dělat, pokud systemd-rc-local-generator chybí?

Pokud v systému systemd-rc-local-generator není k dispozici, může být zakázán při kompilaci systemd v dané distribuci. V takovém případě je možné vytvořit vlastní unit soubor pro `/etc/rc.local`:

1. Vytvořte nový unit soubor:

sudo nano /etc/systemd/system/rc-local.service

2. Vložte následující obsah:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
After=network.target
 
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
 
[Install]
WantedBy=multi-user.target

3. Aktivujte službu:

sudo systemctl enable rc-local
sudo systemctl start rc-local

Tímto způsobem lze dosáhnout stejné funkcionality i v případě, že systemd-rc-local-generator chybí.