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íci0 .. 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říkazcesta 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ší
Počet přístupů na stránky 1