ここから本文です

日付付きのログファイルを作成し、9-1.shというファイルで7日以上古い日付のログフ...

Lilyさん

2020/5/1111:52:34

日付付きのログファイルを作成し、9-1.shというファイルで7日以上古い日付のログファイルを削除するログローテーションを行おうと思っています。

ですが、日付ログファイルが更新されておらず、make_testlogs.shの中身に問題があるようなのですが、
以下のように今日5/11から七日間のログファイルが存在していないのです。
間違いをご指摘いただけると助かります。初心者なので、細かいくらい言ってくださるとありがたいです。よろしくお願いします。

[opeuser@localhost ~]$ ls log
level1_9-1.log level1_9-1.log.20200414 level1_9-1.log.20200417 level1_9-1.log.20200422 level1_9-1.log.20200508
level1_9-1.log.20200412 level1_9-1.log.20200415 level1_9-1.log.20200418 level1_9-1.log.20200423 level1_9-1.log.20200511
level1_9-1.log.20200413 level1_9-1.log.20200416 level1_9-1.log.20200419 level1_9-1.log.20200427


<実際の結果>

[opeuser@localhost ~]$ ./make_testlogs.sh
dirname: オペランドがありません
Try 'dirname --help' for more information.
./make_testlogs.sh: 行 15: ${LOGFILE}: 曖昧なリダイレクトです
touch: `0000': 無効な日付の書式です
touch: `202005100000.20200510': 無効な日付の書式です
touch: `202005090000.20200509': 無効な日付の書式です
touch: `202005080000.20200508': 無効な日付の書式です
touch: `202005070000.20200507': 無効な日付の書式です
touch: `202005060000.20200506': 無効な日付の書式です
touch: `202005050000.20200505': 無効な日付の書式です
touch: `202005040000.20200504': 無効な日付の書式です
touch: `202005030000.20200503': 無効な日付の書式です



<スクリプト中身・ファイル名:make_testlogs.sh>

#!/bin/bash

# logファイル名
LOGFILE=$1

# logディレクトリ名
LOGDIR=`dirname ${LOGFILE}`

# logディレクトリ作成
if [ ! -d ${LOGDIR} ]; then
mkdir ${LOGDIR}
fi

# logファイル作成
time=`date +%Y%m%d`
echo "test log file. current" > ${LOGFILE}
touch -t ${time}0000 ${LOGFILE}

# 過去ログファイル作成
for i in `seq 1 8`
do
time=`date +%Y%m%d --date "$i day ago"`
echo "test log file. ${time}" > ${LOGFILE}.${time}
touch -t ${time}0000${LOGFILE}.${time}
done

exit 0

<level1_9-1.sh>
#!/bin/bash

#シェル名 level1_9-1.sh
ARGNUM=$#
LOGFILE=$1
DATE=`date +%Y%m%d`


#1以外エラー表示
if [ $# != 1 ]; then
echo "Error 引数異常:引数=$#"
exit 1
fi

#logファイルが存在しない場合
if [ ! -e ${LOGFILE} ]; then

echo "ログファイルは存在しません:ログファイル=${LOGFILE}"
exit 1
fi

#logファイルが存在する場合
if [ -e ${LOGFILE}.${DATE} ]; then
echo "Error ローテーション済み"
exit 0
fi


LOGFILENAME=`basename ${LOGFILE}`
LOGDIRNAME=`dirname ${LOGFILE}`


#ファイルをコピー
cp -a ${LOGFILE} ${LOGFILE}.${DATE}

#コピー結果
if [ $? - eq 0 ]
echo `コピーは成功です。`
else
echo `コピーは失敗です。`
exit 1
fi

#ローテーション対象ログの中身を空に
cat /dev/null > ${LOGFILE}

#7日以上古い日付付きログファイルを削除
find -path </home/opeuser/log> -mtime +7 -name "<level1_9-1.log>.*" | xargs rm -f
exit 1

<9-1.sh実行結果>※これは実行イメージ通りに出ます。
[opeuser@localhost ~]$ ./level1_9-1.sh
Error 引数異常:引数=0
[opeuser@localhost ~]$ ./level1_9-1.sh dummy
ログファイルは存在しません:ログファイル=dummy
[opeuser@localhost ~]$ ./level1_9-1.sh /home/opeuser/log/level1_9-1.log
Error ローテーション済み

閲覧数:
2
回答数:
1
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

yi0********さん

2020/5/1114:34:17

それは単に make_testlogs.sh の使い方を間違えただけでは?
make_testlogs.sh に期待したのはたとえばこんなことでしょうか。

$ find 'test dir'
find: ‘test dir’: そのようなファイルやディレクトリはありません
$ ./make_testlogs.sh 'test dir/test file'
$ find 'test dir'
test dir
test dir/test file.20200507
test dir/test file.20200509
test dir/test file.20200503
test dir/test file
test dir/test file.20200510
test dir/test file.20200505
test dir/test file.20200504
test dir/test file.20200508
test dir/test file.20200506
$

せっかくなので make_testlogs.sh を修正してみました。

#!/bin/bash

#1以外エラー表示
if [ $# != 1 ]; then
echo "Error 引数異常:引数=$#"
exit 1
fi
# 引数にアクセスする前に、その引数があることを確認しましょう。

# logファイル名
#LOGFILE=$1
LOGFILE="$1"
# 変数を参照する時は必ずクォートしましょう。

# logディレクトリ名
#LOGDIR=`dirname ${LOGFILE}`
LOGDIR=`dirname "${LOGFILE}"`

# logディレクトリ作成
# if [ ! -d ${LOGDIR} ]; then
# mkdir ${LOGDIR}
# fi
if [ ! -d "${LOGDIR}" ]; then
mkdir "${LOGDIR}" || exit 1
fi
# 同名のディレクトリが無いから mkdir が成功する…とは限らない。

# logファイル作成
time=`date +%Y%m%d`
# echo "test log file. current" > ${LOGFILE}
# touch -t ${time}0000 ${LOGFILE}
echo "test log file. current" > "${LOGFILE}"
touch -t ${time}0000 "${LOGFILE}"

# 過去ログファイル作成
for i in `seq 1 8`
do
time=`date +%Y%m%d --date "$i day ago"`
# echo "test log file. ${time}" > ${LOGFILE}.${time}
# touch -t ${time}0000${LOGFILE}.${time}
echo "test log file. ${time}" > "${LOGFILE}.${time}"
touch -t ${time}0000 "${LOGFILE}.${time}"
done

exit 0

質問した人からのコメント

2020/5/14 20:57:40

ご指摘ありがとうございました。解決出来ました。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる