logrotateによって実行されたスクリプトは、手動で実行した場合とは異なる結果をもたらします

annahri

を使用してアプリケーションログをローテーションしたいと思いますlogrotate各ローテーションの後、ローテーションされたすべてのログを別のディレクトリに移動するスクリプトを実行します。たとえば/home/dev/logs/frontend、には、次のログファイルがあります。

webapp1-access.log
webapp2-access.log
anotherapp3-access.log
codename-access.log
...

そして私のlogrotate設定ファイル:

$ cat app.daily
/home/dev/logs/frontend/*access.log {
   rotate 1
   daily
   copytruncate
   compress
   notifempty
   missingok
   lastaction
      bash /path/to/script.sh
   endscript
}

そして、script.shが行うことは、ログファイル名に基づいてディレクトリ作成し、ローテーションされたログファイルをそこに移動することです。webapp1-access.logように回転されるだろうwebapp1-access.log.1.gz、スクリプトはそれを移動します/x/y/webbapp1/renamed.log.gz他のローテーションされたログについても同様です。

を使用してlogrotateをテストしたところ、logrotate -fv /path/to/config期待どおりに完全に機能しました。次に、logrotate構成ファイルを/etc/logrotate.d(シンボリックリンクとして)に配置します

翌日/x/y、dirを確認したところ次のようになりました。

webbapp1/                       <---- created from initial logrotate -fv
webbapp1-access.log/            <---- Unexpected
anotherapp3/                    <---- created from initial logrotate -fv
anotherapp3-access.log/         <---- Unexpected
codename/                       <---- created from initial logrotate -fv
codename-access.log/            <---- Unexpected

*-access.log/dirsにはlogrotateのによって作成されます。ただし、logrotate -vf config複数回実行しても、予期しない結果は発生しません。これは、logrotateを離れて毎日ローテーションするときに発生します。

なんでこんなことが起こっているの?どうすればこれを修正できますか?


script.sh

#! /usr/bin/bash

exec 3>> /var/log/archived-log.log
[ "${1:-}" = "-d" ] && debug=1

environment="frontend"

rotateddir="/home/dev/logs/$environment"
destdir="/x/y"
[ "${debug:-}" ] && echo "DEST DIR: $destdir"

log() {
    timestamp=$(date +"%Y-%m-%d %H:%M:%S")
    echo "$timestamp: $1" >&3
}

for archive in $rotateddir/*.gz; do
    [ "${debug:-}" ] && echo "ARCHIVE: $archive"
    [ "${archive##*/}" = "*.gz"  ] && continue
    base_name=$(basename "$archive")
    [ "${debug:-}" ] && echo "BASENAME: $base_name"
    extension="${base_name##*.}"
    [ "${debug:-}" ] && echo "EXT: $extension"
    newdir_name="${base_name%-*}"
    [ "${debug:-}" ] && echo "NEWDIR_NAME: $newdir_name"
    tanggal=$(stat -c %y "$archive" | cut -d" " -f1 | { read dat; date -d $dat +%Y%m%d; })
    #jam=$(stat -c %y "$archive" | cut -d" " -f2 | { read dat; date -d $dat +%H%M; })
    newdir_path="$destdir/$newdir_name"
    [ "${debug:-}" ] && echo "NEWDIR_PATH: $newdir_path"
    #dest_archive="$newdir_path/$tanggal-$jam.log.$extension"
    dest_archive="$newdir_path/$tanggal.log.$extension"
    [ "${debug:-}" ] && echo "DEST_ARCHIVE: $dest_archive"

    [ ! -d "$newdir_path" ] && {
        if [ "${debug:-}" ]; then
            echo "Would create $newdir_path"
        else
            mkdir -p "$newdir_path"
            log "Created directory: $newdir_path"
        fi
    }

    [ ! -f "$dest_archive" ] && {
        if [ "${debug:-}" ]; then
            echo "Would move $archive to $dest_archive"
        else
            rsync -a --no-owner --no-group --remove-source-files "$archive" "$dest_archive"
            #cp -u --no-preserve=mode,ownership "$archive" "$dest_archive" && rm -f "$archive"
            log "Relocated $archive to $dest_archive"
        fi
    }

    rotates=$(ls -1 "$newdir_path" | wc -l )
    [ "$rotates" -ge 7 ] && {
        oldest=$(ls -t "$newdir_path" | tail -1)
        if [ "${debug:-}" ]; then
            echo "Would delete the oldest archive: $oldest"
        else
            rm -f "$newdir_path/$oldest"
            log "Deleted oldest archive of $base_name : $oldest"
        fi
    }   
done

exit 0



更新

なぜこれが発生するのかはまだわかりませんが、最終的に、ローテーションの数分後にcronでスクリプトを実行することにしました。

私の「script.sh」のこの部分は、newdir_name="${base_name%-*}"によって十分に評価されていないのではないかと思いlogrotateます。しかし、繰り返しますが、を使用して強制的に実行すると、期待どおりに機能しましたlogrotate -fv config

annahri

logrotateはを使用してスクリプトを実行しsh、私のスクリプトにはbashishmsが含まれていることがわかりました。

manページから:

lastaction / endscript

lastactionendscriptの間の行(どちらも単独で行に表示される必要があります)が実行されます(/ bin / shを使用)...

結局、crontabログローテーションの数分後にスクリプトを実行します。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

pgrepは、スクリプトから実行した場合とターミナルで実行した場合とで異なる結果を返します

分類Dev

手動で実行した場合とcronでスクリプトを実行した場合の結果が異なる

分類Dev

VBAのExcelソルバーは、ソルバーを手動で実行する場合とは異なる結果をもたらします

分類Dev

PHPで実行されたMySQLクエリは、実行間で何も変更されずに異なる結果をもたらします

分類Dev

ターミナルから実行した場合とPythonから実行した場合では、スクリプトの動作が異なります

分類Dev

Pythonによって実行されたスクリプト結果のキーから値を取得します

分類Dev

スクリプトがcrontabジョブとして実行されたときにbashスクリプトによって開始されないプログラムもありますが、すべてのプログラムは手動でbashスクリプトを実行することによって開始できます。

分類Dev

「ps-ef」は、phpスクリプト内で実行した場合とコマンドラインで実行した場合で異なる結果を返します。

分類Dev

CPUで実行された数学は、GPUで異なる結果をもたらします

分類Dev

Xcodeボットを介して作成されたIPAはAPNSに対して実行に失敗しますが、Xcode自体を介して手動で構築された場合、またはXcodeによってアーカイブとして構築された場合に実行されます

分類Dev

並列シミュレーションは、シリアルおよび追加の並列実行と比較した場合、いくつかのタイムステップの後に異なる結果をもたらします

分類Dev

phpとmysqlを使用したクエリによって実行されたクエリ結果を更新するにはどうすればよいですか?

分類Dev

SQLを実行すると、MS SQL Server ManagementStudioで直接実行した場合とは異なる結果が返されます。

分類Dev

cURLによって送信されたhttpリクエストがブラウザとは異なる結果をもたらすのはなぜですか?

分類Dev

Jmeterは、hudsonによって実行されている場合はsshサンプラーを実行しておらず、手動で実行されている場合はsshサンプラーを実行しています。

分類Dev

手動で実行されるストアドプロシージャは、ジョブを介した実行とは異なります

分類Dev

constexprコンストラクターは、コンパイル時にGCCによって評価されると、異なる結果をもたらします。

分類Dev

サブクエリに対するクエリは、サブクエリを単独で実行する場合とは異なる結果をもたらします

分類Dev

同じ入力で実行した場合、カスタムストリーミングメトリックが常に異なる結果をもたらすのはなぜですか?

分類Dev

コマンドラインの実行がPowerShellでのスクリプトの実行に異なる結果をもたらすのはなぜですか

分類Dev

プログラムによって生成された使用量出力からの合計をスクリプトに実装して、繰り返し実行しても正常に実行されるようにするにはどうすればよいですか?

分類Dev

cronで実行されたシェルスクリプトは、手動で実行されたものとは異なるサイズのファイルになります

分類Dev

sqliteデータベースにクエリを実行すると、クエリしようとしたデータがデータベースに含まれている場合でも、結果が[](空白)になります。

分類Dev

手動で実行した場合と比較して、git で実行した場合と異なる動作をする、echo -n を使用したプリコミット フック

分類Dev

Selectステートメントは、SQLServerエージェントを介して実行すると異なる結果をもたらします

分類Dev

mockitoテストは、junitテストとして実行したときにそのようなメソッドエラーを発生させませんが、実行設定でjarを手動で追加すると、うまく実行されます

分類Dev

CBCを使用したJavaDES暗号化では、実行するたびに異なる結果が得られます

分類Dev

whileループとifステートメントは、条件が満たされた場合に異なるコマンドを実行します

分類Dev

popenを使用して実行した場合、またはサブプロセスライブラリで実行した場合、Pythonで入力プロンプトを独自の行に出力するにはどうすればよいですか?

Related 関連記事

  1. 1

    pgrepは、スクリプトから実行した場合とターミナルで実行した場合とで異なる結果を返します

  2. 2

    手動で実行した場合とcronでスクリプトを実行した場合の結果が異なる

  3. 3

    VBAのExcelソルバーは、ソルバーを手動で実行する場合とは異なる結果をもたらします

  4. 4

    PHPで実行されたMySQLクエリは、実行間で何も変更されずに異なる結果をもたらします

  5. 5

    ターミナルから実行した場合とPythonから実行した場合では、スクリプトの動作が異なります

  6. 6

    Pythonによって実行されたスクリプト結果のキーから値を取得します

  7. 7

    スクリプトがcrontabジョブとして実行されたときにbashスクリプトによって開始されないプログラムもありますが、すべてのプログラムは手動でbashスクリプトを実行することによって開始できます。

  8. 8

    「ps-ef」は、phpスクリプト内で実行した場合とコマンドラインで実行した場合で異なる結果を返します。

  9. 9

    CPUで実行された数学は、GPUで異なる結果をもたらします

  10. 10

    Xcodeボットを介して作成されたIPAはAPNSに対して実行に失敗しますが、Xcode自体を介して手動で構築された場合、またはXcodeによってアーカイブとして構築された場合に実行されます

  11. 11

    並列シミュレーションは、シリアルおよび追加の並列実行と比較した場合、いくつかのタイムステップの後に異なる結果をもたらします

  12. 12

    phpとmysqlを使用したクエリによって実行されたクエリ結果を更新するにはどうすればよいですか?

  13. 13

    SQLを実行すると、MS SQL Server ManagementStudioで直接実行した場合とは異なる結果が返されます。

  14. 14

    cURLによって送信されたhttpリクエストがブラウザとは異なる結果をもたらすのはなぜですか?

  15. 15

    Jmeterは、hudsonによって実行されている場合はsshサンプラーを実行しておらず、手動で実行されている場合はsshサンプラーを実行しています。

  16. 16

    手動で実行されるストアドプロシージャは、ジョブを介した実行とは異なります

  17. 17

    constexprコンストラクターは、コンパイル時にGCCによって評価されると、異なる結果をもたらします。

  18. 18

    サブクエリに対するクエリは、サブクエリを単独で実行する場合とは異なる結果をもたらします

  19. 19

    同じ入力で実行した場合、カスタムストリーミングメトリックが常に異なる結果をもたらすのはなぜですか?

  20. 20

    コマンドラインの実行がPowerShellでのスクリプトの実行に異なる結果をもたらすのはなぜですか

  21. 21

    プログラムによって生成された使用量出力からの合計をスクリプトに実装して、繰り返し実行しても正常に実行されるようにするにはどうすればよいですか?

  22. 22

    cronで実行されたシェルスクリプトは、手動で実行されたものとは異なるサイズのファイルになります

  23. 23

    sqliteデータベースにクエリを実行すると、クエリしようとしたデータがデータベースに含まれている場合でも、結果が[](空白)になります。

  24. 24

    手動で実行した場合と比較して、git で実行した場合と異なる動作をする、echo -n を使用したプリコミット フック

  25. 25

    Selectステートメントは、SQLServerエージェントを介して実行すると異なる結果をもたらします

  26. 26

    mockitoテストは、junitテストとして実行したときにそのようなメソッドエラーを発生させませんが、実行設定でjarを手動で追加すると、うまく実行されます

  27. 27

    CBCを使用したJavaDES暗号化では、実行するたびに異なる結果が得られます

  28. 28

    whileループとifステートメントは、条件が満たされた場合に異なるコマンドを実行します

  29. 29

    popenを使用して実行した場合、またはサブプロセスライブラリで実行した場合、Pythonで入力プロンプトを独自の行に出力するにはどうすればよいですか?

ホットタグ

アーカイブ