Наведені вище відповіді - це стандартний / «правильний» спосіб зробити це.
Інший підхід, який є більш простим з точки зору "кінцевого користувача", полягає в тому, щоб будь-яке заплановане або фонове завдання записало свій вихід у файл "журналу". Файл може бути в будь-якій точці вашої системи, але якщо завдання працює як root (від cron
тощо), то десь під ним /var/log
- це гарне місце для його розміщення.
Я створив /var/log/maint
каталог і зробив його читабельним усіма, і у мене є читабельний файл під тим, що називається "резервна копія", де я реєструю висновки зі своїх резервних скриптів.
Я створив власний каталог, щоб мої файли не змішувалися з речами, створеними системою.
Щоб помістити речі туди (в баш):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
>>
Призводить до того , що повідомлення будуть додаватися до файлу замість перезапису його кожен раз.
Якщо мій сценарій має багато результатів, я використовую сценарій або функцію для виводу, щоб все було зроблено так само. Нижче наводиться моя поточна (версія overkill): (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
команду в 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