Newsgroup: it.comp.os.linux.sys
Titolo: crontab per backup giornal./settiman./mensili

Una volta al mese voglio fare un backup generale di tutti i miei
filesystem.
Una volta alla settimana voglio fare un backup incrementale che
comprenda tutte le differenze che si sono create sui filesystem nel 
corso della settimana.
Una volta al giorno voglio fare un backup incrementale che comprenda
tutte le differenze che si sono create dall'ultimo backup settimanale (o
mensile, se non sono stati ancora effettuati backup settimanali).
Questo è il file che vorrei dare in pasto al crontab:
#######################################################################
# m h dom mon dow       job
SCRIPTDIR=/root/bin
# A fine mese ricordami di fare il backup mensile
30  15  31  1-7/2,8-12/2  *	memobak.monthly
30  15  30  4-6/2,9-11/2  *	memobak.monthly
30  15  28  2             *	memobak.monthly
# Il backup settimanale viene effettuato di domenica
15  13  *  *  0		bak.weekly
# Backup giornaliero
55  19  *  *  1-6	bak.daily
#######################################################################
Il problema è che non voglio che venga effettuato un backup giornaliero
o settimanale l'ultimo giorno del mese, dato che viene già fatto il
backup generale mensile! Sarebbe un'inutilissima perdita di tempo!
Non so come dirlo al cron, però! Se infatti scrivessi per esempio delle 
righe per il backup giornaliero in questo modo:
# Backup giornaliero
55  19  1-30     1-7/2,8-12/2   1-6	bak.daily
55  19  1-29     4-6/2,9-11/2   1-6	bak.daily
55  19  1-27,29  2              1-6 	bak.daily
le cose non funzionerebbero come voglio. Infatti il backup giornaliero
verrebbe comunque eseguito tutti i lun, mar, mer, gio, ven e sab, anche
se questi giorni cadono l'ultimo del mese! (le condizioni espresse dal 
3° e 5° campo sono legate assieme da un "or" logico, man 5 crontab)
D'altro canto, non vorrei dovere ricorrere a qualcosa del genere:
# Backup settimanale
15  13  7-28/7  1,3-12  *	bak.weekly
15  13  7-21/7  2       *	bak.weekly
# Backup giornaliero
15  13  1-6,8-13,15-20,22-27,29,30  1-7/2,8-12/2    *	bak.daily
15  13  1-6,8-13,15-20,22-27,29     2,4-6/2,9-11/2  *	bak.daily
perchè è vero che risolverei il problema, però i beckup settimanali non
sarebberò più fatti esclusivamente la domenica come voglio. Infatti,
dato che i backup settimanali li scrivo su dei CD-RW diversi da quelli
dstinati ai backup giornalieri, mi è mooolto + facile ricordare di
cambiare i supporti se il backup settimanale viene fatto un giorno della
settimana fisso, come ad es. la domenica!
L'ideale sarebbe potere in qualche modo legare le condizioni espresse
dal 3° e dal 5° campo per mezzo di un "and" logico e non di un "or"...
Ma come posso fare?
Ciaaz
-- 
Davide Cavallari

 of each month?
[A little late,but...]
How can you do this?   You can't!
At least, you can't with the "standard" (as in "Official, Approved,
Standard) cron.
Why?
Because the Standards specification of cron is _screwed up_.  (And, in
my opinion, Wrong, Useless, and Idiotic!  Not that I have strong
feelings about this, of course....  )
While (almost) all the time "filtering" specification on a cron line
are, in effect, ANDed together (you have to meet _all_ of them for the
line to kick in), the  day-of-week and day-of-month interact completely
differently.  If you specify only one (and specify the other as a "*"),
you get logical results.  If you specify _both_, you get the logical
union (logical OR) of their values.
Thus...   0 1 1-7 * sun Run_me_on_first_Sunday
in fact runs the script on days 1-7 of a month, AND on EACH Sunday -- a
total of 10 or 11 times per month.
This is clearly insane, but that's what the Standard mandates.
How to "do the right thing"?   You have to make an additional check
inside the script you run.  Assuming  you start it on the first 7 days
of a month, you have to check for Sunday inside the script.  There's
no helping this.
Existing cron is counter-intuitive:  If we are at the correct  
minute AND hour AND day AND month -- do it.  That's simple enough.
But wait!  If we want a day-of-week, then it's correct 
minute AND hour AND day AND month AND weekday -- -Oops...
no, that's not right.   It's  correct 
minute AND hour AND month AND (day OR weekday). 
 
Anything seem inconsistent about that?
[Aside:  There once _was_ a system that did implement cron
correctly_.  
0 1 1-7 * sun  some_script
_would_ run exactly _once_ per month -- on the first
Sunday.  This
was a BSD 4.3 system.   It's the System V derived
crons that had it wrong.
Once, long long ago in a newsgroup far far away...
it was said that
a Bell Labs "summer hire" got a "&&" confused with a
"||", which
is why cron is now so "weird".   When Unix was
standardized, the
Standards Body merely documented existing behavior
of "existing
implementations" (and picked the wrong existing
implementation,
but that's another story), so we are "stuck"
with this non-intuitive
cron behavior.   At least that's what my memory
tells me.]
If anyone can reasonably "correct" me on this,
I'm certainly willing
to listen.
If anyone can show me a _practical_ example of
why a "0 1 1-7 * sun"
cron line should run 10 or 11 times per month
rather than only once,
I'd _really_ be willing to listen.   I can see
absolutely NO reason
why such behavior is desirable.  (But I can see
_many_ reasons why
the once-per-month behavior _is_ desired.  But
unachievable with cron.)
So far, after a number of repeated requests
over the years, I have
received exactly zero such examples.
[Hey!  Where'd that soap box come from?]
Cron is a Windmill -- and I'm tilting at it!
(Or so it seems)
--
John G Dobnick
j...@csd.uwm.edu
 
---------------------------------------------------------------
-- 
Davide Cavallari

 Ma come posso fare?
un check nello script di backup:
if <e' l'ultimo giorno del mese>; then exit; fi
ciao,
marco


sì, è quello che in effetti ho fatto. speravo però di cavarmela
semplicemente col cron, ma non si può   :^(
pazienza!
grazie1000
-- 
Davide Cavallari