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
- Nahraďte
/cesta/k/mojemu_skriptu.sh
cestou ke svému skriptu. User=root
zajistí, že se skript spustí pod rootem (můžete změnit na jiného uživatele).Restart=always
znamená, že služba bude automaticky restartována v případě pádu.
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í.