Bueno, soy un novato en Linux y tengo un problema con un script bash simple.
Tengo un programa que se agrega a un archivo de registro mientras se ejecuta. Con el tiempo, ese archivo de registro se vuelve enorme. Me gustaría crear una secuencia de comandos de inicio que cambiará el nombre y moverá el archivo de registro antes de cada ejecución, creando efectivamente archivos de registro separados para cada ejecución del programa. Esto es lo que tengo hasta ahora:
DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program
Cuando corro, veo esto:
: command not found
program
Cuando accedo al directorio de registros y ejecuto dir, veo esto:
201111211437\r.log\r
¿Que esta pasando? Supongo que me falta algún problema de sintaxis, pero parece que no puedo resolverlo.
ACTUALIZACIÓN: Gracias al comentario de shellter a continuación, descubrí que el problema se debe al hecho de que estoy editando el archivo .sh en Notepad ++ en Windows y luego enviándolo a través de ftp al servidor, donde ejecuto el archivo a través de ssh . Después de ejecutar dos2unix en el archivo, funciona.
Nueva pregunta: ¿Cómo puedo guardar el archivo correctamente en primer lugar, para evitar tener que realizar esta corrección cada vez que reenvío el archivo?
\r
es carriage_return, examine su script bash, tal vez esté incluido dentro del scriptlogs/$DATE.log
está mal, pero al escribir seecho logs/$DATE.log
obtiene la ruta correcta.DATE=$(date +"%Y%m%d%H%M")
?Respuestas:
Las pocas líneas que publicaste de tu guión me parecen bien. Probablemente sea algo un poco más profundo.
Necesita encontrar qué línea le está dando este error. Agregue
set -xv
al principio de su secuencia de comandos. Esto imprimirá el número de línea y el comando que se está ejecutando en STDERR . Esto le ayudará a identificar en qué parte de su secuencia de comandos está recibiendo este error en particular.Por cierto, ¿tiene un tinglado en la parte superior de la secuencia de comandos? Cuando veo algo como esto, normalmente espero que sea un problema con el Shebang. Por ejemplo, si tenía
#! /bin/bash
en la parte superior, pero su intérprete de bash está ubicado en/usr/bin/bash
, verá este error.EDITAR
Dos caminos:
fuente
\r
en el nombre del archivo. Hay un invisible\r
al final de cada línea en su programa.mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
fuente
date +"%Y%m%d%H%M"
si tu fiesta es un poco diferenteUn método de una sola línea dentro de bash funciona así.
[alguna salida]> $ (fecha "+% Y.% m.% d-% H.% M.% S"). ver
creará un archivo con un nombre de marca de tiempo con la extensión ver. Un archivo de trabajo que enumera una instantánea con un nombre de archivo de sello de fecha como se muestra a continuación puede mostrarlo en funcionamiento.
find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver
Por supuesto
cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver
o incluso más simple
ls > $(date "+%Y.%m.%d-%H.%M.%S").ver
fuente
Utilizo este comando para rotar un archivo:
En la carpeta local tengo
2019-09-25-output.log
fuente
Bueno, no es una respuesta directa a su pregunta, pero hay una herramienta en GNU / Linux cuyo trabajo es rotar los archivos de registro de forma regular, manteniendo los antiguos comprimidos hasta un cierto límite. Sus
logrotate
fuente
Puede escribir sus scripts en el bloc de notas, pero asegúrese de convertirlos usando esto -> $ sed -i 's / \ r $ //' yourscripthere
Lo uso todo el tiempo cuando trabajo en cygwin y funciona. Espero que esto ayude
fuente