Čtrnácté cvičení cvičení – Dodělávky v shellu (funkce, signály)

Během cvičení jsme pár oblastí nestihli pokrýt, jejich přehled je zde a probereme si je na posledním cviku.

Aliasy

Jednoslovné zkratky usnadňující práci v shellu.


alias p='python3'  # Nastaví alias
alias p            # Vypíše alias
alias              # Vypíše všechny aliasy

Funkce


hello () {
	echo "Hello $1."
}

nactiHeslo() {
	printf "Zadej heslo: " 1>&2
	read passwd
	echo "$passwd"
}
heslo=$(nactiHeslo)

Signály

POSIXové signály:


$ kill -l
1  SIGHUP    # hang up - třeba po rozpadnutí SSH spojení (u démonů se používá pro znovunačtení konfigurace)
2  SIGINT    # interrupt - posílá ho třeba Ctrl-C
3  SIGQUIT   # quit - posílá ho Ctrl-\
6  SIGABRT   # abort
9  SIGKILL   # kill - nelze odchytit, následuje nenávratná a okamžitá smrt procesu
14 SIGALRM   # alarm
15 SIGTERM   # terminate - požádání o ukončení běhu

Mimo SIGKILL lze signály odchytávat pomocí trap '<příkazy>' <signály>, často se místo příkazů používá volání nějaké funkce.


trap '' INT                 # Zablokuje SIGINT (na Ctrl-C neudělá nic)
trap 'echo "Koncim"' TERM   # Před koncem programu se rozloučí
trap 'funkce' INT QUIT      # Lze volat i funkci a nastavit stejný trap pro více signálů

Posílání signálu procesům

  1. Zjistit PID procesu (třeba pomocí ps, top nebo htop)
  2. Zavolat třeba kill -9 PID
  3. Užitečný pro zjištění PID je i pgrep nazev_programu
  4. Může se hodit i killall nazev_programu
  5. Příklady:

    Budou…
    1. Napište program, který vypíše jméno signálu, který mu byl zaslán a běží dál bez ukončení (stačí standardní POSIXové signály). Posílejte tomuto programu různé signály pomocí kill, abyste vyzkoušeli jeho chování.
    2. Napište program, který dostane jako parametr nějaký regex a pak bude číst standardní vstup (třeba bude dostávat stream z Twitteru :-)).
      Pokud při čtení někde objeví slovo vyhovující regexu, tak si ho i s časem zapíše do pomocného souboru. Ve chvíli, kdy dostane SIGINT nebo SIGTERM, tak pomocný soubor před ukončením vypíše a smaže.