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/maintdirectory 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: atesempio 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/bindirectory per comodità, ma potrebbero essere ovunque il mio utente abbia pieno accesso. Uso 700per qualsiasi script che è solo per il test, ma su un singolo sistema utente, potrebbe anche essere 755.
Ho già una directory chiamata /home/bigbird/logper 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 atcomando mytest_at_runfosse 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 atdal mio utente, non conosce il mio ambiente come la mia PATHe la mia directory home, quindi non lo presumo. Uso percorsi completi come farei per qualsiasi cronlavoro. E se mai volessi farlo diventare un cronlavoro, non dovrò cambiare nulla solo per farlo funzionare.
Ho usato >>a mytest_at_scriptemettere 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