trovare -delete funziona bene, ma non con il cron

NOTA BENE : ho letto tutte le domande simili. cron, routes, variables env e così via, ma non hanno trovato nessuno che offre soluzioni al mio particolare problema.


Ho uno script che fa alcune discariche MySQL e poi cancella vecchi come questo:

/usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -delete 

(il command precedente è stato modificato dal mio command originale da suggerimenti da commenti )

Tuttavia, i file non vengono mai eliminati quando il cron gestisce questo script. L'utente cron è radice.

Note di debug

  • Se eseguo manualmente lo script in cui viene visualizzato il command, li elimina come previsto.

  • Se eseguo il command di ricerca di cui sopra dalla linea di command come root, li elimina come previsto (e con -print restituisce un elenco di file più vecchi di 5 giorni come previsto)

  • Ho aggiunto anche un'istruzione esplicita di path alla crontab di root, ma
    che non cambia niente.

  • Cron non invia errori e se inserisco l'operazione di ricerca in un file di registro,
    che si presenta vuoto o non è affatto creato.

  • Sto utilizzando server Ubuntu 14.04.03 LTS.

  • problema di attività cron
  • modifica crontab per apache
  • il sistema crontab di ubuntu funziona, ma la crontab di root non lo fa
  • Riavviare se il servizio tomcat7 non risponde
  • 406 Errore con il lavoro GET Cron?
  • L'esecuzione di crontab non ha le stesse variables d'ambiente come l'esecuzione dell'utente
  • I processi di Wheezy muoiono periodicamente
  • Cron lavoro per cifrare il rinnovo
  • 3 Solutions collect form web for “trovare -delete funziona bene, ma non con il cron”

    Il problema è che crontab non dispone di $PATH impostato quando viene eseguito. In realtà è ansible fornire un path aggiungendolo alla parte superiore del file aperto tramite crontab -e :

     PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin 

    (o qualsiasi altra cosa che preferisci utilizzare). Ciò significa che è ansible evitare di specificare i routes completi ai comandi, direttamente da cron.

    Ci sono più problemi con il command originale. Stai sostanzialmente a chiedere al guscio di fare l'espansione di caratteri jolly, piuttosto che find . In secondo luogo, non stai fornendo un path completo per rm ; usare /bin/rm o /usr/bin/rm , ovunque si trovi sul tuo sistema (vedi which rm ).

    Il primo argomento per la ricerca è la "posizione da cercare" e quindi si specifica la "query di ricerca" con i vari -<option> s. Quindi, il formato appropriato del command da eseguire è:

     find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec rm -f {} \; 

    o

     find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete 

    Se non si specifica la definizione PATH come sopra, utilizzare:

     /usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 -exec /bin/rm -f {} \; 

    o

     /usr/bin/find "/home/bkp/dbdump" -name "*.gz" -mtime +5 delete 

    Prova questo invece

     find /home/bkp/dbdump -type f -name '*.gz' -mtime +5 -delete 

    Se invoco il command di ricerca direttamente dal crontab di root e non come parte dello script, allora funziona.

    Lo script in questione utilizza csh. Credo che l'ambiente cron di root su Ubuntu userà / bin / bash (o / bin / dash?). Forse questo è in qualche modo in conflitto con come funzionava il command find.

    In entrambi i casi, il problema principale che ha risolto, anche se in qualche modo inelegante.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.