Newsgroup: it.comp.lang.perl
Titolo: Perl da cron

Salve,
   So che se eseguissi uno script perl dal web (richiamandolo da 
browser) che impieghi troppo tempo, questo mi andrebbe in timeout, o 
roba del genere. Ad esempio uno script che trasferisce da server a 
server un file di 50 Mb ... script di questo tipo li posso fare eseguire 
dal sistema tramite cron? (non ho una shell)
grazie

 (non ho una shell)
... Ma hai un'accesso FTP e il permesso di eseguire script CGI, da 
quello che posso arguire.
Pertanto il tuo problema diventa: come accedere alla shell via CGI?
In realtà questo non è strettamente necessario (o meglio, diciamo che ce 
l'hai già), perché potresti invocare comandi di sistema (o altri script) 
direttamente dai tuoi script CGI.
Se però vuoi qualcosa di più interattivo e già pronto, puoi provare uno 
di questi emulatori di shell via CGI:
http://www.club.cc.cmu.edu/~brian/info/cgi-shell.html
A questo punto, se non sei tra gli utenti cron, potresti scriverti e 
quindi lanciare uno script di schedulazione, ovvero una cosa che nella 
sua forma più scarna sarebbe pressappoco così:
	use strict;
	# Autoflush (per le stampe durante l'esecuzione
	# in un eventuale file di log).
	$| = 1;
	while (1) {
		# Qui metti le tue operazioni periodiche.
		sleep( 3_600 ) # Scatta ogni ora, ad esempio.
	}
Oppure (molto meglio), usi uno di questi:
http://search.cpan.org/dist/Chronic/
http://search.cpan.org/~roland/Schedule-Cron-0.9/
http://search.cpan.org/~ifrol/Schedule-Cronchik-0.4/
(probabilmente su CPAN trovi anche dell'altro...)
Ciao,
Emanuele.

 	}
questo "sleep" che dura un ora potrebbe appesantirmi il server ?

 quindi lanciare uno script di schedulazione
lanciare come?
perl -w 
schedule.pl
 ?
grazie

 wrote:

pensi che in questo modo potrei lanciare uno script che si mette in 
ascolto su una porta?

 wrote:

cmq non funziona, sarebbe stato troppo bello ma č inutile girarci 
attorno...da cgi via browser non si puņ eseguire un:
while(1) {}
anche se setto il timeout del programmino di cui il link hai postato, la 
barra del caricamento aspetta finche non impalla .. peccato

 barra del caricamento aspetta finche non impalla .. peccato
e invece no!!!!!!!!!
funziona!!!!!!!!!!!!!!!!!!!!
ho lanciato questo codice:
#!/usr/bin/perl
# Autoflush (per le stampe durante l'esecuzione
# in un eventuale file di log).
$| = 1;
$k = 0;
while (1) {
   $k ++;
   &scrivi();
   # Qui metti le tue operazioni periodiche. 
   sleep( 5 );
}
sub scrivi {
   $data = time;
   open(CIAO,">>time.txt");
   print CIAO "$k --> $data\n";
   close(CIAO);
}
e dopo un pò la barra di caricamento del browser è finita, ho chiuso il  
bro e riaperto e controllato il file time.txt che continua ad 
aggiornarsi ogni 5 secondi!!!!!!!!
provate: 
http://www.theartofweb.net/perl/time.txt
ora mi domando come fermare il tutto dato che per sbaglio avevo lanciato 
un paio di while(1) {}
grazie ancora!!!!!!!!!!!!!!!!!!!!

 un paio di while(1) {}
Installa uno degli emulatori di shell che ti ho segnalato e poi killi i 
processi.
Altrimenti prima o poi saturerai la tua quota disco e il processo si 
interromperà da solo (almeno quelli che scrivono su disco).
Ciao,
Emanuele.

 processi.
puoi spiegarmi come?  sto a digiuno di linux :-(
grazie

 grazie
Ho il dubbio di aver capito il problema e la lettura del thread non mi ha
aiutato. Vuoi lanciare un generico servizio da CGI che rimanga attivo
ed esegua vari compiti indipendentemente dal processo server http che
lo ha richiamato?? Sotto Unix e unix-like una soluziona sarebbe cron,
ma se vuoi una soluzione dipendente solo dal perl (sempre in ambiente
unix e POSIX) su perldoc perlipc c' e' una splendida:
use POSIX 'setsid';
sub daemonize {
  chdir '/'               or die "Can't chdir to /: $!";
  open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
  open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!";
  defined(my $pid = fork) or die "Can't fork: $!";
  exit if $pid;
  setsid                  or die "Can't start a new session: $!";
  open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
}
Purtroppo usa pathnames Unix-like e dipende dalla disponibilita'
di setsid(), ma lo share e' sufficientemente amplio.
dopo che la tua cgi ha prodotto TUTTO l' output HTML verso il browser
anziche terminare puo' lanciare questa funzione che dovrebbe lanciare un
altro processo svincolato da quello httpd (che avra' un regolare segnale
di termine, vedi la linea con fork e successiva).
il processo figlio continuera' ad esistere, svincolato da STDIN, STDOUT,
signals al gruppo di processi ecc e potra fare do '
codice.pl
', sleep(),
open "file.txt", socket ...
Poi dovrai inventare un protocollo di gestione di questo demone.
puoi fargli salvare fu file il suo numero di processo MA SOLO DOPO
la chiamata a daemonize!! (perche cio' che viene "demonizzato" e' un' altro
processo rispetto alla CGI originale)
e con altra CGI gli puoi mandare dei segnals con vari scopi oltre la
terminazione. Puoi anche aprire un soket in dominio Unix se chi ti da
hosting ti impedisce di inpegnare una porta TCP alta in bind + listen.
I Socket in dominio Unix usano i pathname es
/tmp/cominicareconmiodemone.sock ( attenzione che le specifiche originali
di BDS limitavano i pathnames a 14 char complessivi)
Tramite questa socket gli puoi inviare i comandi che ti pare tramite un
portalino che ti devi fare e schedulere i lavori che vuoi.
MAKE YOURSELF YOUR CRON!!!
Ciao
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ...
per il resto la tua risposta č stata molto utile, grazie

 per il resto la tua risposta č stata molto utile, grazie
Prego.
Ciao
Roberto



Per listare tutti i tuoi processi e vederne il pid fai:
	ps -fu
(il pid è quello nella seconda colonna).
Poi per killare i processi:
	kill -KILL pid
sostituendo "pid" con il pid effettivo del processo, che hai letto prima 
tramite il comando ps.
Ciao,
Emanuele.

,
 Emanuele Zeppieri <ema...@REtiscaliMOVE.it> wrote:

grazie mille, che differenza c'è tra ps aux e ps -fu? posso killare i 
processi di altri utenti? non che ne abbia intenzione...
grazie mille, ho risolto tutto!!!

 grazie mille, ho risolto tutto!!!
Meno male, questo è l'importante (cominciavo a sentirmi responsabile ;-)
Ciao,
Emanuele.