Necesito escribir un script para trabajar en CentOS que verifique periódicamente (quizás cada 3 horas) si una carpeta contiene archivos con ciertas cadenas en el nombre de archivo (como cliente1 y cliente2) y si no, debería enviar un correo a una determinada dirección.
Ya descubrí cómo encontrar archivos con una determinada cadena en el nombre del archivo:
#!/bin/bash
source="/FILES/user/directory1"
string="customer1"
for file in "$source"/*; do
if [[ $file =~ $string ]]; then
echo "do something"
fi
done
¿Cómo verifico periódicamente y cómo busco más de una cadena?
Gracias
2 respuestas
En primer lugar, su servidor debe poder enviar correos electrónicos utilizando cualquier MTA (Mail Transfer Agent), me refiero a tener conexión a un servidor SMTP y tener archivos MTA configurados ...
Supondré que su servidor ha configurado postfix y está funcionando, prefiero usar el comando find
para su script:
#!/bin/bash
Source="/FILES/user/directory1"
string="customer1"
mail="yourmail@maildomain.com"
Count=$(find $Source -type f -name "$string" | wc -l)
if [ "$Count" -gt 0 ]
then
echo "Number of files matching $string is $Count"
else
echo "Sending mail to $mail, files don't match with customer string"
echo "Filenames don't match with $string" | sendmail -t $mail
fi
Si desea esta comprobación cada 3 horas, prefiero recomendar configurar un cronjob como este en un archivo nuevo /etc/cron.d/checkFiles
# m h dom mon dow user command
0 */3 * * * root YourScriptLocation.sh >> /var/log/checkFiles.log 2>&1
He configurado crontab con el usuario root, aunque puedes configurar el trabajo con cualquier usuario que tenga permisos para ejecutar un script, comprobar archivos en el directorio $Source
y enviar correo.
Solo estoy agregando el requisito faltante a la respuesta de Alvaro Nino. Consulte mi comentario en el código para comprender cómo está funcionando este script.
#!/bin/bash
Source="/FILES/user/directory1"
file="customer*" #Not only single file all customer files need to search
string="yoursearchstring"
mail="yourmail@maildomain.com"
Count=$(find $Source -type f -name "$file" |xargs grep [y]oursearchstring | wc -l)
#Above command find files with name "customer*" in current directory as well as in all
#sub directories inside the parent directory and provide each file as parameter to
#grep command. grep command will search for the string in each file and wc-l will finally
#count the number of occurrence of the string in it
if [ "$Count" -gt 0 ]
then
echo "Sending mail to $mail, number of files matching $Count"
echo "Number of files matching $string is $Count" | sendmail -t $mail
else
echo "Files doesn't match with string"
fi
Nuevas preguntas
shell
El término 'shell' se refiere a una clase general de intérpretes de comandos interactivos basados en texto asociados con mayor frecuencia con los sistemas operativos Unix y Linux. Para preguntas sobre scripts de shell, utilice una etiqueta más específica como 'bash', 'powershell' o 'ksh'. Sin una etiqueta específica, se debe suponer una solución portátil (compatible con POSIX), aunque es preferible usar 'posix' además o 'sh' en su lugar.