lo script bash viene eseguito dalla shell ma non dal cron job
Domanda
L'installazione di Cron è vixie-cron
/etc/cron.daily/rmspam.cron
#!/bin/bash
/usr/bin/rm /home/user/Maildir/.SPAM/cur/*;
Ho questo semplice script bash che voglio aggiungere a un cron job (include anche i comandi di apprendimento dello spam in precedenza) ma questa parte fallisce sempre con " File o directory non trovati " Da quello che immagino è che il metachar non viene interpretato correttamente quando eseguito come cron job. Se eseguo lo script dalla riga di comando, funziona perfettamente.
Vorrei un perché per questo non funziona e ovviamente una soluzione funzionante :)
Grazie
modifica n. 1 sono tornato a questa domanda quando ho ottenuto il badge della domanda popolare per questo. L'ho fatto per primo,
#!/bin/bash
find /home/user/Maildir/.SPAM/cur/ -t file | xargs rm
e solo di recente stava leggendo la pagina man di xargs e l'ho cambiata in questo
#!/bin/bash
find /home/user/Maildir/.SPAM/cur/ -t file | xargs --no-run-if-empty rm
l'opzione xargs corta è -r
Soluzione
Se non ci sono file nella directory, il carattere jolly non verrà espanso e verrà passato direttamente al comando. Non esiste un file chiamato " * " ;, quindi il comando non riesce con " File o directory non trovati. & Quot; Prova invece questo:
if [ -f /home/user/Maildir/.SPAM/cur/* ]; then
rm /home/user/Maildir/.SPAM/cur/*
fi
O usa semplicemente " -f " bandiera a rm. L'altro problema con questo comando è quello che succede quando c'è troppo spam per la lunghezza massima della riga di comando. Qualcosa del genere è probabilmente complessivamente migliore:
find /home/user/Maildir/.SPAM/cur -type f -exec rm '{}' +
Se hai una vecchia scoperta che esegue rm solo un file alla volta:
find /home/user/Maildir/.SPAM/cur -type f | xargs rm
Gestisce troppi file e nessun file. Grazie a Charles Duffy per aver sottolineato l'opzione + per -exec in find.
Altri suggerimenti
Stai specificando il percorso completo dello script nel cronjob?
00 3 * * * /home/me/myscript.sh
anziché
00 3 * * * myscript.sh
In un'altra nota, è / bin / rm su tutte le scatole Linux a cui ho accesso. Hai ricontrollato che è davvero / usr / bin / rm sul tuo computer?
prova ad aggiungere
MAILTO=your@email.address
nella parte superiore del tuo file cron e dovresti ricevere qualsiasi input / errore inviato per posta.
Considera anche di aggiungere il comando come cronjob
0 30 * * * /usr/bin/rm /home/user/Maildir/.SPAM/cur/*
Prova a usare un'opzione force e dimentica di aggiungere un percorso al comando rm. Penso che non dovrebbe essere necessario ...
rm -f
Questo assicurerà che anche se non ci sono file nella directory, il comando rm non fallirà. Se questa è una parte di uno script di shell, il * dovrebbe funzionare. Mi sembra che potresti avere una directory vuota ...
Capisco che il resto dello script è in esecuzione, giusto?
rm
si trova davvero in / usr / bin /
sul tuo sistema? Ho sempre pensato che rm
dovrebbe risiedere in / bin /
.