V předchozím příspěvku jsme mluvili o vstupu, výstupu a přesměrování v bash skriptech. Dnes se naučíme, jak je spouštět a ovládat na systému Linux. Doposud můžeme spouštět skripty pouze z rozhraní příkazového řádku, ale není to jediný způsob, jak spouštět skripty bash pro Linux.
Tento příspěvek popisuje různé způsoby ovládání vašich linuxových bash skriptů.
Linuxové signály
Toto jsou nejběžnější signály systému Linux:
1 | SIGHUP | Proces se zasekne. |
2 | SIGINT | Přerušení procesu. |
3 | SIGQUIT | Proces se ukončí nebo zastaví. |
9 | SIGKILL | Ukončení procesu. |
15 | SIGTERM | Ukončení procesu. |
17 | SIGSTOP | Zastavení procesu bez ukončení. |
18 | SIGTSTP | Zastavení nebo pozastavení procesu bez ukončení. |
19 | SIGCONT | Pokračování procesu po zastavení. |
Vaše linuxové bash skripty tyto signály neřídí. Svůj bash skript můžete naprogramovat tak, aby rozpoznával signály a prováděl příkazy na základě signálu, který byl odeslán.
Zastavit proces
Chcete-li zastavit běžící proces, můžete stisknout Ctrl+C, což vygeneruje signál SIGINT k zastavení aktuálního procesu běžícího v shellu.
$ sleep 100
Ctrl+C
Pozastavit proces
Klávesy Ctrl+Z generují signál SIGTSTP k zastavení všech procesů běžících v shellu, což ponechává program v paměti.
$ sleep 100
Ctrl+Z
Číslo v závorkách, které je (1), je číslo úlohy.
Pokud se pokusíte opustit shell a máte k vašemu shellu přiřazenou zastavenou úlohu, bash vás varuje.
Pro zobrazení zastavených úloh můžete použít příkaz ps.
ps –l
Ve sloupci S (stav procesu) zobrazuje sledované (T) nebo zastavené (S) stavy.
Pokud chcete ukončit zastavenou úlohu, můžete její proces ukončit pomocí příkazu kill.
kill processID
Pastičkové signály
K zachycení signálů můžete použít příkaz trap . Pokud skript obdrží signál definovaný příkazem trap, zastaví zpracování a místo toho se o signál postará skript.
Signály můžete zachytit pomocí příkazu trap takto:
#!/bin/bash trap "echo 'Ctrl-C was trapped'" SIGINT total=1 while [ $total -le 3 ]; do echo "#$total" sleep 2 total=$(($total + 1)) done
Pokaždé, když stisknete Ctrl+C, signál se zachytí a zpráva se vytiskne.
Pokud stisknete Ctrl+C, místo zastavení skriptu se vytiskne příkaz echo zadaný v příkazu trap. Skvělé, že?
Zachycení ukončení skriptu
Ukončení skriptu shellu můžete zachytit pomocí příkazu trap takto:
#!/bin/bash # Add the EXIT signal to trap it trap "echo Goodbye..." EXIT total=1 while [ $total -le 3 ]; do echo "#$total" sleep 2 total=$(($total + 1)) done
Když bash skript skončí, zpráva Goodbye se vytiskne podle očekávání.
Pokud skript ukončíte před dokončením jeho práce, spustí se past EXIT.
Úprava nebo odstranění pasti
Příkaz trap můžete znovu zadat s novými možnostmi, jako je tato:
#!/bin/bash trap "echo 'Ctrl-C is trapped.'" SIGINT total=1 while [ $total -le 3 ]; do echo "Loop #$total" sleep 2 total=$(($total + 1)) done # Trap the SIGINT trap "echo ' The trap changed'" SIGINT total=1 while [ $total -le 3 ]; do echo "Second Loop #$total" sleep 1 total=$(($total + 1)) done
Všimněte si, jak skript řídí signál po změně signálové pasti.
Můžete také odstranit past pomocí dvou pomlček.
trap -- SIGNAL
#!/bin/bash trap "echo 'Ctrl-C is trapped.'" SIGINT total=1 while [ $total -le 3 ]; do echo "#$total" sleep 1 total=$(($total + 1)) done trap -- SIGINT echo "I just removed the trap" total=1 while [ $total -le 3 ]; do echo "Loop #2 #$total" sleep 2 total=$(($total + 1)) done
Všimněte si, jak skript zpracovává signál před odstraněním pasti a po odstranění pasti.
$ ./myscript
Ctrl+C
První Ctrl+C byla zachycena a skript pokračuje v běhu, zatímco druhý skript opustí, protože past byla odstraněna.
Spouštění skriptů Linux Bash v režimu na pozadí
Pokud uvidíte výstup příkazu ps, uvidíte všechny běžící procesy na pozadí a nejsou svázány s terminálem.
Můžeme udělat totéž, jen za příkaz umístěte symbol ampersand (&).
#!/bin/bash total=1 while [ $total -le 3 ]; do sleep 2 total=$(($total + 1)) done
$ ./myscipt &
Jakmile to uděláte, skript se spustí v samostatném procesu na pozadí v systému a ID procesu uvidíte v hranatých závorkách.
Když skript zemře, na terminálu se zobrazí zpráva.
Všimněte si, že zatímco běží proces na pozadí, můžete svůj terminálový monitor používat pro zprávy STDOUT a STDERR, takže pokud dojde k chybě, zobrazí se chybová zpráva a normální výstup.
Proces na pozadí se ukončí, pokud ukončíte relaci terminálu.
Co když tedy chcete pokračovat v běhu, i když zavřete terminál?
Spouštění skriptů bez zablokování
Své Linuxové bash skripty můžete spouštět na pozadí, i když ukončíte relaci terminálu pomocí příkazu nohup .
Příkaz nohup blokuje všechny signály SIGHUP. Zabraňuje tomu, aby se proces ukončil, když opustíte terminál.
$ nohup ./myscript &
Po spuštění příkazu nohup nevidíte ve skriptu žádný výstup ani chybu. Odeslali jste výstup a chybové zprávy do souboru s názvem nohup.out .
Poznámka:Při spuštění více příkazů ze stejného adresáře přepíše obsah souboru nohup.out.
Zobrazení úloh
Chcete-li zobrazit aktuální úlohy, můžete použít příkaz jobs.
#!/bin/bash total=1 while [ $total -le 3 ]; do echo "#$count" sleep 5 total=$(($total + 1)) done
Pak to spusťte.
$ ./myscript
Poté stiskněte Ctrl+Z pro zastavení skriptu.
Spusťte stejný bash skript, ale na pozadí pomocí symbolu ampersand a přesměrujte výstup do souboru jen pro upřesnění.
$ ./myscript > outfile &
Příkaz jobs zobrazuje zastavené a běžící úlohy.
jobs –l
-l parametr pro zobrazení ID procesu
Restartování zastavených úloh
K restartování úlohy v režimu na pozadí můžete použít příkaz bg.
$ ./myscript
Poté stiskněte Ctrl+Z
Nyní je zastaveno.
$ bg
Po použití příkazu bg nyní běží v režimu na pozadí.
Pokud máte více zastavených úloh, můžete provést totéž zadáním čísla úlohy do příkazu bg.
Můžete použít příkaz fg restartovat úlohu v režimu popředí.
$ fg 1
Plánování úlohy
Systém Linux poskytuje dva způsoby, jak spustit bash skript v předem definovaném čase:
- na příkaz.
- tabulka cron.
Příkaz at
Toto je formát příkazu
v čase [-f název_souboru]
Příkaz at může přijímat různé formáty času:
- Standardní formát času, jako je 10:15.
- Ukazatel AM/PM jako 23:15.
- Pojmenovaný čas jako teď, půlnoc.
Můžete uvést konkrétní datum pomocí několika různých formátů data:
- Standardní formát data, jako je MMDDYY nebo DD.MM.RR.
- Textové datum, například 10. června nebo 12. února, s rokem nebo bez něj.
- Nyní + 25 minut.
- Zítra 05:15.
- 11:15 + 7 dní.
Nechceme se vrtat hluboko do příkazu, ale prozatím to zjednodušte.
$ at -f ./myscript now
Pokud má systém e-mail, můžete použít parametr -M k odeslání výstupu na e-mail, a pokud ne, potlačí se tím výstup příkazu at.
Chcete-li zobrazit seznam čekajících úloh, použijte příkaz atq:
Odstranit čekající úlohy
Chcete-li odstranit čekající úlohu, použijte příkaz atrm:
$ atrm 18
Do příkazu atrm musíte zadat číslo úlohy.
Plánovací skripty
Co když potřebujete spouštět skript každý den nebo každý měsíc ve stejnou dobu?
K plánování úloh můžete použít příkaz crontab.
Chcete-li vypsat naplánované úlohy, použijte parametr -l:
$ crontab –l
Formát pro crontab je:
minuta, hodina, den v měsíci, měsíc a den v týdnu
Pokud tedy chcete spouštět příkaz denně v 10:30, zadejte následující:
30 10 * * * příkaz
Zástupný znak (*) používaný k označení, že cron bude příkaz provádět každý měsíc v 10:30.
Ke spuštění příkazu v 17:30 každé úterý byste použili následující:
30 17 * * 2 příkaz
Den v týdnu začíná od 0 do 6, kde neděle=0 a sobota=6.
Chcete-li spustit příkaz v 10:00 na začátku každého měsíce:
00 10 1 * * příkaz
Den v měsíci je od 1 do 31.
Pojďme to zatím zjednodušit a o cronu se budeme velmi podrobně bavit v budoucích příspěvcích.
Chcete-li upravit tabulku cron, použijte parametr -e takto:
crontab –e
Poté zadejte příkaz takto:
30 10 * * * /home/likegeeks/Desktop/myscript
Tím naplánujete spuštění našeho skriptu každý den v 10:30.
Poznámka:Někdy se zobrazí chyba, že Zdroj je dočasně nedostupný.
Jediné, co musíte udělat, je toto:
$ rm -f /var/run/crond.pid
K tomu byste měli být uživatelem root.
Tak jednoduché!
Můžete použít jeden z předkonfigurovaných adresářů skriptů cron, jako je:
/etc/cron.hourly
/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
Stačí umístit soubor skriptu bash do kteréhokoli z těchto adresářů a bude se pravidelně spouštět.
Spouštění skriptů při přihlášení
V předchozích příspěvcích jsme mluvili o spouštěcích souborech. Doporučuji vám je zkontrolovat.
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
Chcete-li spustit skripty při přihlášení, vložte kód do
$HOME/.bash_profile
.
Spouštění skriptů při otevírání shellu
OK, co spuštění našeho bash skriptu, když se otevře shell? Snadno.
Napište svůj skript na
.bashrc
soubor.
A nyní, když otevřete okno shellu, spustí tento příkaz.
Doufám, že vám příspěvek bude užitečný. Vraťte se.
Děkuji.