Le risposte sopra sono il modo standard / "giusto" per farlo.
Un altro approccio più semplice da un punto di vista più "dell'utente finale" è quello di fare in modo che qualsiasi attività pianificata o in background scriva il proprio output in un file "log". Il file può trovarsi ovunque sul tuo sistema, ma se l'attività è in esecuzione come root (da cron
, ecc.), Allora da qualche parte sotto /var/log
è un buon posto per metterlo.
Ho creato la /var/log/maint
directory e l'ho resa leggibile da tutti e ho un file leggibile sotto quello chiamato "backup" dove registro l'output dai miei script di backup.
Ho creato la mia directory in modo che i miei file non si confondano con le cose generate dal sistema.
Per mettere roba lì (in bash):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
Ciò >>
provoca l'aggiunta dei messaggi al file invece di sovrascriverlo ogni volta.
Se il mio script ha un sacco di output, io uso uno script o una funzione per l'output, quindi tutto viene fatto allo stesso modo. Di seguito è la mia attuale (versione overkill): (le cose VERBOSE sono lì per quando sto eseguendo lo script da un terminale e voglio vedere cosa sta succedendo per scopi di debug.)
#!/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
Modifica: at
esempio semplicistico che scrive in un file utente
Non l'ho usato per sempre, quindi l'ho capito con un paio di semplici script.
Il primo script pianifica semplicemente l'evento utilizzando at
. Il comando stesso potrebbe essere semplicemente digitato in un terminale, ma io sono pigro, specialmente quando devo farlo più volte mentre lo collaudo senza ingannare con la cronologia dei comandi.
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
Il secondo script è quello programmato per l'esecuzione
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Ho creato entrambi gli script in un editor di testo, li ho salvati e poi li ho resi ciascuno eseguibile usando chmod 700 script-file-name
. Li ho messi entrambi nella mia $HOME/bin
directory per comodità, ma potrebbero essere ovunque il mio utente abbia pieno accesso. Uso 700
per qualsiasi script che è solo per il test, ma su un singolo sistema utente, potrebbe anche essere 755
.
Ho già una directory chiamata /home/bigbird/log
per salvare l'output da mytest_at_script
. Questo può anche essere ovunque l'utente abbia pieno accesso. Assicurati solo che esista prima che lo script venga eseguito o chiedi allo script di crearlo.
Per eseguirlo, mi sono appena assicurato che il tempo per il at
comando mytest_at_run
fosse un po 'in futuro e poi l'ho eseguito da un terminale. Ho quindi atteso che funzionasse ed esaminassi il contenuto di $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$
Alcune note:
Anche se sto correndo at
dal mio utente, non conosce il mio ambiente come la mia PATH
e la mia directory home, quindi non lo presumo. Uso percorsi completi come farei per qualsiasi cron
lavoro. E se mai volessi farlo diventare un cron
lavoro, non dovrò cambiare nulla solo per farlo funzionare.
Ho usato >>
a mytest_at_script
emettere accodamento al file di log invece >
che avrebbe sostituito in ogni corsa. Utilizzare quello che meglio si adatta alla propria applicazione.
sleep 3m; echo Running