以上答案是标准/“正确”的方法。
从“终端用户”角度来看,另一种更简单的方法是让任何定时或后台任务将其输出写入“日志”文件。该文件可以放在系统的任何位置,但如果任务以 root 身份运行(来自 cron 等),那么将其放在 /var/log 目录下的某个位置是一个好选择。
我创建了 /var/log/maint 目录,并使其可由所有人读取,我在其中有一个名为“backup”的可读文件,用于记录备份脚本的输出。
我创建了自己的目录,这样我的文件就不会与系统生成的文件混合在一起。
要将内容放置在那里(在 bash 中):
BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"
< p > < code > >> 会导致消息追加到文件中,而不是每次都覆盖它。
如果我的脚本有很多输出,我会使用一个脚本或函数来输出,这样一切都能按照相同的方式完成。下面是我当前的(过度设计的)版本:(VERBOSE 的内容是为了在从终端运行脚本时查看调试信息。)
#!/bin/bash
## backup_logger
## backup system logging module
## Copyleft 01/20/2013 JPmicrosystems
## Usage is ${SCRIPT_NAME} [-v] [
## If present, -v says log to console as well as to the log file
##
## If
## 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] [
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 -
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 脚本文件名将它们都设置为可执行。为了方便起见,我把它们放在了$HOME/bin目录中,但它们也可以放在用户具有完全访问权限的任何位置。对于仅用于测试的脚本,我使用700权限,但在单用户系统中,也可以使用755权限。
我已经有一个名为/home/bigbird/log的目录来保存mytest_at_script的输出。这个目录也可以放在用户具有完全访问权限的任何位置。只需确保脚本运行之前该目录已存在,或者让脚本自行创建它。
要运行它,我只需要确保mytest_at_run中at命令的时间稍晚一些,然后从终端运行它。然后等待它运行并检查$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$
一些建议:
尽管我正在我的用户中运行,但它不知道我的环境,比如我的PATH和我的主目录,所以我不假设这些。我像对任何cron作业一样使用完整路径。如果我以后想将其变成cron作业,我也不需要更改任何内容才能使其运行。
在mytest_at_script中,我使用>>来将输出追加到日志文件中,而不是使用>,后者会在每次运行时替换它。根据你的应用程序选择适合的方法即可。