DOMANDA OpenWRT e script cron

array81

Nuovo Utente
40
0
Spero di non aver sbagliato sezione ma non sapevo proprio dove postare il messaggio.

Ho comprato un piccolo router su cui ho installato OpenWRT, ho quindi configurato OpenWRT in modo che si collegarsi alla mia rete WIFI e condivida un hard disk collegato tramite USB per mezzo di SAMBA.
Ho delle IP cam che salvano il video (solo quando rilevano movimenti) via SAMBA sull'hard disk.

Vorrei destinare solo una parte dell'hard disk al salvataggio dei video. La mia idea è di usare cron per eseguire uno script salvato su file che controlli ad intervalli regolari la dimensione di una certa cartella dell'hard disk (la cartella avrà delle sottocartelle con all'interno i files video). Se tale dimensione è sopra un determinato valore A lo script dovrebbe cancellare i file a partire dai più vecchi fino ai più recenti fino a portare tale dimensione a un valore B.

Non ho grosse esperenza con Linux, già configurare il dispositivo per fare quello che fa ora mi è costato non poca fatica, immagino che scrivere uno script del genere possa richiedere 5 minuti a chi lo sa fare quindi vorrei sapere se c'è una anima pia che possa dirmi come fare.

Ringrazio in anticipo
 

802.11

Nuovo Utente
15
4
Ho trovato su stackoverflow questo post. Questa porzione di codice fa quello che vuoi (più o meno). Puoi aggiustare il path della cartella e fissare le dimensioni in byte che ti interessano. Poi all'interno dell'if dai il comando "rm" solo sui file o cartelle che vuoi rimuovere. Non so se può bastare ad aiutarti, in caso ci lavoriamo insieme.
Bash:
#!/bin/bash
SIZE=$(du -B 1 /path/to/directory | cut -f 1 -d "   ")   
# 2GB = 2147483648 bytes
# 10GB = 10737418240 bytes
if [[ $SIZE -gt 2147483648 && $SIZE -lt 10737418240 ]]; then
    echo 'Condition returned True'
fi
 

« MoMy »

Utente Èlite
1,529
771
Qualcosa di semplice.
Bash:
#!/bin/bash
#################################################################
# Inserire il nome completo della directory principale (senza / barra finale) la quale conterrà le subdirectory con i files.video.
NOME_DIR="/percorso/completo/destinazione"
#################################################################

# Limite massimo in byte (base 10). 1 MB = 1 milione di byte, 1 GB = 1 miliardo di byte.
MAX_DIR="1000000000"
# Subdir in ordine dal meno recente.
DATA_NOME_SUBDIR=( $(stat -c'%W %i' $NOME_DIR/*/ | sort) )
# Inode subdirectory.
INODE_SUBDIR=1
while true
do
    # Dimensione in byte della cartella + i files in essa presenti.
    DIMENSIONE_DIR=`du --max-depth=0 -B 1 $NOME_DIR | awk '{print $1}'`
    if [ "$DIMENSIONE_DIR" -gt "$MAX_DIR" ]; then
        echo $(date +%c) - File Eliminato `find  "$NOME_DIR" -inum "${DATA_NOME_SUBDIR[$INODE_SUBDIR]}"` - Spazio Occupato "$DIMENSIONE_DIR" >> "$NOME_DIR/log_delete"
        find  "$NOME_DIR" -inum "${DATA_NOME_SUBDIR[$INODE_SUBDIR]}" -exec rm -r  {} \; 2>"$NOME_DIR/errori"
    else
        echo $(date +%T)  Spazio inferiore al valore massimo di "$MAX_DIR"Byte >> "$NOME_DIR/log_delete"
        break
    fi
    let "INODE_SUBDIR += 2"
done
exit 0
EDIT: Corretto date()
 
Ultima modifica:

array81

Nuovo Utente
40
0
Ringrazio entrambi per le risposte e mi scuso per il ritardo, le notifiche mi erano finite nello spam e mi sono accorto della cosa solo ora.
per @« MoMy » grazie del codice, non conosco bene linux e i comandi della shell ma so programmere quindi riesco a interpretare più o meno il codice. Ho commesso tuttavia un errore nel mio primo messaggio in quanto ho descritto male il comportamento della fotocamera.
La struttura delle cartelle/files è la seguente:
-ROOT
|-CARTELLA MADRE
|-CARTELLA 1 (prima telecamera)
|-CARTELLA 1.1
|-FILE 1.1.1
|-FILE 1.1.2
|-FILE 1.1.x
|-CARTELLA 1.2
|-FILE 1.2.1
|-FILE 1.2.2
|-FILE 1.2.x
|-CARTELLA 1.x
|-CARTELLA 2 (seconda telecamera)
|-CARTELLA 2.1
|-FILE 2.1.1
|-FILE 2.1.2
|-FILE 2.1.x
|-CARTELLA 2.2
|-FILE 2.2.1
|-FILE 2.2.2
|-FILE 2.2.x
|-CARTELLA 2.x

In sostanza all'interno di una cartella della ROOT viene creata una sottocartella per ogni telecamera, all'interno della singola cartella della telecamera vengono create più sottocartelle al cui interno ci sono più file video di piccola dimensione (5/6 mega).
Quindi rispetto al tuo codice c'è un nodo in più (quello chiamato CARTELLA 1.x e simili).
Sarebbe complesso modificare il codice perchè tenga il considerazione questa situazione?

Un'altra cosa. Mi pare di capire che il codice valuti se la dimensione della cartella madre supera un certo valore quindi elimina i files a partire dal più vecchio fino a che la dimensione scende al di sotto di questo valore. Appena scende al di sotto del limite si ferma. La cosa potrebbe anche funzionare a patto di eseguire lo script molto spesso. Per questo motivo pensavo, allo scattare del superamento del limite, di cancellare i files fino a portare il valore ben oltre sotto al valore limite fino a un secondo valore prestabilito. In questo modo infatti avrei più spazio libero e potrei eseguire lo script più di rado. Poi magari l'esecuzione dello script in termini di consumo di risorse è minimi è mi sto facendo dei problemi per niente (non mi rendo conto). Tieni presente che si tratta di un piccolo dispositivo con hardware scarso (https://openwrt.org/toh/nexx/wt3020).
 

« MoMy »

Utente Èlite
1,529
771
Io non sono un programmatore, ma mi diletto nello scrivere quelle quattro cose che mi servono.

I files video dovrebbero avere un' estensione (forse mp4, m4a), quindi, invece di simulare il comando find (per la ricerca di un numero imprecisato/dinamico di subdirectory contenenti i files video) lo si può usare direttamente sulla cartella principale. Col risultato creare un array con inode/nome file/data e lavorare direttamente su quello.
Credo che il numero delle directory (1^ telecamera, 2^ telecamera... N telecamera) resterà tale a differenza delle sub che contengono i files video le quali verranno create a secoda delle esigenze/impostazioni. Quindi per non avere tante directory vuote, si può concludere il tutto con la eliminazione delle subdirectory vuote.

Il limite minimo non l' avevo considerato sulla base di un ragionamento che al momento non ricordo :asd: forse l' impossibilità di visionare files recenti perché rientrano nel pattern. Di solito in situazioni come questa si usa cancellare vecchi files per esempio di 30gg o più, ma con questo sistema non sarà possibile senza metterci un blocco o controllo.

Bye^^
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!