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)
Našli jste v článku chybu?
Vitalia.cz: Jelení farma produkuje kvalitní maso

Jelení farma produkuje kvalitní maso

DigiZone.cz: Světlé zítřky gaučových sportovců

Světlé zítřky gaučových sportovců

120na80.cz: Cestovní nevolnost. Co pomůže?

Cestovní nevolnost. Co pomůže?

Podnikatel.cz: Český podnikatel a #brexit. Co nastane?

Český podnikatel a #brexit. Co nastane?

Vitalia.cz: 3× o tucích: proč je potřebujeme?

3× o tucích: proč je potřebujeme?

Podnikatel.cz: Chce s trdelníky ovládnout Asii. Poznejte ho

Chce s trdelníky ovládnout Asii. Poznejte ho

Lupa.cz: U Chomutova vyroste dotované datacentrum

U Chomutova vyroste dotované datacentrum

DigiZone.cz: Robinsonův ostrov moderuje Novotný

Robinsonův ostrov moderuje Novotný

Vitalia.cz: Tohle kafe má být hit léta

Tohle kafe má být hit léta

Lupa.cz: Jaké IoT tarify nabízejí mobilní operátoři?

Jaké IoT tarify nabízejí mobilní operátoři?

Vitalia.cz: Vědci: Hnojení chemií je zbytečné

Vědci: Hnojení chemií je zbytečné

120na80.cz: Proč komáři létají hlavně večer?

Proč komáři létají hlavně večer?

DigiZone.cz: Boj Markízy a Novy o federální trh vrcholí

Boj Markízy a Novy o federální trh vrcholí

Měšec.cz: Tipy, než vyrazíte autem na dovolenou

Tipy, než vyrazíte autem na dovolenou

Měšec.cz: Vyplatí se spořit přes DPS?

Vyplatí se spořit přes DPS?

DigiZone.cz: Kanály Novy na Slovensku oficiálně?

Kanály Novy na Slovensku oficiálně?

DigiZone.cz: Mobilní aplikace pro DVTV je tady

Mobilní aplikace pro DVTV je tady

Lupa.cz: Vzali věc, která fungovala, a přidali internet

Vzali věc, která fungovala, a přidali internet

120na80.cz: Léky a dietní opatření při kopřivce

Léky a dietní opatření při kopřivce

Měšec.cz: Ceny PHM v Evropě. Finty na úspory

Ceny PHM v Evropě. Finty na úspory