上面的答案是执行此操作的标准/“正确”方法。
从“最终用户”的角度来看,另一种更简单的方法是让任何计划任务或后台任务将其输出写入“日志”文件。该文件可以位于系统上的任何位置,但是如果任务以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
命令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