Užitečné drobnosti z příkazové řádky

21. 10. 2009
Doba čtení: 4 minuty

Sdílet

Po dlouhé době se vracíme k našim občasníkovým hrátkám z řádky. Dnes se při hraní podíváme na hromadné ovládání serverů, ukládání informací z terminálového výstupu, změříme si čas běhu aplikací a očíslujeme si řádky. Nakonec nás čeká několik použitelných tipů, které se nevešly do minulých článků.

clusterssh (cssh)

První tip se netýká přímo řádky, ale při správě serverů se může hodit. A čím více serverů, tím lépe. Asi nikoho nebaví zadávat stejný příkaz třeba 10× pro deset serverů. Takovou práci nám usnadní nástroj ClusterSSH, konkrétně program cssh. Práce s ním je opravdu jednoduchá. Po spuštění se objeví cssh konzole, přes její menu se připojíme na několik serverů. Ještě zde máme dialogové okno cssh, co do tohoto okna napíšeme, je posláno do všech ostatních. Všechny spuštěné xtermy se nám cssh snaží inteligentně zobrazit na ploše, takže vidíte výstup všech xtermů najednou. V případě, že se vám vejdou na obrazovku.

cssh

Cssh toho ale umí více. Například nám zůstává možnost přepnout se do kteréhokoli xtermu a udělat v něm samostatnou změnu, která se nepřenáší na ostatní, stejně jako při běžném způsobu práce. Dále je možné si v cssh konzoli aktivovat jen třeba polovinu serverů, zadat pro ně příkazy a potom si znovu zapnout i ostatní. Zpočátku se vám může zdát postupné spouštění jednotlivých přihlášení zdlouhavé. Stačí se ale podívat do manuálu a vytvořit jednoduchý konfigurační soubor .csshrc, v kterém definujeme množiny serverů a jednotlivé servery. Umístění je klasicky do /home/uzivatel/.csshrc.

clusters = skupina1 skupina2
skupina1 = mail.firma.cz mail.firma2.cz
skupina2 = jiny.server.cz nekde.jinde.cz aaa.bbb.cz

Jedním příkazem si pak přihlásíme všechny najednou:

cssh skupina1

Pozor u cssh s clipboardem. Některé znaky (aspoň verze na současném Ubuntu) špatně posílá do jednotlivých xtermů. Ale i přes tuto chybku je to šikovný nástroj.

Script

Chcete někomu ukázat nějaký postup nebo si jej poznamenat pro příště? Shell má samozřejmě historii, ale někdy se může hodit i znát výstupy jednotlivých příkazů. Zkuste program script. Spustíme ho a určíme soubor, do kterého se bude zapisovat veškerý výstup. Stiskem ctrl + d script ukončíme:

# script spusteni_bsnmpd
Script started on Wed Sep 30 21:25:36 2009
[root@mail ~/bin]# cp /usr/share/examples/etc/snmpd.config /etc/
[root@mail ~/bin]# echo 'begemotSnmpdModulePath."ucd" = "/usr/local/lib/snmp_ucd.so"' >> /etc/snmpd.config
[root@mail ~/bin]# echo 'bsnmpd_enable="YES"' >> /etc/rc.conf
[root@mail ~/bin]# /etc/rc.d/bsnmpd start
Starting bsnmpd.
[root@mail ~/bin]# exit

Script done on Wed Sep 30 21:26:58 2009

Jen pozor, třeba na FreeBSD ve výpisu uvidíte i stisky kláves šipky, tabulátor (^H,^G), …

Drobky

příkaz time – zjištění doby běhu

Několikrát jsme tu měli diskuzi o vhodnosti různých zápisů, namátkou třeba grep retezec soubor vs. cat soubor | grep retezec nebo vhodné spojování procesů apod. Jak určit dobu trvání? Použijeme příkaz time.

root@mail ~ # time grep enable /etc/defaults/rc.conf | wc -l
     140

real    0m0.009s
user    0m0.001s
sys     0m0.008s
root@mail ~ # time cat /etc/defaults/rc.conf | grep enable | wc -l
     140

real    0m0.013s
user    0m0.010s
sys     0m0.001s
root@mail ~ # time cat /etc/defaults/rc.conf | grep -c enable
    140

real    0m0.009s
user    0m0.001s
sys     0m0.008s

Na výsledek se ale nemůžeme úplně spolehnout, může být ovlivněn dalšími běžícími procesy, takže pro přesnější měření je dobré celý proces několikrát zopakovat.

Řádky

Když už jsme zmínili grep, někdy se může hodit číslování řádků. Běžně se na to používá program nl:

root@mail ~ # nl /etc/snmpd.config
     1 # $FreeBSD: src/etc/snmpd.config,v 1.9.6.1 2008/11/25 02:59:29 kensmith Exp $
     2 #
     3 # Example configuration file for bsnmpd(1).
     4 #

Grepem můžeme docílit podobné věci, očíslujeme si nalezené řádky se slovem enable:

root@mail ~ # grep -n enable /etc/rc.conf
8:sendmail_enable="YES"
9:saslauthd_enable="YES"
11:usbd_enable="NO"
12:sshd_enable="YES"
14:apache2_enable="YES"

S číslováním nám může pomoct i obyčejný less -N /cesta/k/souboru. Méně známý parametr u lessu je i -s. Při zobrazení odstraní více prázdných řádků za sebou za jediný.

Globbing

Zná a používá pro tohle někdo nějaký český název? Nejste si jisti, co zpracováváte nebo mažete? Zkuste napřed následující příkazy:

$ echo zcat /var/log/*.bz2
$ echo rm -r *

Co se stane? Jen drobnost, uvidíte zápis příkazu včetně výpisu souborů, s kterými bude pracovat.

Jiný příklad na podobné téma:

$ echo {prvni,druhy,treti}
prvni druhy treti

$ echo {prvni,druhy,treti}" pokus"
prvni pokus druhy pokus treti pokus

$ echo {{a,b,c},1,2,3}
a b c 1 2 3

$ echo {{a,b,c}1,2,3}
a1 b1 c1 2 3

Přijde vám to neužitečné? Zkuste místo echa použít třeba mkdir:

$ mkdir -p moje/{film,ebook,hudba/{mp3,wav,mid}}

Ještě jedno možné použití:

$ cp /usr/local/etc/apache22/httpd.conf{,.bak}

Příliš dlouhé řádky

Máte moc dlouhý vstup? Můžete ho rozdělit pomocí zpětného lomítka na konci řádku. Při odentrování je následující řádek uvozen pomocí ">":

bitcoin_skoleni

/usr/local/bin/rrdtool create \
> /usr/local/share/cacti/rra/a-grafika_-_router_obsazeno_544.rrd \
> --step 300  \
> DS:obsazeno:GAUGE:600:0:U \
...

Něco málo k logům

Už jsme se věnovali i prohledávání logů. Můžeme je prohledávat třeba pomocí zless. Ale pokud nevíme, v kterém souboru hledat, musíme postupně. Nebo můžeme použít něco takového a všechny logy si rozbalit do jednoho:

$ zless /var/log/maillog.*.bz2 > vse
$ bzcat /var/log/maillog.[2-5].bz2 > vse
$ (cat /var/log/maillog; bzcat /var/log/maillog.*.bz2) > vse

Less a archivy

Nedávno mě překvapil less. Ve FreeBSD od něj něco takového nečekejte, ale v Ubuntu:

$ less Snehurka.zip
Archive:  Plocha/Snehurka.zip
 Length   Method    Size  Ratio   Date   Time   CRC-32    Name
--------  ------  ------- -----   ----   ----   ------    ----
24768394  Defl:N 23207191   6%  09-13-09 20:54  be4e156b  Snehurka.mp3
--------          -------  ---                            -------
24768394         23207191   6%                            1 file
Plocha/Snehurka.zip (END)

Autor článku

Petr Macek studoval aplikovanou informatiku na Jihočeské univerzitě, pracuje jako síťový specialista ve firmě Kostax, s. r. o. Baví ho především FreeBSD, sítě a monitoring Cacti.