Portál AbcLinuxu, 10. května 2025 03:06
/etc
. Ale je to vrchol amaterismu, tak bych potreboval od Vas rady co a jak predelat a vylepsit. Tady je:
#!/bin/sh CIL="/zaloha" ZDROJ="/etc" NAZEV="`date +'%Y%m%d%M'`.tar.bz2" tar cfj $CIL/$NAZEV $ZDROJ find $CIL -mmin +30 -print0 | xargs -0 rm -f echo Zaloha $ZDROJ byla provedena...
Je to zkusebni verze, takze v cronu mam nastaveno spousteni kazdych 10 minut ( */10 * * * * /usr/local/scripts/zaloha > /var/log/zaloha.log
). Soubory starsi 30 minut se mi automaticky mazou. To je fajn. Ja bych ale potreboval:
1. aby mi hlaska zaloha /etc byla provedena...
nesla jen do /var/log/zaloha.log
, ale odeslala se i mailem.
2. jak do logu dostanu datum a cas zapisu?
3. aby me pro zmenu mailem nechodila hlaska tar: Removing leading `/' from member names
.
4. aby mi hlaska z bodu 1 nechodila a stare soubory se nesmazaly, kdyz neco selze a nova zaloha se neprovede. Ale aby me treba prislo Zaloha se neprovedla..bla bla
5. a jeste se mi, prosim, podivejte, jestli by prikaz tar
atd.. nesel nejak vylepsit..
Mockrat Vam dekuju.
echo `date`
?
3. Google je dnes vypnutý? tar ... && find ...
Ty dva ampersandy jsou takovým logickým and, viz man bash. Logickým or jsou dvě trubky: ||
5. Je to celkem dobrý - prostě to bude balit. Zato u toho findu je zbytečný xargs
(zas tolik těch souborů tam nebude).
BTW. opravdu nechcete rdiff-backup? man sh
1. Mohla by stacit premenna prostredia MAIL na zaciatku crontab-u, ak je ziaduce ci akceptovatelne zapnut odosielanie vystupov mailom pre vsetky cron joby; viac man crontab
.
2. Hadam by stacil aj samotny date
, nie? Vytvoril jsem si "skriptik" na zalohu /etc
. Ale je to vrchol amaterismu, tak bych potreboval od Vas rady co a jak predelat a vylepsit.
V principe si urobil spravnu vec: jednoduchy skript na riesenie jednoducheho problemu. Super, len tak dalej! Videl som jednoriadkove skripty, ktore spravne pomenovane a spravne umiestnene boli elegantne a genialne svojou jednoduchostou. Ako napisal Exupery: "Dokonalost je tam, kde nemozno nic odobrat, nie tam, kde nemozno nic pridat."
#!/bin/sh CIL="/zaloha" ZDROJ="/etc" NAZEV="`date +%Y%m%d%M`.tar.bz2" tar -cjf ${CIL}/${NAZEV} "$ZDROJ" 2>/dev/null && find "$CIL" -mmin +30 -print0 | xargs -0 rm -f if [[ `echo $?` -eq 0 ]]; then echo -e "`date`\nZaloha "$ZDROJ" byla provedena." > /var/log/zaloha.log mail -s "zaloha "$ZDROJ"" prijemce@domena.cz <<-MESSAGE `date` Zaloha "$ZDROJ" byla provedena. MESSAGE else echo -e "`date`\nZaloha "$ZDROJ" skonsila chybou!" > /var/log/zaloha.log mail -s "zaloha "$ZDROJ"" prijemce@domena.cz <<-MESSAGE `date` Zaloha "$ZDROJ" skonsila chybou! MESSAGE fi
Si si isty, ze ten skript je shellovsky a nie bashovsky?#!/bin/sh
Jsem rad i za malou pochvalu (snad jsem si to nevylozil spatne:) od cronina.Pochvala bola myslena uplne vazne.
Ted nevim, jestli se mam ubirat smerem rady od messy (bod 4) nebo pouzit skript od Honzy-S, ktery je urcite funkcni,Tot dilema. Nastastie je tu v zapati riesenie:
ale nerad bych ho jen kopcil a nerozumel muJa osobne uprednostnujem shellovske riesenia pred bashovskymi, uz len preto, ze to, co skriptujem, musi byt casto pouzitelne v Linuxe, BSD aj Solarise. No a napr. v takom FreeBSD defaultne bash nie je.
#!/bin/sh
zaměnit za #!/usr/bin/env bash
, jinak nebude fungovat.#!/bin/bash
.. ale nevim proc...
env
spouští uvedené utitlity/programy v závislosti na nastaveném prostředí. Zatímco #!/bin/bash
funguje pouze v případě, že se bash nachází pod uvedenou absolutní cestou.
/var/....
... Abych nezakladal nove vlakno, chtel bych se jeste zeptat, co mam spatne v radku: find "$CIL" -mmin +120 -print0 | xargs -0m -f
. Cron jsem nastavil, aby skript (stale jen zkusebne) provadel kazdou hodinu a mazaly se soubory starsi nez 2 hodiny (120 minut), ale vzdy se mi smazou vsechny a zustane jen posledni zaloha. Kdyz jsem to mel na tech napr. 30 minut, tak vsechno fungovalo bezvadne...
find "$CIL" -mmin +30 -print0 | xargs -0 rm -f
. Takhle to funguje, ale kdyz jsem tam dal dve "spojene" promenne nebo cestu /zaloha/etc_*
, tak me skript vypsal, ze /zaloha/etc_*
neni souborem ani adresarem. Kdyz jsem uvozovky zrusil, tak to slo. Nejak my z toho vyplyva, ze find "$CIL" -mmin +30 -print0 | xargs -0 rm -f
je to same jako find $CIL/* -mmin +30 -print0 | xargs -0 rm -f
. Nebo se pletu?
${$VAR}${$VAR2} ....
nebo /zaloha/${VAR}
${VAR}${VAR2}
[ales@pepa ~]$ ha=trdlo [ales@pepa ~]$ echo $ha trdlo [ales@pepa ~]$ echo "$(echo $ha)neco/g" trdloneco/g [ales@pepa ~]$ echo "${ha}neco/g" trdloneco/g Ale: [ales@pepa ~]$ echo "$haneco" [ales@pepa ~]$ echo "$haneco/g" /g
#!/usr/bin/env bash # promenne MOUNT="//jana-pc/D" CIL="/usr/zaloha" ZDROJ="/mnt/jana-D" PREFIX="jana-D_" POSTFIX=`date +%d%m%y`.tar.bz2 NAZEV=${PREFIX}${POSTFIX} # primountuje sdilenou slozku Win mount -t cifs ${MOUNT} ${ZDROJ} -o iocharset=utf8,codepage=1250,username=jana,password=jana # vyzalohuje adresar $ZDROJ tar -cjf ${CIL}/${NAZEV} "$ZDROJ" 2>/dev/null && # nalezne a smaze zalohy starsi xx dni find ${CIL}/${PREFIX}* -mtime +7 -print0 | xargs -0 rm -f # zasle informacni e-mail a zapise stav do logu if [[ `echo $?` -eq 0 ]]; then echo -e "`date` Zaloha "$ZDROJ" byla provedena." >> /var/log/zaloha.log mail -s "zaloha "$ZDROJ"" root@example.net <<-MESSAGE Dobry den, Zaloha "$ZDROJ" byla provedena v `date +%H:%M` `date +%d.%m.%Y` a je ulozena na serveru v "$CIL/$NAZEV" Vas zalozni server :) MESSAGE else echo -e "`date` Zaloha "$ZDROJ" SKONCILA CHYBOU!" >> /var/log/za mail -s "zaloha "$ZDROJ"" root@example.net <<-MESSAGE Dobry den, Zaloha "$ZDROJ" NEBYLA PROVEDENA v `date +%H:%M` `date +%d.%m.%Y`. Vas zalozni server :( MESSAGE fi # endDiky..
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.