GNU/Linux >> Znalost Linux >  >> Linux

Linux Bash Scripting Part5 – Signály a úlohy

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:

Num Jméno Zaměstnání
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.


Linux
  1. Meziprocesová komunikace v Linuxu:Sokety a signály

  2. Základy signálů Linuxu – část I

  3. Proces Linuxu na pozadí - Zastaveno v úlohách?

  1. Jak najít a zabít zombie proces v Linuxu

  2. Skriptování v Linuxu:3 postupy pro smyčky while v Bash

  3. Linux:Zobrazení a ukončení odmítnutého procesu

  1. Linuxové příkazy:jobs, bg a fg

  2. Linux:Najděte a zabijte zombie procesy

  3. ukončení procesů mmap, msync a linux