Předání parametru pomocí xargs

Předání parametru pomocí xargs
« kdy: 31. 08. 2014, 20:07:34 »
Ahoj mám udělaný jednoduchý zálohovací skript který pouští crone ve dvě ráno. Idea je, že připravim data pro zálohování, připojim disk kde smažu starou zálohu starší než dva dny, nahraji novou a disk odpojím. Super.
Kód: [Vybrat]
#!/bin/bash

datum=$(date +%s)

rm -rf /zalohy/*
mkdir /zalohy/"$datum"
mkdir /zalohy/"$datum"/hosting
mkdir /zalohy/"$datum"/mysql

cd /var/www/clients
for dir in *; do
 if  [ -d $dir ]; then
   tar -c $dir | gzip > /zalohy/"$datum"/hosting/$dir.tar.gz
 fi
done

mount -t cifs -o username=XXXX,password=XXXX //3862.s62.wedos.net/XXXX /mnt/wdisk/

find /mnt/wdisk/s1/denni/* -maxdepth 0 -type d -mtime +1 | xargs rm -rf
cp -r /zalohy/* /mnt/wdisk/s1/denni/

umount /mnt/wdisk/

Problém mi dělá příkaz pro mazání záloh starších než dva dny:
Kód: [Vybrat]
find /mnt/wdisk/s1/denni/* -maxdepth 0 -type d -mtime +1 | xargs rm -rf
Když pustím celý skript cronem tak se staré zálohy nemažou. Když tento příkaz tak jak je okopíruji do příkazového řádku a pustím ručně tak se staré zálohy vymažou.

MOhl by mi někdo poradit v čem je zakopaný pes prosím????
« Poslední změna: 31. 08. 2014, 21:16:36 od Petr Krčmář »


Re:předání parametru pomocí "xargs rm -rf"
« Odpověď #1 kdy: 31. 08. 2014, 20:30:11 »
Dík za nápad ale u mě to takhle nefunguje. Zkusil jsem jen to hledání kdy jsem změnil -mtime na +0 protože předvčerejší už je smazaná a bez /* mi to nehledá?
Kód: [Vybrat]
[root@xxxx scr]# find /mnt/wdisk/s1/denni/* -maxdepth 0 -type d -mtime +0
/mnt/wdisk/s1/denni/1409356801
[root@xxxxx scr]# find /mnt/wdisk/s1/denni -maxdepth 0 -type d -mtime +0
[root@xxxxx scr]#

Jimm

Re:předání parametru pomocí "xargs rm -rf"
« Odpověď #2 kdy: 31. 08. 2014, 20:55:49 »
Nemáš náhodou hosting dohromady s Fotkou?  :D

Re:Předání parametru pomocí xargs
« Odpověď #3 kdy: 31. 08. 2014, 21:17:59 »
Smazal jsem předchozí komentář, nejapně se snažil poradit variantu, která měla za úkol smazat všechny připojené disky.

K věci: Pokud se nějaký příkaz na řádce spustí, ale Cronu se nelíbí, obvykle je to tím, že Cron nemá ve svém prostředí stejné cesty jako uživatel. Doporučuji proto k použitým příkazům přidat celou cestu, například /usr/bin/find a podobně.

ET

Re:Předání parametru pomocí xargs
« Odpověď #4 kdy: 01. 09. 2014, 16:00:18 »
Petr na to pravdepodobne kapnul - zkus absolutni cestu k prikazu find

OT: doporuciji prostudovat parametry "--delete" popr "--exec" u prikazu find


Re:Předání parametru pomocí xargs
« Odpověď #5 kdy: 03. 09. 2014, 07:57:08 »
Tak jsem ten příkaz upravil že jsem tam přidal cestu k find a rm a stejně to nefunguje ... z řádky ano, z crone ne. Nevim?
Kód: [Vybrat]
/bin/find /mnt/wdisk/s1/denni/* -maxdepth 0 -type d -mtime +0 | xargs /bin/rm -rf

dword

Re:Předání parametru pomocí xargs
« Odpověď #6 kdy: 03. 09. 2014, 08:51:42 »
Jen hadam... mozna jeste pridat absolutni cestu k xargs

Ego

Re:Předání parametru pomocí xargs
« Odpověď #7 kdy: 03. 09. 2014, 10:31:18 »
Tak jsem ten příkaz upravil že jsem tam přidal cestu k find a rm a stejně to nefunguje ... z řádky ano, z crone ne. Nevim?
Kód: [Vybrat]
/bin/find /mnt/wdisk/s1/denni/* -maxdepth 0 -type d -mtime +0 | xargs /bin/rm -rf

A dojde to vůbec k tomu příkazu find?  cron umí mailovat výstup, a rozhodně bych k tomu dodal i stderr.  Takže skript by začínal

#!/bin/bash -x

což by zajistilo logování spouštěných příkazů na stderr.  Kdyby z nějakého důvodu nepřipadalo mailování v úvahu, hned následující řádka

exec >log 2>&1

by zajistila uložení výstupu, včetně stderr, do souboru "log".

Re:Předání parametru pomocí xargs
« Odpověď #8 kdy: 03. 09. 2014, 12:06:08 »
Po jakým uživatelem cron ten skript spouští? Jestli nemůže být problém s právy. Problém můžou dělat taky jiné proměnné prostředí. Podíval bych se do logu cronu.

Re:Předání parametru pomocí xargs
« Odpověď #9 kdy: 03. 09. 2014, 21:30:42 »
Cron úloha se spouští jako root a v logu nic zajímavého.

Ohledně těch cest. Udělám něco špatně když nastavim výchozí cesty přímo do cron job(u) tak že to bude vypadat následovně? Pak bych přeci nemusel psát celé cesty ke každému příkazu. Je to tak?
Kód: [Vybrat]
## backup jobs#

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin

0 2 * * *     root /scr/zdenni

To s tim logováním otestuji. Zatim moc dík.

Re:Předání parametru pomocí xargs
« Odpověď #10 kdy: 04. 09. 2014, 00:52:28 »
Ano, takto nastavená PATH by se měla projevit (pokud tam nemáte nějaký obskurní/minimalistický cron, který to neumí). V daném případě bych trasoval provádění skriptu jak bylo nastíněno už výše.

Tom22

Re:Předání parametru pomocí xargs
« Odpověď #11 kdy: 04. 09. 2014, 09:37:12 »
Jen poznámka:
pozor na xargs když nedostane žádný vstup, což se u výstupu z příkazu find může lehce stát.
Doporučuji vždy zvážit, jestli by se u xargs nehodilo přidat switch -r nebo --no-run-if-empty
(Popis switche v man xargs)


Ego

Re:Předání parametru pomocí xargs
« Odpověď #12 kdy: 07. 09. 2014, 12:43:36 »
Snad nam vana-hb napise jak dopadl, tj. v cem byl problem, at z toho taky neco mame :).

jenda

Re:Předání parametru pomocí xargs
« Odpověď #13 kdy: 08. 09. 2014, 07:28:27 »
jak psal p. krcmar - obvykle je to o cestach, staci pridat absolutni ke vsem prikazum.
pripadne zkontrolovat korektni nastaveni casu v tom spoustecim cronu.
nic sloziteho bych v tom nehledal.

Re:Předání parametru pomocí xargs
« Odpověď #14 kdy: 08. 09. 2014, 07:59:22 »
Abych nedlužil odpověď, řekl bych, že se to rozchodilo po přidání cest do crone skriptu:
Kód: [Vybrat]
# backup jobs

[b]SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin[/b]

0 2 * * *     root /scr/zdenni

s touhle verzí přílkazu ve spouštěném skriptu:
Kód: [Vybrat]
/bin/find /mnt/wdisk/s1/denni/* -maxdepth 0 -type d -mtime +0 | xargs /bin/rm -rf
Takhle to fuguje. Myslim, že teď s cestama v crone skriptu by šlo používat jen krátký zápis u příkazů. Mám CentOS 6.5 2.6.32-431.1.2.0.1.el6.x86_64

Tak moc děkuji za nasměrování. vana-hb