Supprimer les fichiers vidéo et image de plus de deux jours

Dans le premier article de cette série, , nous avons lu le flux d’une caméra IP dans un Raspberry Pi. Dans cet article, nous allons voir comment supprimer automatiquement les fichiers, vidéos ou images, sauvegardés au fil du temps.

Il y a urgence !

J’ai installé motion sur mon Raspberry Pi le 22 juin. On est le 1er juillet et le répertoire de stockage des images et vidéos représente déjà plus de 1 Go et 40 000 fichiers.

Il faut donc que j’automatise la suppression d’images de plus de deux jours (cet article) et aussi que je règle mieux motion pour qu’il ne stocke que les images et vidéos de véritables mouvements détectés (le prochain article de cette série, .

Supprimer des fichiers manuellement

Dans les FAQ de motion, ici, on voit comment déclencher la suppression de fichiers en fonction de leur localisation, leur extension et leur date. Ainsi, la commande suivante trouve et supprime tous les fichiers en jpg vieux de plus de 1 jour :

find /home/jf/motion -maxdepth 1 -name '*.avi' -type f -mtime +2 -exec rm {} \;

Mais on ne veut pas aller taper cette commande tous les jours dans notre Pi. Il faut donc planifier la commande.

Crontab pour planifier des actions

Comme indiqué dans Wikipedia, « cron est un programme qui permet aux utilisateurs des systèmes Unix d’exécuter automatiquement des scripts, des commandes ou des logiciels à une date et une heure spécifiées à l’avance, ou selon un cycle défini à l’avance. […] crontab est le nom du programme qui permet d’éditer des tables de configuration du programme cron. Ces tables spécifient les tâches à exécuter et leur horaire d’exécution avec éventuellement une périodicité. »

Ce qui suit provient aussi des FAQ de motion, ici :

  • créer un script bash (/home/jf/exec/camera-delete-cron.sh) comme celui-ci (note du 25/01/2018, j’ai corrigé et ça fonctionne correctement maintenant) :
#!/bin/bash

# /home/jf/motion/camera–delete–cron.sh

# connaître les variables d'environnement du cron, pour deboguer
# printenv ;
# me dit que HOME et PWD = /home/jf

# efface les fichiers avi et jpg de plus de 14 jours 
find /home/jf/motion/foscam/ -name '*.avi' -type f -mtime +14 -exec rm {} \;
find /home/jf/motion/foscam/ -name '*.jpg' -type f -mtime +14 -exec rm {} \;

la ligne de commande dans crontab

Le schéma ci-dessous traduit les instructions du site officiel du Pi.

# * * * * * commande à exécuter
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── jour de la semaine (0 - 7) (dimanche est 0 ou 7, lundi est 1)
# │ │ │ └────────── mois (1 - 12)
# │ │ └─────────────── jour du mois (1 - 31)
# │ └──────────────────── heure (0 - 23)
# └───────────────────────── minute (0 - 59)
# └───────────────────────── /xx = toutes les xx minutes

J’ai créé le script bash ci-dessus et l’ai appelé camera-delete-cron.sh . Je lui ai donné les droits 764. Evidemment, ses fins de ligne doivent être au format unix.

Je vérifie qu’il fonctionne avec les commandes suivantes :

cd /home/jf/exec
./camera-delete-cron.sh

Je veux l’exécuter tous les jours à 1h00. J’ai utilisé le générateur de commande cron de ce site pour définir ma commande cron. En principe j’écrirai donc :

#env
SHELL=/bin/bash
HOME=/home/jf
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

* 1 * * * bash /home/jf/exec/camera-delete-cron.sh 

Avant j’ai indiqué l’environnement d’exécution des commandes. Voir ci-dessous si vous devez adapter. Attention, il doit y avoir une ligne vide à la fin du crontab

On édite crontab en tapant crontab -e  dans la console. On y ajoute la ligne suivante (SHIFT + INSER pour coller). Attention, il doit obligatoirement y avoir une ligne vide à la fin du contenu de crontab.

Noter le « bash » devant le fichier à exécuter.

Le cron ne s’exécutera automatiquement qu’après un redémarrage du Pi. Donc

Déboguer le cron si nécessaire

Ce n’est pas simple de déboguer si un cron ne s’éxécute pas correctement. Le plus probable est que l’environnement d’éxécution du cron n’est pas le même que celui de la ligne de commande.

Un cron job se déclenche dans un environnement différent de celui d’un lancement manuel !

Dans le script on peut ajouter printenv, qui affiche toutes les variables d’environnement. Un fichier log recueillerales données issues du cron job si la ligne est (ici exécution toutes les 10 minutes d’un script camera-test.sh et envoi des résultats dans un répertoire cron.log) :

*/10 * * * * bash /home/jf/exec/camera-test.sh OK > /home/jf/snd/cron.log 2>&1

 Et le premier job envoie toutes les informations recueillies dans/home/jf/snd/cron.log, ce qui permet de voir ce qui se passe.

Le fichier /var/log/syslog contient également beaucoup d’informations sur ce qui se passe dans le pi.

Dans mon cas le cron fonctionne et efface tous les fichiers de plus de deux jours (c’est à dire 3 jours et plus).

3
Poster un Commentaire

avatar
  S’abonner  
plus récent plus ancien Le plus populaire
Notifier de
slahaye
Invité
slahaye

Bonjour,

Dans votre cas le cron va s’executer toutes les minutes entre 1h00 et 1h59.
La bonne écriture semble être :

00 1 * * * bash /home/jf/exec/camera-delete-cron.sh

Nous pouvons consulter l’exec du/des crons dans les logs :
grep CRON /var/log/syslog

Elodie
Invité
Elodie

Je vous remercie pour cette article, il ma beaucoup aidé.
J’ai juste une question, comment remettre a 0 le numéro de l’image dès que sa supprime?
J’ai fait que toutes les minutes les image se suppriment et j’ai fait que mon Raspberry prennent une image par seconde. Donc toutes les minutes 60 images sont supprimé,sauf que je voudrais que le numéro revient a 0 dès que c’est supprimé et que ça ne continu pas à leur donner des numéro supérieure 60.