Las respuestas anteriores son la forma estándar / "correcta" de hacerlo.
Otro enfoque más simple desde un punto de vista más de "usuario final" es hacer que cualquier tarea programada o en segundo plano escriba su salida en un archivo "log". El archivo puede estar en cualquier parte de su sistema, pero si la tarea se ejecuta como root (desde cron
, etc.), entonces en algún lugar debajo /var/log
es un buen lugar para colocarlo.
Creé el /var/log/maint
directorio y lo hice legible para todos y tengo un archivo legible debajo de eso llamado "copia de seguridad" donde registro la salida de mis scripts de copia de seguridad.
Creé mi propio directorio para que mis archivos no se mezclen con las cosas generadas por el sistema.
Para poner cosas allí (en bash):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
Esto >>
hace que los mensajes se agreguen al archivo en lugar de sobrescribirlo cada vez.
Si mi script tiene mucha salida, uso una secuencia de comandos o función para la salida para que todo se haga igual. A continuación se muestra mi versión actual (overkill): (el material VERBOSE está ahí para cuando estoy ejecutando el script desde una terminal y quiero ver lo que está sucediendo con fines de depuración).
#!/bin/bash
## backup_logger
## backup system logging module
## Copyleft 01/20/2013 JPmicrosystems
## Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>]
## If present, -v says log to console as well as to the log file
## <caller> is the name of the calling script
## If <caller> <log message text> is not present, write a blank line to the log
## Must be placed in path, like ~/bin
## If log is owned by root or another user, then this must run as root ...
## If not, it just aborts
##source "/home/bigbird/bin/bash_trace" ## debug
SCRIPT_NAME="$(basename $0)"
USAGE="Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>]"
SYSLOGDIR='/var/log/maint'
SYSLOGFILE="${SYSLOGDIR}/backup.log"
LOGGING=1
VERBOSE=0
if [ "${1}" == "-v" ]
then
VERBOSE=1
shift
fi
##LOGGING=0 ## debug
##VERBOSE=1 ## debug
## Only zero or two parameters allowed - <caller> <log message text>
RC=0
if [ "$#" -eq 1 ] || [ "$#" -gt 2 ]
then
echo "${USAGE}"
RC=1
else
if [ ! -w "${SYSLOGFILE}" ]
then
touch "${SYSLOGFILE}"
if [ $? -ne 0 ]
then
echo -e "$(date) ${1} ${2}"
echo "${SCRIPT_NAME} Can't write to log file [${SYSLOGFILE}]"
RC=1
exit ${RC}
fi
fi
if [ -n "${1}" ]
then
(( LOGGING )) && echo -e "$(date) ${1} ${2}" >> "${SYSLOGFILE}"
(( VERBOSE )) && echo -e "$(date) ${1} ${2}"
else
(( LOGGING )) && echo "" >> "${SYSLOGFILE}"
(( VERBOSE )) && echo ""
fi
fi
exit $RC
Editar: at
ejemplo simplista que escribe en un archivo de usuario
No he usado esto para siempre, así que lo descubrí con un par de guiones simples.
El primer script simplemente programa el evento usando at
. El comando en sí solo podría escribirse en un terminal, pero soy flojo, especialmente cuando tengo que hacerlo varias veces mientras lo pruebo sin engañar con el historial de comandos.
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
El segundo script es el que está programado para ejecutarse.
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Creé ambos scripts en un editor de texto, los guardé y luego los hice ejecutables usando chmod 700 script-file-name
. Los puse a ambos en mi $HOME/bin
directorio por conveniencia, pero podrían estar en cualquier lugar donde mi usuario tenga acceso completo. Lo uso 700
para cualquier script que sea solo para pruebas, pero en un solo sistema de usuario, podría serlo 755
.
Ya tengo un directorio llamado /home/bigbird/log
para guardar la salida de mytest_at_script
. Esto también puede estar en cualquier lugar donde su usuario tenga acceso completo. Solo asegúrese de que exista antes de que se ejecute el script o haga que el script lo cree.
Para ejecutarlo, solo me aseguré de que el tiempo para el at
comando mytest_at_run
fuera un poco en el futuro y luego lo ejecuté desde una terminal. Luego esperé hasta que corrió y examiné el contenido de $HOME/log/at.log
.
bigbird@sananda:~/bin$ cat ~/log/at.log
Fri Sep 14 00:52:18 EDT 2018 - is when this ran
Fri Sep 14 00:56:00 EDT 2018 - is when this ran
bigbird@sananda:~/bin$
Algunas notas
Aunque estoy ejecutando at
desde mi usuario, no conoce mi entorno, como mi PATH
y mi directorio personal, por lo que no asumo eso. Utilizo caminos completos como lo haría para cualquier cron
trabajo. Y si alguna vez quiero que sea un cron
trabajo, no tendré que cambiar nada solo para que funcione.
He utilizado >>
en mytest_at_script
a adjuntar la salida al archivo de registro en lugar de >
lo que habría reemplazado en cada carrera. Use el que mejor se adapte a su aplicación.
sleep 3m; echo Running