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

Petr Macek 21. 10. 2009

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í ">":

/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)

Ohodnoťte jako ve škole:

Průměrná známka 2,75

Našli jste v článku chybu?
Zasílat nově přidané názory e-mailem
Podnikatel.cz: Přechod z OSVČ na firmu? Totální šok!

Přechod z OSVČ na firmu? Totální šok!

DigiZone.cz: Šlágr TV dostala pokutu 100 000 Kč

Šlágr TV dostala pokutu 100 000 Kč

DigiZone.cz: Je tu Eurosport VR pro virtuální French Open

Je tu Eurosport VR pro virtuální French Open

Podnikatel.cz: Šizený guláš na pultě. Jako Lidl to nedělejte

Šizený guláš na pultě. Jako Lidl to nedělejte

120na80.cz: Odřenina. Jakou použít dezinfekci?

Odřenina. Jakou použít dezinfekci?

Podnikatel.cz: Alza radí e-shopům, jak opustit Heureku

Alza radí e-shopům, jak opustit Heureku

Podnikatel.cz: Využijte v byznysu nulové tarify

Využijte v byznysu nulové tarify

120na80.cz: Poznáte, který z léků je pravý?

Poznáte, který z léků je pravý?

120na80.cz: Jak si udržet zdravou vaginu

Jak si udržet zdravou vaginu

Vitalia.cz: Odchytili 43 000 sardinek s kadmiem

Odchytili 43 000 sardinek s kadmiem

DigiZone.cz: Konec geoblokace? Ani náhodou…

Konec geoblokace? Ani náhodou…

DigiZone.cz: Kolik lidí sleduje hokej na webu ČT?

Kolik lidí sleduje hokej na webu ČT?

Podnikatel.cz: Různé podoby lahve Coca–Coly. Úchvatné

Různé podoby lahve Coca–Coly. Úchvatné

DigiZone.cz: Změní se veřejnoprávní status ČT?

Změní se veřejnoprávní status ČT?

Vitalia.cz: Taky ji kupujete? Je šizená

Taky ji kupujete? Je šizená

Podnikatel.cz: Konečně vývar. Skoro jako od Steva Jobse

Konečně vývar. Skoro jako od Steva Jobse

Vitalia.cz: Kupujete český česnek? Je to trik

Kupujete český česnek? Je to trik

120na80.cz: 5 triků, jak zastavit krvácení po holení

5 triků, jak zastavit krvácení po holení

Vitalia.cz: Vydával se za český, prozradila ho DNA

Vydával se za český, prozradila ho DNA

120na80.cz: Jak správně vytrhnout mléčný zub?

Jak správně vytrhnout mléčný zub?