PDA

View Full Version : Problema crontab


vampirodolce1
13-09-2006, 15:43
Buongiorno ho un problema con crontab (debian sarge), in quanto i comandi, per quanto semplici, non vengono eseguiti.
Nemmeno un comando come 30 17 * * * echo "ciao"
ha effetto, pur provvedendo a restartare il demone (kill -1)

All'ora indicata noto una piccola attivita' del disco rigido e nulla di piu'. Stavo facendo delle prove, il comando originario era del tipo ls -l /home/user >> /home/ls.txt, ma il file ls.txt non viene creato. Per caso qualcuno sa dirmi cosa sbaglio?

carve81
13-09-2006, 16:04
Crobtab:

Ti logghi come l'utente con cui dovra essere eseguito il comando del crontab.
Lanci il comando:
crontab -e

30 17 * * * /bin/sh script_da_eseguire

(esegue lo script ogni giorno alle 17.30)

Te anziche eseguire uno script esegui un comando: hai provato a usare gli apici?

30 17 * * * /bin/sh 'ls -l /home/user >> /home/ls.txt'

Inoltre esegui il comando come user?o come root al massimo?

kingv
13-09-2006, 16:09
Nemmeno un comando come 30 17 * * * echo "ciao"
ha effetto, pur provvedendo a restartare il demone (kill -1)



se stai editando /etc/crontab e non il crontab di un utente devi specificare anche l'utente con cui vuoi che i comandi vengano eseguiti:

30 17 * * * root echo "ciao">/tmp/tuofile

vampirodolce1
13-09-2006, 16:10
Te anziche eseguire uno script esegui un comando: hai provato a usare gli apici?
Non ho provato con gli apici... ed ero loggato sia come utente che come root.
se stai editando /etc/crontab e non il crontab di un utente devi specificare anche l'utente con cui vuoi che i comandi vengano eseguiti:OK, allora se non c'e' altro stasera faccio una prova e poi vi faccio sapere! Grazie ad entrambi!

carve81
13-09-2006, 16:16
Io ho sempre lanciato script però penso che puoi lanciare anche comandi.
Le cose che devi vedere sono :

1 - Editi /etc/crontab o usi crontab -e?
Se editi /etc/crontab devi specificare anche l'utente con cui verrà eseguito il comando. Se editi da crontab -e per vedere che effettivamente il tuo comando sia inserito nel crontab digita "crontab -l".

2 - Gli apici che ho messo sono due. Non sono sicuro che ci vogliano gli apici.
Devi provare.

kingv
13-09-2006, 17:30
Io ho sempre lanciato script però penso che puoi lanciare anche comandi.



puoi lanciare tutto quello che una shell puo' eseguire, quindi script e programmi.
le virgolette ti servono solo per preservare degli spazi all'inizio o alla fine della stringa da interpretare (e quindi molto raramente).

vampirodolce1
14-09-2006, 07:36
Allora, ho fatto altre prove ieri sera ma senza successo. Il servizio e' attivo e l'avevo impostato con il crontab -e. Ecco infatti il listato della mia operazione pianificata:
debian:~/Desktop> crontab -l
SHELL=/bin/bash
53 20 * * * /home/user/Desktop/giac
debian:~/Desktop>Lo script faceva una cosa molto semplice, ma ripeto che non funziona nemmeno un semplice echo:debian:/home/user/Desktop# cat giac
#!/bin/bash
cd /home/user/giacomini
nohup kpdf 02.\ iniziare_2.pdf &
cd ../Desktop
nohup kwrite leggere.txt &
Riporto un estratto dal syslog, in cui si vede che qualcosa accade, ma se ad esempio il comando da eseguire era ls / >> /ls.txt alla fine il file ls.txt non viene creato:
Sep 13 20:49:39 localhost crontab[6556]: (root) BEGIN EDIT (user)
Sep 13 20:49:52 localhost crontab[6556]: (root) END EDIT (user)
Sep 13 20:50:02 localhost crontab[6568]: (user) BEGIN EDIT (user)
Sep 13 20:51:19 localhost crontab[6568]: (user) REPLACE (user)
Sep 13 20:51:19 localhost crontab[6568]: (user) END EDIT (user)
Sep 13 20:51:27 localhost su[6616]: + pts/1 user:root
Sep 13 20:51:27 localhost su[6616]: (pam_unix) session opened for user root by (uid=1000)
Sep 13 20:51:44 localhost crontab[6619]: (root) LIST (user)
Sep 13 20:52:01 localhost /usr/sbin/cron[3972]: (user) RELOAD (crontabs/user)
Sep 13 20:53:01 localhost CRON[6620]: (pam_unix) session opened for user user by (uid=0)
Sep 13 20:53:01 localhost /USR/SBIN/CRON[6621]: (user) CMD (/home/user/Desktop/giac)
Sep 13 20:53:02 localhost CRON[6620]: (pam_unix) session closed for user user
Sep 13 20:54:31 localhost crontab[6633]: (root) LIST (user)
In particolare, il comando doveva avviarsi alle ore 20.53 e dai log si vede che alle ore 20:53:01 qualcosa accade "session opened", lo script viene lanciato e la sessione alle 20:53:02 viene chiusa, ma ripeto senza successo.
Come altro indizio, posso dirvi che non mi funziona nemmeno il comando "at".

kingv
14-09-2006, 08:54
at è un altro demone, non dipende da cron.
/home/user/Desktop/giac ha i permessi di esecuzione, vero?

se metti una riga tipo:
* * * * * touch /tmp/miofile

dopo un minuto la esegue?

vampirodolce1
14-09-2006, 09:57
at è un altro demone, non dipende da cron.
/home/user/Desktop/giac ha i permessi di esecuzione, vero?

se metti una riga tipo:
* * * * * touch /tmp/miofile

dopo un minuto la esegue?atd e' in esecuzione, non ho provato con touch, ma come dicevo non funziona nemmeno la redirezione di ls, pur risultando tutto dai log. Si', lo script ha i permessi di esecuzione, in quanto se lo eseguo da shell fa egregiamente il suo lavoro.

kingv
14-09-2006, 10:03
non mi viene più in mente niente.

non è che l'utente è presente in /etc/cron.deny ? (ma il messaggio in syslog sarebbe diverso)

vampirodolce1
14-09-2006, 11:12
non mi viene più in mente niente.

non è che l'utente è presente in /etc/cron.deny ? (ma il messaggio in syslog sarebbe diverso)/etc/at.allow, /etc/at.deny, cron.deny e cron.allow non esistono. Stasera provo a creare gli allow e metterci il mio nome utente.

vampirodolce1
15-09-2006, 07:41
Ho riprovato con un semplice touch, ls >>, ecc. ecc. e funziona tutto, ora mi funziona sia at che cron, anche se sinceramente non ho cambiato nessuna impostazione. E' lo script indicato da me che non gli piace, ho provato a redirezionare l'output ma nulla. Pare che cron e at non digeriscano script contenenti grafica... Vabbe', l'importante e' che sono riuscito a provare qualche semplice operazione.

kingv
15-09-2006, 09:13
ok ora è già più realistico :D

il problema non è che cron non vuole script che eseguono programmi grafici, ma verosimilmente o l'utente con cui lanci i programmi non è lo stesso che ha aperto la sessione X (e mancano le autorizzazioni per permettergli di usare quel server), oppure devi indicargli esplicitamente il display su cui connettersi (export DISPLAY=:0.0 nello script che lanci da crontab)

vampirodolce1
15-09-2006, 09:57
kingv sei un mito! Ho portato il portatile in ufficio, sto provando in real time e funziona tutto!!! A buon rendere...

kingv
15-09-2006, 13:42
ottimo ;)

Sinoath
15-09-2006, 23:12
ok ora è già più realistico :D

il problema non è che cron non vuole script che eseguono programmi grafici, ma verosimilmente o l'utente con cui lanci i programmi non è lo stesso che ha aperto la sessione X (e mancano le autorizzazioni per permettergli di usare quel server), oppure devi indicargli esplicitamente il display su cui connettersi (export DISPLAY=:0.0 nello script che lanci da crontab)
ho seguito con interesse la discussione, vorrei un chiarimento se possibile.
il comando evidenziato redirige l'aoutput a video?

Ora magari dico una corbelleria, ma non è che il file (vedendo i log) non te lo crea perchè tenti di scrivere da utente sulla cartela root? dovresti redirigere in:
$HOME/nomefile oppure
/home/nomeutente/nomefile

A me così funziona alla grande, mentre non sono ancora riuscito a redirigere l'output a monitor in real-time
ciau :D

kingv
16-09-2006, 08:22
allora sinceramente non ho capito perchè il job di vampirodolce non venisse eseguito, sospetto per qualche errore di sintassi. Non penso che sia un problema di permessi perchè per fare le prove abbiamo sempre indicato di usare /tmp che è scrivibile da chiunque su qualsiasi distribuzione.

per quanto riguarda quel DISPLAY invece è una variabile di ambiente che informa le librerie grafiche usate dal programma del server X da utilizzare. generalmente la foma è
DISPLAY=hostname:X.Y
dove hostname è il nome o l'ip del server (che noi abbiamo tralasciato perchè di default è localhost, X è il display (0 è il primo , e su una macchina normale l'unico) e Y lo screen (non ho mai trovato casi in cui servisse un valore diverso da zero).

Sinoath
16-09-2006, 14:42
provo subito a 'crontabizzare' uno script che stampa una stringa di caratteri e vi faccio sapere come va ;)
ciau :D

niente da fare! ho provato nei due modi seguenti senza esito positivo, io vorrei che il crontab stampasse a video in tempo reale lo script che esegue

/home/sinoath/viviana.sh export DISPLAY=:0.0;
oppure
/home/sinoath/viviana.sh export DISPLAY=:0.0;
in nessuno dei due casi mi stampa a monitor, lo script è una semplice cancellazione+ stringa+sleep per leggere.
Sono sicuro che vengono eseguiti correttamente perchè lo vedo dai file di log e dalle mail che mi arrivano dal sistema

Come posso scavalcare l'ostacolo?

kingv
16-09-2006, 21:11
prova
export DISPLAY=:0.0; /home/sinoath/viviana.sh

Sinoath
18-09-2006, 00:13
prova
export DISPLAY=:0.0; /home/sinoath/viviana.sh
Grazie del 'supporto', adesso non posso provare, realisticamente roverò domani sera, poi edito
ciau :D

vampirodolce1
18-09-2006, 07:25
Io ho risolto mettendo il comando Export direttamente nello script (subito dopo la riga di dichiarazione della shell), non nel crontab!

Sinoath
18-09-2006, 12:10
Io ho risolto mettendo il comando Export direttamente nello script (subito dopo la riga di dichiarazione della shell), non nel crontab!
Provo a fare come dici, anche perchè gli altri metodi non mi fungono,
stasera faccio sapere.
ciau :D

EDIT: mi arrendo, nemmeno così mi funge, oggi ho saputo che si deve configurare il crontab e dargli come default la visualizzazione a monitor, poi se volete vi ragguaglio su quest'altra strada
ciau :D