1 votos

`buscar` comando no está disponible en la web de host, cómo implementar una eliminación basados en la modificación de tiempo de uso de otros comandos?

Estoy creando una simple datebase solución de copia de seguridad para un cliente usando el alojamiento web en DataFlame.

La cuenta de alojamiento web proporciona acceso a cron, pero no una shell.

Tengo una base de datos de copia de seguridad de secuencia de comandos de creación de copias de seguridad regulares y quiero eliminar automáticamente los más de N días de edad.

Traté de usar

find -v $backup_dir -mtime +$keep_days -name "*db.tar.gz" -delete

sin embargo, el usuario que ejecuta el script no tiene permiso para ejecutar find.

Puedes sugerir cómo implementar esta sin usar el find comando?

4voto

JeffG Puntos945

Usted dijo que no tenía acceso al intérprete de comandos. Suponiendo que significaba que no shell interactivo de acceso, este script de Bash de forma recursiva elimina db tar de más de 3 días (calculada a partir de la fecha actual y restando 3 días el valor de los segundos y su comparación con el mod de tiempo del archivo comprimido).

#!/bin/bash

for linkname; do
  if [[ -d "$linkname" ]]; then
    "$0" "$linkname"
  elif [[ "$linkname" =~ '^.*db\.tar\.gz$' ]]; then
    if (( $(stat --format=%y "$linkname") < ( $(date +%s) - 259200) )); then
      rm -f "$linkname" 
    fi
  fi
fi

1voto

cjc Puntos17092

Un hack-ish idea podría ser la de incorporar los días desde época (es decir, date +%s dividido por 86400) mod por su $keep_days en el nombre del archivo.

En ese caso, usted no tiene que quitar los mayores archivos de copia de seguridad. Usted acaba de sobrescribir los antiguos, una vez que los días-desde la época modulo $keep_days número viene de nuevo.

Algo como esto:

#!/bin/bash

keepdays=60
epochdays=$(expr $(date +%s) / 86400)

backupindx=$(expr $epochdays % $keepdays)

backupfile=/path/to/backup/file.${backupindx}.db.tgz

Así, hoy, 27 de Marzo de 2012, que tendría la backupfile archivo.7.db.tgz, que será reemplazado en 60 días.

0voto

Android Eve Puntos545

Está usted seguro de que no tienen acceso a la find? O es sólo que no en el camino? Intente ejecutar como /usr/bin/find, a ver si funciona para usted.

Si eso no funciona, usted está en una situación difícil. Si find no está disponible, y usted no tiene acceso a una shell, te dejan con ninguna idea de lo que está disponible. Si Perl estaba disponible, sería bastante trivial script en perl para realizar la tarea anterior. Utilizando sólo la cáscara . . . Yo probablemente lo intente algo como esto:

ls -t /backup_dir/*.db.tar.gz | sed "1,5d" | xargs rm -f

Donde 5 es el número de días que desea mantener (modificar según sea necesario).

Breve explicación: ls -t hace un listado del directorio, ordenados por la hora (la más reciente primero). El sed "1,5d" dice sed a quitar las 5 primeras líneas de la entrada (que corresponde a nuestro 5 archivos más recientes). Finalmente, xargs combina el listado y le dice rm eliminarlos.

0voto

CalumJEadie Puntos60

He aquí una versión abreviada de la secuencia de comandos que he utilizado en el final, con base en @cjc 's respuesta.

#!/bin/sh

# Script to backup ... database.
#
# A rolling backup is used. The size of period backed up is configurable.
# The period size is expressed in terms of an arbitary time unit "timeunit".
#
# Files are saved with format:
# <date>-...-<index within period>.sql.tar.gz
#
# Author: Calum J. Eadie

### Configuration

backup_dir=/home/..../backups
# The size of a timeunit. Eg. 300 for a timeunit that is 5 minutes long.
seconds_per_timeunit=$(expr 60 \* 60 \* 6) # 6 hours
# The size of backup period in timeunits.
keep_timeunits=$(expr 4 \* 30) # 30 days

### Script

# Form files names

date_string=`date +%Y-%m-%d-%H-%M-%S`
# Time since unix epoch in timeunits
epoch_timeunits=$(expr $(date +%s) / $seconds_per_timeunit)
# Index unique to timeperiod.
backup_index=$(expr $epoch_timeunits % $keep_timeunits)
raw=$backup_dir/$date_string-...-$backup_index.sql
compressed=$raw.tar.gz

# Remove old backup

rm -v $backup_dir/*-...-$backup_index.sql.tar.gz

# Create new backups

mysqldump -u ... -p... --databases ... --add-drop-database --add-drop-table > $raw
tar czf $compressed $raw
rm $raw

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: