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:

  • Escono caratteri in cron
  • Distriggerszione robusta di uno script specifico cron. {Hourly, daily, weekly}
  • Il process Cron con command $ e (redazione) non verrà eseguito
  • Redmine: recupera i cambiamenti dal lavoro cron
  • Spostare il lavoro cron
  • Come: 1 Cron each minuto ODD e 1 altro each quarto minuti?
  • /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.

    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.