シェルコマンド言語は、インタープリタの性質上、実行速度の面で不利です。
そのため、大規模なアプリとしての実装には向きません。
しかし、ログ出力といった最低限の機能は作るほうが、メンテナンス等で楽になります。
ここでは、シェルコマンド言語を利用する場合のテンプレートを公開しています。いずれもライセンスは 3条項BSDライセンス としていますので、自由に改変してください。
また、日本語を含むため UTF-8 で保存しています。日本語行を削除した場合は、エディタの実装によって ASCII や Shift JIS として処理されます。
ひとつのファイルですべてを完結する、標準的なテンプレートです。
そのまま利用する場合は /var/log/script ディレクトリを事前に作成してください。
スクリプトの格納場所は指定しません。
利用時には Timing の Anytime か Cron どちらかを消してください。他にも不都合がある部分は修正してください。
ファイルは こちら からダウンロードできます。
template_a_20210807.zip
もしくは、下記をコピペしてください。文字コードを UTF8 にすることをお勧めします。
#!/bin/bash
######################################################################
#
# Script name : template_a.sh
# Usage : template_A.sh [-h] [-v]
# Update : 2021.8.7 / Kazuya Jimba
# yyyy.mm.dd / Name
# Timing : Anytime
# Timing : Cron (* * * * *)
#
# オリジナル配布元 http://ttm.jimba.ddo.jp/
# 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################
### Parameter and Bariable ###########################################
## Directory
pLogDir="/var/log/script"
## File
pLogFile="$(basename $0 .sh).log"
## Path
pLogPath="${pLogDir}/${pLogFile}"
## etc
pVersion="20210807.01"
## Numbers
nReportDay=0
nRV=0
## Flag
# Script log
# 0 - Script log
# 1 - Standard output
# 2 - Standard error output
# 3 - /var/log/messages
fLogOutput=0
### Function #########################################################
fnLog() {
case ${fLogOutput} in
0 ) echo "$(date '+%Y/%m/%d %H:%M:%S') $*" >> ${pLogFile};;
1 ) echo "$*";;
2 ) echo "$*" >&2;;
3 ) /usr/bin/logger -t ${0##*/} "$*";;
esac
}
fnErr() {
echo "$*" >&2
fnLog "Error: $*"
}
fnEnd() {
case ${1} in
0 ) fnLog "Normal end.";;
11 ) fnErr "Read permission not exist (${2})";;
12 ) fnErr "Write permission not exist (${2})";;
13 ) fnErr "Exec permission not exist (${2})";;
14 ) fnErr "Directory not exist (${2})";;
15 ) fnErr "File not exist (${2})";;
* ) fnErr "Unknown error (${2})";;
esac
exit ${1}
}
### Main #############################################################
# Environment check
fnLog "Script start (${0##*/})"
[ -d "${pLogDir}" ] || fnEnd 14 "${pLogDir}"
[ -f "${pLogPath}" ] || fnEnd 15 "${pLogPath}"
# Argument analyse
while getopts vh tOpt; do
case ${tOpt} in
h )
fnLog "Option: Help message."
echo "${0##*/} [-h] [-v]"
echo " [-v] Version print."
echo ""
fnEnd 0
;;
v )
fnLog "Option: Version print."
echo "Script version: ${pVersion}"
echo ""
fnEnd 0
;;
esac
done
# xxxxx
### End ##############################################################
# report
nReportDay=$(( $(date -u +'%d' --date="@${SECONDS}") - 1 ))
fnLog "Exec Time: ${nReportDay} day $( date -u +'%H:%M:%S' --date=@${SECONDS} )"
# end
fnEnd ${nRV}
######################################################################
source コマンド . で変数および関数を外部ファイルにした、中規模~大規模向けのテンプレートです。
デフォルトでは、スクリプトの格納場所を /usr/local/script で想定しています。
そのまま利用する場合は /usr/local/ ディレクトリにファイルを置いて、unzip コマンドで解凍してください。
ファイルは、次の構成になっています。
./script/
./script/template_b.sh
./script/conf/
./script/conf/common.cnf
./script/conf/template_b.cnf
./script/log/
./script/tmp/
展開後は、各ディレクトリ、各ファイルの権限を適切に変更してください。
利用時には Timing の Anytime か Cron どちらかを消してください。他にも不都合がある部分は修正してください。
ファイルは こちら からダウンロードできます。
template_b_20210808.zip
もしくは、下記をコピペしてください。文字コードは UTF8 をお勧めします。
個別に作るスクリプトのテンプレートです。
コピーして使います。
#!/bin/bash
######################################################################
#
# Script name : template_b.sh
# Usage : template_b.sh [-h] [-v]
# Update : 2021.8.8 / Kazuya Jimba
# yyyy.mm.dd / Name
# Timing : Anytime
# Timing : Cron (* * * * *)
#
# オリジナル配布元 http://ttm.jimba.ddo.jp/
# 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################
### Parameter and Bariable ###########################################
# common.cnf
if [ -f conf/common.cnf ];then
. conf/common.cnf
else
echo "Not exist conf/common.cnf"
exit 1
fi
# template_b.cnf
[ -f conf/template_b.cnf ] || fnErrEnd 11 "conf/template_b.cnf"
. conf/template_b.cnf
### Main #############################################################
# Environment check
fnLog "Script start (${0##*/})"
[ -d "${pConfDir}" ] || fnErrEnd 14 "${pConfDir}"
[ -d "${pLogDir}" ] || fnErrEnd 14 "${pLogDir}"
[ -d "${pTmpDir}" ] || fnErrEnd 14 "${pTmpDir}"
# Argument analyse
while getopts vh tOpt; do
case ${tOpt} in
h )
fnLog "Option: Help message."
echo "${0##*/} [-h] [-v]"
echo " [-v] Version print."
echo ""
fnEnd ${nRV}
;;
v )
fnLog "Option: Version print."
echo "Script version: ${pVersion}"
echo ""
fnEnd ${nRV}
;;
esac
done
# xxxxx
### End ##############################################################
# report
nReportDay=$(( $(date -u +'%d' --date="@${SECONDS}") - 1 ))
fnLog "Exec Time: ${nReportDay} day $( date -u +'%H:%M:%S' --date=@${SECONDS} )"
# end
fnEnd ${nRV}
######################################################################
スクリプト共通の設定ファイルです。
作成するスクリプトで追加したい共通機能があれば、こちらに追記します。
利用したい環境に応じて、各設定を変更してください。
######################################################################
#
# Script name : common.cnf
# Usage : . ./common.sh
# Update : 2021.8.7 / Kazuya Jimba
# yyyy.mm.dd / Name
# Timing : Anytime
#
# オリジナル配布元 http://ttm.jimba.ddo.jp/
# 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################
### Parameter and Bariable ###########################################
## Directory
pBaseDir="/usr/local/script"
pConfDir="${pBaseDir}/conf"
pLogDir="${pBaseDir}/log"
pTmpDir="${pBaseDir}/tmp"
## File
pLogFile="$(basename $0 .sh).log"
## Path
pLogPath="${pLogDir}/${pLogFile}"
## etc
## Numbers
nReportDay=0
nRV=0
## Flag
# Log Severity level
# NAME Lv Message content
# EMERG 0 System is unusable
# ALERT 1 Should be corrected immediately
# CRIT 2 Critical conditions
# ERR 3 Error conditions
# WARNING 4 May indicate that an error will occur if action is not taken.
# NOTICE 5 Events that are unusual, but not error conditions.
# INFO 6 Normal operational messages that require no action.
# DEBUG 7 Information useful to developers for debugging the application.
pLogNotifyLv=5
# Log output
# 0 - Script log
# 1 - Standard output
# 2 - Standard error output
# 3 - /var/log/messages
fLogOutput=0
# ログ管理 0=通知する
fEnLog=0
fEnLogEmerg=0
fEnLogAlert=0
fEnLogCrit=0
fEnLogErr=0
fEnLogWarn=0
fEnLogNotice=0
fEnLogInfo=0
fEnLogDebug=0
### Function #########################################################
fnLog() {
case ${fLogOutput} in
0 ) echo "$(date '+%Y/%m/%d %H:%M:%S') $*" >> ${pLogPath};;
1 ) echo "$*";;
2 ) echo "$*" >&2;;
3 ) /usr/bin/logger -t ${0##*/} "$*";;
esac
}
fnEmerg() {
echo "$*" >&2
[ "${fEnLogEmerg}" -eq "0" ] && fnLog "[Emergency] $*"
}
fnAlert() {
if [ "${pLogNotifyLv}" -ge "1" ]; then
echo "$*" >&2
[ "${fEnLogAlert}" -eq "0" ] && fnLog "[Alert] $*"
fi
}
fnCrit() {
if [ "${pLogNotifyLv}" -ge "2" ]; then
echo "$*" >&2
[ "${fEnLogCrit}" -eq "0" ] && fnLog "[Critical] $*"
fi
}
fnErr() {
if [ "${pLogNotifyLv}" -ge "3" ]; then
echo "$*" >&2
[ "${fEnLogErr}" -eq "0" ] && fnLog "[Err] $*"
fi
}
fnWarn() {
if [ "${pLogNotifyLv}" -ge "4" ]; then
[ "${fEnLogWarn}" -eq "0" ] && fnLog "[Warn] $*"
fi
}
fnNotice() {
if [ "${pLogNotifyLv}" -ge "5" ]; then
[ "${fEnLogNotice}" -eq "0" ] && fnLog "[Notice] $*"
fi
}
fnInfo() {
if [ "${pLogNotifyLv}" -ge "6" ]; then
[ "${fEnLogInfo}" -eq "0" ] && fnLog "[Info] $*"
fi
}
fnDebug() {
if [ "${pLogNotifyLv}" -ge "7" ]; then
[ "${fEnLogDebug}" -eq "0" ] && fnLog "[Debug] $*"
fi
}
fnParam() {
fnDebug '[Param] $'"$1 = $2"
}
fnErrEnd() {
# common.cnf を利用するスクリプト共通のエラー番号
caseValue=$1
case ${caseValue} in
0) fnWarn "Normal number input...";;
1) fnErr "Read Permission error ($2)";;
2) fnErr "Write Permission error ($2)";;
3) fnErr "Exec Permission error ($2)";;
10) fnErr "Directory not exist error ($2)";;
11) fnErr "File not exist error ($2)";;
*) fnErr "Unknown error (${caseValue})";;
esac
exit ${caseValue}
}
######################################################################
スクリプト個別の設定ファイルです。
必要の都度、コピーして使います。
######################################################################
#
# Script name : template.cnf
# Usage : [template.sh] . conf/template.cnf
# Update : 2021.8.7 / Kazuya Jimba
# yyyy.mm.dd / Name
# Timing : Anytime
#
# オリジナル配布元 http://ttm.jimba.ddo.jp/
# 改変は自由ですが、改変者の責任に基づくものとします。
######################################################################
### Parameter and Bariable ###########################################
## Directory
## File
## Path
## etc
pVersion="20210807.01"
## Numbers
## Flag
# Log Severity level
# NAME Lv Message content
# EMERG 0 System is unusable
# ALERT 1 Should be corrected immediately
# CRIT 2 Critical conditions
# ERR 3 Error conditions
# WARNING 4 May indicate that an error will occur if action is not taken.
# NOTICE 5 Events that are unusual, but not error conditions.
# INFO 6 Normal operational messages that require no action.
# DEBUG 7 Information useful to developers for debugging the application.
pLogNotifyLv=5
# Log output
# 0 - Script log
# 1 - Standard output
# 2 - Standard error output
# 3 - /var/log/messages
fLogOutput=0
# ログ管理 0=通知する
fEnLog=0
fEnLogEmerg=0
fEnLogAlert=0
fEnLogCrit=0
fEnLogErr=0
fEnLogWarn=0
fEnLogNotice=0
fEnLogInfo=0
fEnLogDebug=0
### Function #########################################################
fnEnd() {
# template.sh で利用するエラー番号
case ${1} in
0 ) fnLog "Normal end.";;
* ) fnErr "Unknown error (${2})";;
esac
fnLog "Script end (${0##*/})"
exit ${1}
}
######################################################################