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

È stato utile?

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 / .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top