Приведенные выше ответы являются стандартным / «правильным» способом сделать это.
Другой подход, более простой с точки зрения «конечного пользователя», заключается в том, чтобы любая запланированная или фоновая задача записывала свои выходные данные в файл «журнала». Файл может находиться где угодно в вашей системе, но если задача выполняется от имени пользователя root (из cron
и т. Д.), То где-то под /var/log
это хорошее место для ее размещения.
Я создал /var/log/maint
каталог и сделал его доступным для чтения всем, и у меня есть читаемый файл под названием «backup», в который я записываю выходные данные из моих скриптов резервного копирования.
Я создал свой собственный каталог, чтобы мои файлы не смешивались с вещами, сгенерированными системой.
Чтобы положить вещи там (в Bash):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
>>
Приводит к тому , что сообщения будут добавляться к файлу вместо перезаписи его каждый раз.
Если у моего сценария много выходных данных, я использую сценарий или функцию для вывода, поэтому все выполняется одинаково. Ниже моя текущая версия (версия с избыточным количеством ресурсов): (материал VERBOSE существует, когда я запускаю скрипт из терминала и хочу посмотреть, что происходит в целях отладки.)
#!/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
Изменить: упрощенный at
пример, который пишет в файл пользователя
Я не использовал это вечно, поэтому я понял это с помощью пары простых скриптов.
Первый скрипт просто планирует событие, используя at
. Сама команда может быть просто набрана в терминале, но я ленив, особенно когда мне приходится делать это несколько раз во время тестирования, не дурачясь с историей команд.
#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56
Второй сценарий - тот, который планируется запустить
#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log
Я создал оба сценария в текстовом редакторе, сохранил их, а затем сделал их исполняемыми chmod 700 script-file-name
. Я поместил их обоих в свой $HOME/bin
каталог для удобства, но они могут быть где угодно, у моего пользователя есть полный доступ. Я использую 700
для любого сценария, который только для тестирования, но в однопользовательской системе, это может быть так же хорошо 755
.
У меня уже есть каталог /home/bigbird/log
для сохранения выходных данных mytest_at_script
. Это также может быть в любом месте, где у вашего пользователя есть полный доступ. Просто убедитесь, что он существует до запуска скрипта или создайте его.
Чтобы запустить его, я просто позаботился о том, чтобы время для at
команды in mytest_at_run
было немного в будущем, а затем запустил его из терминала. Затем я подождал, пока он не побежал, и осмотрел содержимое $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$
Несколько заметок:
Несмотря на то, что я работаю at
от своего пользователя, он не знает мою среду, такую как мой PATH
и мой домашний каталог, поэтому я этого не предполагаю. Я использую полные пути, как я бы для любой cron
работы. И если я когда-нибудь захочу сделать это cron
работой, мне не придется ничего менять, чтобы заставить это работать.
Я использовал >>
в mytest_at_script
для вывода дописать в файл журнала вместо >
который заменил бы его на каждом запуске. Используйте тот, который подходит вашему приложению лучше всего.
sleep 3m; echo Running