As respostas acima são a maneira padrão / "correta" de fazê-lo.
Outra abordagem que é mais simples de um ponto de vista mais "usuário final" é fazer com que qualquer tarefa agendada ou em segundo plano grave sua saída em um arquivo "log". O arquivo pode estar em qualquer lugar no seu sistema, mas se a tarefa estiver sendo executada como raiz (de cron
, etc.), então, em algum lugar abaixo de /var/log
é um bom lugar para colocá-lo.
Eu criei o diretório /var/log/maint
e o deixei legível por todos e tenho um arquivo legível sob o chamado "backup", no qual faço o registro da saída dos meus scripts de backup.
Eu fiz meu próprio diretório para que meus arquivos não se misturem com as coisas geradas pelo sistema.
Para colocar coisas lá (no bash):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
O >>
faz com que as mensagens sejam anexadas ao arquivo em vez de sobrescrevê-lo a cada vez.
Se meu script tiver muitos resultados, utilizarei um script ou uma função para saída para que tudo seja feito da mesma forma. Abaixo está minha versão atual (overkill): (o material VERBOSE está lá para quando eu estou rodando o script de um terminal e quero ver o que está acontecendo para fins de depuração).
#!/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: simplista at
exemplo que grava em um arquivo de usuário
Não usei isso para sempre, então descobri com alguns scripts simples.
O primeiro script apenas agenda o evento usando at
. O comando em si pode ser digitado em um terminal, mas eu sou preguiçoso - especialmente quando tenho que fazer várias vezes enquanto o testo sem me enganar com o histórico 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
O segundo script é o que está programado para ser executado
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Eu criei ambos os scripts em um editor de texto, salvei-os e, em seguida, criei cada executável usando chmod 700 script-file-name
. Coloco os dois no meu diretório $HOME/bin
por conveniência, mas eles podem estar em qualquer lugar em que o usuário tenha acesso total. Eu uso 700
para qualquer script que seja apenas para testes, mas em um sistema de usuário único, poderia ser também 755
.
Já tenho um diretório chamado /home/bigbird/log
para salvar a saída de mytest_at_script
. Isso também pode estar em qualquer lugar em que o usuário tenha acesso total. Apenas certifique-se de que existe antes de o script ser executado ou de o script criá-lo.
Para executá-lo, certifiquei-me de que o tempo do comando at
em mytest_at_run
fosse um pouco futuro e, em seguida, executei-o em um terminal. Eu esperei até que ele corresse e examinasse o conteúdo 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$
Algumas notas:
Embora eu esteja executando at
do meu usuário, ele não conhece meu ambiente, como meu PATH
e meu diretório pessoal, portanto, não presumo disso. Eu uso caminhos completos como eu faria para qualquer trabalho cron
. E se eu quiser fazer um trabalho com cron
, não precisarei alterar nada apenas para executá-lo.
Eu usei >>
em mytest_at_script
para anexar a saída ao arquivo de log em vez de >
, o que teria sido substituído em todas as execuções. Use o que melhor se adequar à sua aplicação.