上記の答えは、それを行うための標準的/「正しい」方法です。
より「エンドユーザー」の観点からより簡単な別のアプローチは、スケジュールされたタスクまたはバックグラウンドタスクで出力を「ログ」ファイルに書き込むことです。ファイルはシステム上のどこにあってもかまいませんが、タスクがrootとして(from 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
2番目のスクリプトは、実行がスケジュールされているスクリプトです
#!/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