Programy pro práci s datumem a časem
Několik utilitek které slouží k nastavování, změnám a výpisům časových údajů.
OBSAH
Date
Rdate
Cron
Cal
Ncal
Date
slouží k vypsání a nastavování systémového času a data
parametry pro výpis
%a | zkratka dne v týdnu (Thu) |
%A | plné jméno dne v týdnu (Thursday) |
%b nebo %h | zkratka měsíce (Aug) |
%B | plné jméno měsíce podle (August) |
%c | datum a čas podle (Fri Aug 29 08:01:45 2008) |
%d | den v měsíci (01-31) |
%D | datum ve tvaru mm/dd/rr |
%j | den v roce (001-366) |
%m | měsíc (01-12) |
%u | číslo týdne s nedělí jako prvním dnem týdne (00-53) |
-v | vypíše aktuální datum navýšený/ponížený o určený počet časových jednotek
Formát dotazu je -v[+|-]číslo[ymwdHMS]
viz příklad níže
|
%w | den v týdnu (0-6), 0 je neděle |
%W | číslo týdne s pondělím jako prvním dnem v týdnu (00-53) |
%y | poslední dvojčíslí roku (00-99) |
%Y | rok (2008) |
%H | hodina-doplnuje 0 před jednotky hodin (00-23) |
%I | hodina-doplnuje 0 před jednotky hodin (01-12) |
%k | hodina (0-23) |
%l | hodina (1-12) |
%M | minuta |
%p | označení dopoledne/odpoledne |
%r | čas ve dvanáctihodinovém cyklu (hh:mm:ss [AP]M) |
%s | počet sekund od 1. ledna 1970 00:00:00 UTC |
%S | vteřin (00-61) |
%T | as ve čtyřiadvacetihodinovém cyklu (hh:mm:ss) |
%X | místo (%H:%M:%S) |
%Z | časová zóna (např. EDT,CEST...) |
+ | direktiva popisující formát |
%n | odřádkování |
%t | tabelátor |
příklady-výpisy
výpis času a data
date
výsledek
Wed Aug 27 12:40:45 CEST 2008
vypíše jen datum
date "+DATE: %Y-%m-%d"
výsledek
DATE: 2008-08-27
vypíše jen den
date "+DATE: %d"
výsledek
DATE: 27
nebo
date +%d
výsledek (v tomto případě nebude připsáno slovo date)
27
vypíše čas (hodiny,minuty,sec)
date "+TIME: %H:%M:%S"
výsledek
TIME: 12:57:32
vypíše čas (hodiny,minuty,sec) s dvotečkami mezi hodnotamy
date "+%H:%M:%S"
výsledek
12:57:51
vypíše čas (hodiny,minuty,sec) s mezerami mezi hodnotamy -vhodné pro další zpracování
date "+%H %M %S"
výsledek
12 58 07
vypíše čas (hodiny,minuty,sec) s "popisem"
date "+ hodin %H minut %M vterin %S"
výsledek
hodin 13 minut 14 vterin 01
vypíše datum(rok,měsíc,den)každý na jednu řádku
date "+%y%n%m%n%d"
výsledek
08
08
28
přidá k aktuálnímu datu 2 měsíce
date -v+2m
Sat Jul 25 09:20:14 CEST 2009
vypíše zvlášt datum a čas
date "+DATE: %Y-%m-%d%nTIME: %H:%M:%S"
výsledek
DATE: 2008-08-27
TIME: 12:40:15
příklady-nastavení
nastaví pouze čas na 15h 52min
date 1552
změna data a času (rok 2008, měsíc 01, den 20, hodina 16, minuta 01)
date 200801201601
Užitečná věc
Pokud budete chtít spočítat rozdíl v časů v lidsky čitelné podobě, např pro nějaký script, je výhodné použít konverzi z času od počátku epochy (počet sekund od 1. ledna 1970 00:00:00 UTC),
a z rozdílů časů složit normální výstup. Přiblížím to na příkladu. Za pomoc děkuji Danovi Lukešovi.
#!/usr/local/bin/bash
#sejmeme cas pred zacatkem prikazu
zacatek=`date "+%s" `
#nejaky prikaz.!!Pokud si to budete poustet, nastavte si nejaky mensi cas, nebo si pockate 2h na dokonceni scriptu :-))
sleep 7350
#sejmeme cas na konci prikazu
konec=`date "+%s" `
#spocteme rozdil mezi zacatkem a koncem prikazu
rozdil=$(($konec - $zacatek))
#nastvi date na CET a prevede sekundy na hodin,minuty a vteriny
cas=`date -u -j -f "%s" "$rozdil" "+%k hodin, %M minut a %S sekund"`
#vypise dobu trvani
echo Script trval "$rozdil" sekund coz je "$cas".
Výsledek
Script trval 7350 sekund coz je 2 hodin, 02 minut a 30 sekund.
Rdate
program pro synchronizaci casu na serveru
cd /usr/ports/sysutils/rdate
make install
upravíme rc.conf
ee /etc/rc.conf pridame radek
rdate_enable="YES"
spustime
rdate -s tak.cesnet.cz
kontrola data
date
nastaveni v cronu
crontab -e
-------------------------------------
protože defaultní editor je "vi" a má pro většinu lidí šílený ovládání,uvedu jen základní příkazy,aby jste byli schopni to alespon upravit a opustit
klávesou
"insert" se dostanete to psacího modu
provedete změny a pro
-uložení použijete sekvenci
ESC:wq
-pro odchod beze změn použijete sekvenci
ESC:q!
-------------------------------------
zapíšeme následující řádek
#synchronizace casu z internetu
*/30 * * * * /usr/local/sbin/rdate -s tak.cesnet.cz >/dev/null 2>&1
kontrola
ps aux
pripadne se necha pouzit program ntpdate,instalace a nastavení je shodné jako rdate
/usr/sbin/ntpdate -s ntp.bts.sk
Cron
cron se používá na plánované spuštění scriptů nebo programů v předem určený čas
Možné volby příkazu crontab
-l | prohlížení crontabu |
-e | editace crontabu, případně vytvoření, pokud byla tabulka předtím smazána |
-r | smazání tabulky |
-u uživatel | vytvoření/edidtace tabulky pro daného uživatele |
adresáře s tabulkama cronu
uživatelské
/var/cron/tabs
rootovská
/etc/crontab
restart crona
kill `cat /var/run/cron.pid` && cron
nebo
/etc/rc.d/cron restart
Pokud si chcete pouze vyzkoušet nastaveni crona, tak jej zastavte příkazem
kill `cat /var/run/cron.pid`
a crona spustte s parametrem -x test
cron -x test
pokud se zdá, že vše funguje, ukončete jej kombinací kláves
Ctrl+c
a nahodte jej normálně
cron
a zkontrolujeme zda běží
ps aux | grep crond
root 311 0.0 0.7 1284 112 ? S Dec24 0:00 crond
cog 8606 4.0 2.6 1148 388 tty2 S 12:47 0:00 grep crond
Definování uživatelů, kteří mohou používat cron
Slouží proto 2 soubory-
/etc/cron.allow a
/etc/cron.deny
Pokud budete chtít někomu zablokovat crona, uvedte jeho jmémo (uživatele) do souboru
/etc/cron.deny.
Mužete použít direktivu ALL pro zablokování všech uživatelů, a ti kteří mohou mít přístup, uvedte do souboru
/etc/cron.allow.
struktura tabulky je následující
minuty hodiny dny měsíce den-v-tydnu kdo příkaz
*/5 * * * * root /usr/local/script.sh
Poznámka
-Pokud jej spustíme pod běžným uživatelem, příkaz se bude vykonávat s právy tohoto uživatele.Pokud jej spustíme pod rootem, můžeme nadefinovat, uživatele pod jehož právy příkaz poběží
-Komentáře nesmějí být na stejné řádce jako příkaz, jinak jsou považovány za součást příkazu
-Cron standartně používá cestu /usr/bin:/bin a shell /bin/sh. Proto se vám často stane, že script, který jste si napsali, vám funguje , pokud jej spustíte ručně,
ale cron jej nespustí. Řešním je do scriptů budto psát celé cesty k programům (např./sbin/mount, /usr/local/bin/wget ), nebo cestu dát do proměnné wget="/usr/local/bin/wget"
a ve sriptu pak nepoužívat wget, ale volat proměnnou "$wget".Úplně nejlepší je ale na první řádku crontabu vložit tuto řádku
PATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/root/bin"
a máte do budoucna po starosti.
Stejně tak si můžete nadefinovat, jaký shell má cron používat(nejlepší je ale jej uvést přímo na první řádce scriptu #!/usr/local/bin/bash
), nebo proměnnou HOME, kterou cron standartně čte v /etc/fstab si můžete nastavit jinou.
Popis sloupců v crontabu a jejich možné hodnoty
1 sloupec=minuty | 0-59 |
2 sloupec=hodiny | 0 .. 23 |
3 sloupec=dny v měsíci | 0 .. 31 |
4 sloupec=měsíce | 1 .. 12 nebo název: jan, feb... |
5 sloupec=den v týdnu | 0 .. 6 (obojí 0 a 7 je neděle) nebo název: mon, tue... |
6 sloupec=hodiny | uživatel pro kterého se příkaz spouští(s jehož právy)-POZOR pouze pro root tabulku |
7 sloupec=příkaz | cesta ke scriptu, příkaz |
místo prvních 5ti sloupců můžeme použít tyto příkazy
@reboot | spust jednou po startu stroje |
@yearly | spust jednou ročně, "0 0 1 1 *" |
@annually | stejné jak předcházející |
@monthly | spust jednou měsíčně, "0 0 1 * *" |
@weekly | spust jednou týdně, "0 0 * * 0" |
@daily | spust jednou denně, "0 0 * * *" |
@midnight | stejné jak předcházející |
@hourly | spust jednou za hodinu, "0 * * * *" |
vždy je třeba hlídat předcházející hodnotu,* značí každý (den,měsíc,hodinu,atd)
Příklady
spust každých 5 minut
*/5 * * * * root /usr/local/script.sh
spust v 5hodin a 3minuty
1 5 * * * root /usr/local/script.sh
spust PO MINUTĚ po dobu 5hodiny ráno
* 5 * * * root /usr/local/script.sh
spust v sobotu ve 4h 15min
15 4 * * 6 root /usr/local/script.sh
spoustej kazdou minutu
*/1 * * * * root /usr/local/script.sh
spoustej v pondělí v 6:00
0 6 * * Mon root /usr/local/script.sh
spust neco kazdou lichou hodinu kazdy sudy den
* 1-23/2 */2 * * root /usr/local/script.sh
Zalohovani dat 1 x mesicne prvniho v 0:42
42 0 1 * * root /usr/local/script.sh
spust denne v 5:58, 11:58 a 17:58, vystup potlacen
58 5,11,17 * * * root /usr/local/script.sh>/dev/null
v 9h večer pošle mail na uvedenou adresu
0 21 * * * echo "Nazdar!" | mail mujmail@umedoma.cz
večer, od 10 do 16h po 2h pošle mail na uvedenou adresu a vloží do něj obsah souboru
0 10-16/2 * * * mail -s "nejaky predmet" mujmail@umedoma.cz < soubor.txt
Cal
kalendář v příkazové řádce
cal y zobrazí celý rok po měsících
cal zobrazí aktuální měsíc
cal -m july nebo
cal -m 6 (číslo měsíce) zobrazí vybraný měsíc
Ncal
velice podobný předchozímu, možná trochu přehlednější