Newsgroup: it.comp.os.linux.sys
Titolo: cron difficilotto

Ciao a tutti,
secondo voi esiste un modo per lanciare un comando l'ultimo giorno
lavorativo del mese, considerando lavorativi lun-ven?
-- 
g4b0, linux user n. 369000
http://gabo.homelinux.com

 lavorativo del mese, considerando lavorativi lun-ven?
Secondo me no, ma sono sempre molto disponibile ad imparare :).
Io al tuo posto farei uno script che controlla se è verificata quella 
condizione (ultimo giorno lavorativo del mese) e solo in caso 
affermativo esegue il comando, e imposterei in cron l'esecuzione di 
questo script tutti i giorni.
-- 
Ciao,
   Marco.


Strano che non ci sia già qualcosa di questo tipo (o meglio ci sarà di
sicuro), in effetti definire intervalli strani con cron è un po'
arduo...

 lavorativo del mese, considerando lavorativi lun-ven?
E' un po' assurdo, comunque puoi fare uno script (da eseguire ad esempio
verso il 15 del mese - con cron) che calcola qual e' l'ultimo venerdi' del
mese e va a scrivere o a modificare una riga nel crontab.
Esempio:
0 10 15 * *  root  calcolaven.sh
dove calcolaven.sh e' uno script fatto cosi':
#!/bin/bash
lastfri=`cal | tail -n +2 | awk '{print $6}' | tr '\n' ' ' | awk '{print
$NF}'`
echo "30 23 $lastfri * *  root   tuoscript.sh" >> /etc/crontab
o una qualche variazione su questa falsariga.
Ciao!

> lavorativo del mese, considerando lavorativi lun-ven?
Ah ok, vuoi l'ultimo /lavorativo/. Allora dovrebbe essere questo comando:
lastw=`cal | tail -n +2 | awk '{print $2,$3,$4,$5,$6}' | tr '\n' ' ' |
awk '{print $NF}'`

 lavorativo del mese, considerando lavorativi lun-ven?
Se sai trovare qual'e` l'ultimo giorno lavorativo del
mese :-) (come da suggerimento precedente), lanci cron
ogni giorno e, se quello e` il giorno che ti interessa
continui, altrimenti esci.
Tipo, ogni giorno:
if(date=last_working_day)
then
   do_what_I_want;
fi
Direi che la parte piu` difficile e` trovare l'ultimo
giorno lavorativo.
Cosa succede se e`, per es., festa nazionale?
bye,
-- 
piergiorgio

 Cosa succede se e`, per es., festa nazionale?
Direi che non dovrebbe capitare. Le feste che cadono piu' in la' nel mese
sono il 26 dicembre e il 25 aprile (se non mi sfugge niente). In entrambi i
casi, ci sono sempre almeno tre giorni lavorativi nel periodo che va da
dopo la festa alla fine del mese.

 dopo la festa alla fine del mese.
Ah no, c'e' l'eccezione di pasqua. Potrebbe capitare pasqua ad esempio il
penultimo giorno di un mese, e anche il lunedi' dopo e' festa. In quel caso
bisognerebbe andare al venerdi' precedente.
Effettivamente, nel 2059 e nel 2070 questo capitera' (30 marzo) Ma forse per
allora quello script non necessitera' piu' di essere eseguito... :-)

 allora quello script non necessitera' piu' di essere eseguito... :-)
Io metterei un commento nello script, che non si sa mai,
poi facciamo come per Y2K ed i programmi in COBOL... :-)
bye,
-- 
piergiorgio

antani ha scritto:

Gli script bash sono ottimi quando poco comprensibili, una cosa del 
genere in python
#!/usr/bin/env python
import datetime, calendar
c = datetime.date.today()
lastD = calendar.FRIDAY
lastf = calendar.monthcalendar(c.year, c.month)[-1][lastD]
if not lastf:
	lastf = calendar.monthcalendar(2008,1)[-2][lastD]
if lastf == c.day:
	print "ultimo venerdi del mese"
else:
	print "niente da dichiarare"
E' molto più lunga ma anche molto più flessibile e comprensibile...
Anzi credo che lo generalizzerò un po' per magari utilizzarlo in futuro, 
andando a mettere le festività in un calendario ICS e pescandole da 
python si risolvono tutti i problemi di pasqua e simili, mmm

 print "niente da dichiarare"
Questo mi pare trovi l'ultimo venerdi' del mese (come avevo erroneamente
fatto io all'inizio), non l'ultimo giorno lavorativo.

 
Non complicarti la vita, lascia che cron lanci lo script ogni giorno, poi lo
script determinerà se è il momento giusto.

 
Ancora più semplice:
#!/usr/bin/env python
import datetime, calendar, pickle
c = datetime.date.today()
lastD = calendar.FRIDAY
lastf = max(calendar.monthcalendar(c.year, c.month)[-1][:5])
print "ultimo giorno lavorativo del mese = ", lastf
if lastf == c.day:
	print "ultimo venerdi del mese"
else:
	print "niente da dichiarare"
Si potrebbe addirittura con pickle "salvare" tutti gli ultimi giorni del 
mese da qui all'eternità in una bella lista/dizionario :)

 più chiaro e portabile.
Si', ma e' piu' lungo e devi avere python installato.
Comunque capisco il tuo punto di vista, non voglio fare flame. Ognuno lavora
con gli strumenti con cui si trova meglio, ovviamente, anche perche' alla
fine e' probabilmente piu' produttivo con quelli.
Ciao!

 
No per carità io purtroppo non sono un guru della bash, l'ho studiata 
parecchio ma non mi "entra nelle dita" come altri linguaggi.
Dico solo che secondo me anche il guru della bash riguardando del codice 
tipo il tuo 1 anno dopo che l'ha scritto ci mette un po' a raccapezzarsi.
E i vantaggi in fondo quali sono?
Giusto così per fun and profit ho usato pickle per salvare tutti gli 
ultimi giorni lavorativi, a una prova semplice funziona:
#!/usr/bin/env python
import datetime, calendar, pickle, sys
FILENAME = 'date.data'
def createData():
	"""docstring for createData"""
	dat = {}
	y = datetime.date.today().year
	for i in range(y, y+10):
		for j in range(1,13):
			dat[(i,j)] = max(calendar.monthcalendar(y,j)[-1][:5])
	return dat
try:
	f = open(FILENAME,'rb')
except IOError:
	d = createData()
	try:
		o = open(FILENAME,'wb')
	except IOError:
		print "non riesco a creare il file"
		sys.exit(1)
	pickle.dump(d,o)
	o.close()
	f = open(FILENAME,'rb')
d = pickle.load(f)
f.close()
td = datetime.date.today()
if d[(td.year, td.month)] == td.day:
	print "e' proprio oggi"
else:
	print "niente di strano"
 

 piů chiaro e portabile.
Uhm, per prima cosa un pipe di comandi shell funziona
in _parallelo_ ed e` il metodo piu` elementare per
ottenere multithreading, senza rompersi la testa.
Secondo, se usi bash la portabilita` e` la stessa.
Terzo, anche con python, da una versione all'altra,
vi sono idiosincrasiase ed incompatibilita`.
Attenzione, python hai i suoi meriti, ma non per
questo particolare tipo di script.
Ovviamente, se tu conosci python meglio di bash,
usa python, senza dubbio.
bye,
-- 
piergiorgio

 
Non è tanto che lo conosco meglio, è che se devo scrivere più di 2 righe 
(per dire) mi rendo subito conto che con bash diventa potenzialmente un 
letamaio, mentre in python rimane sempre pulito e chiaro.
Non è tanto la concisione quanto la chiarezza la scalabilità e la 
semplicità di manutenzione che mi premono, poi ognuno ha le sue "priorità"..

 per questo genere di problemini.
Diciamo che il debugging e` piu` agevole, in generale,
poiche` scrivi codice con un unico linguaggio.
Ma nel caso di pipe, un "tee" in mezzo, ti consente
un fantastico flow-dumping!!! :-)
bye,
-- 
piergiorgio

 E i vantaggi in fondo quali sono?
(semiserio)
http://catb.org/~esr/writings/unix-koans/ten-thousand.html
Ciao!

 lavorativo del mese, considerando lavorativi lun-ven?
Lo scopo e' poi di lanciare un programma che faccia casini, in modo tale che
il sistemista si bruci il fine settimana? :)
-- 
Per rispondermi, sostituisci a nomecognome il mio nome e cognome
To reply me, substitute nomecognome with my real name and surname
http://bitsandchaos.wordpress.com

antani ha scritto:

Ma la fine del mondo non è fissata per il 19 gennaio 2038 alle 3:14 di 
mattina?

 mattina?
Secondo piu', secondo meno.
-- 
           |Save our planet!
    Ciao   |Save wildlife!
   roberto |For your E-MAIL use ONLY recycled Bytes  !!
           |roberto poggi   
rpo...@softhome.net

 mattina?
Uh, buono a sapersi.
Aspetta che me lo segno :-)

Leggo solo ora, grazie a tutti per l'interessamento..
In effetti alla fine ho delegato il tutto allo script che lancio gli ultimi
3 giorni del mese, il quale vede se si tratta dell'ultimo giorno lavorativo
e si comporta di conseguenza. 
Chissà se le operazioni pianificate di Win$ hanno questa feature..


 
http://catb.org/~esr/writings/unix-koans/ten-thousand.html
Ma concordo pienamente!
Dopo aver realizzato tutto il realizzabile in
shell script, si raggiunge l'illuminazione e si
comprende che non e` piu` necessario programmare! :-)
bye,
-- 
piergiorgio

 e si comporta di conseguenza. 
C'e` anche un'altra possibilita`, che potrebbe
avere un suo perche`.
Usare "atd", invece di "crond".
Nel dettaglio: con uno script (python od altro) crei
il calendario delle date prescelte, per un anno, per
10 anni, quello che vuoi.
Poi, sequenzialmente, installi su tutte le date un
processo con "at".
Il vantaggio e` che puoi, esternamente, sempre con "at",
manipolare l'esecuzione, aggiungere o togliere job, etc.
Ovviamente devi aggiungere un ultimo (o penultimo) job
che ti avvisi che sei alla fine o che rifaccia tutto
da solo (meglio la prima).
bye,
-- 
piergiorgio

 con awk ci sarebbe da rompersi la testa molto di piu'.
Beh, almeno il cal iniziale bisogna farlo fuori, per dare un input ad
awk...poi pero' effettivamente:
cal | awk 'NF>=2{last=(NF>6?$6:$NF)} END {print last}'; done
anzi, e' anche piu' semplice... :-)

 
Domanda ironica o seria?
Per fare cose con grado di intelligenza > 0.0001 le finestre e i loro 
programmini point & click non vanno mai bene a quanto ho visto ;)

 mattina?
Secondo il calendario Maya, verso il 20 Dicembre 2012. 


 dura :))
Beh, l'algoritmo si trova facilmente e non ci vuole molto ad adattarlo.
Ma...ricorda il koan di ESR...perche' programmare quando si puo' usare uno
script?
function pasqua {   
wget -O- -q  "
http://www.holidaywebservice.com/Holidays/HolidayService.asmx/GetHolidayDate?countryCode=US&holidayName=Easter&year=${1}
" |
sed 's/<[^>]*>//g;/^[[:space:]]$/d' | cut -c 6-10
} 
$ pasqua 2008
03-23
$ pasqua 2007
04-08
$ pasqua 2059
03-30
:-)
(ok, ok, si scherza eh...meglio chiudere qui...)

 programmini point & click non vanno mai bene a quanto ho visto ;)
Se e` per questo nemmeno cron si e` dimostrato all'altezza, in questo
frangente (tanto che si e` dovuti ricorrere a controlli lato script)
Enrico

 l'equinozio di primavera
Quest'anno e` anche un caso un po' particolare, insomma, visto che il 
plenilunio e l'equinozio corrispondono (oggi) :)
Bye.

 plenilunio e l'equinozio corrispondono (oggi) :)
No, l'equinozio era ieri.
http://it.wikipedia.org/wiki/Equinozio
C.

On 20 Mar, 23:01, Enrico 'Henryx' Bianchi

Beh che c'entra con *nix puoi inventarti cose incredibili già solo con
la bash, non mi risulta che su win ci siano strumenti anche vagamente
paragonabili..

 frangente (tanto che si e` dovuti ricorrere a controlli lato script)
Perche` "cron" era il tool sbagliato, quello corretto e` "at".
bye,
-- 
piergiorgio

andrea wrote:

quello che un tempo era noto come Windows Scripting Host?
ilSimo
-- 
now playing: 
Tomorrow, I'll see it, another day's rise ... right before my eyes
Been sinking in sorrow, but now I'm gonna rise
No more reasons why
                                Gammaray - Somewhere Out In Space

 Perche` "cron" era il tool sbagliato, quello corretto e` "at".
Penso di essere stato troppo criptico. La mia critica era dovuta ad una
attivita` inutile, sterile e deprecabile come quella di "perculare" uno
strumento (in questo caso sistema operativo) che non si conosce. Ottima
da fare in ambienti in cui ancora fa figo fare battute del genere, ma su
un newsgroup come questo mi sembra alquanto inappropriato
Enrico

 quello che un tempo era noto come Windows Scripting Host?
E` noto, direi, visto che esiste ancora[1] :)
Enrico
[1] o e` stato tolto su Vista?

Enrico 'Henryx' Bianchi ha scritto:

Sì hai ragione, so che ci sono strumenti come WHS (e in teoria la 
powershell?) ma non è proprio la stessa cosa che usare direttamente la 
bash scriptando a manetta.
Il cmd.exe è piuttosto penoso come feature, o forse sono io che non l'ho 
provato abbastanza..

Enrico 'Henryx' Bianchi wrote:

non lo so, io ho sempre preferito zsh.exe e la cartellina c:\unix con le
versioni dei comandi standard rcompilate per win... :)
ilSimo
-- 
now playing: 
The tales that speak of frost and fire
The Frost Monstreme and the Fire Divine
The frost preserves and the fire destroys
Like pouring rain on the sands of time
                                Cirith Ungol - Frost And Fire

 versioni dei comandi standard rcompilate per win... :)
:D
Personalmente non ho mai provato ZSH (penso di averla usata di striscio
su alcuni cd live), dovro` darci un'occhiata prima o poi :)
Enrico

 provato abbastanza..
Beh, 168 comandi base[2] non saranno molti, ma di sicuro non sono
nemmeno pochi...
Enrico
[1] senza offesa
[2] 
http://technet.microsoft.com/it-it/library/bb491071(en-us).aspx

 mattina?
GMT? :)
-- 
Fa freddo nello scriptorium, il pollice mi duole. Lascio questa 
scrittura, non so per chi, non so piů intorno a che cosa...
U. Eco