FreeBSD 上の Bash スクリプトの問題

FreeBSD 上の Bash スクリプトの問題

私は以下のbashスクリプトを、rootユーザーとしてcron経由で1時間ごとに実行するように設定しています。このスクリプトの目的は、ファイルがsftpサーバーにアップロードされたときに電子メールを送信し、ログイン情報を送信することです。スクリプトは次のとおりです。

    build_report()  {
    # This function builds the report header and gets the list of files

    #Get all the files under /home/SFTP
    local f=($( find "/home/SFTP" -type f | tr " " "_" ))

    echo
    echo "********************************************";
    echo "*************** FILE REPORT ****************";
    echo "********************************************";
    echo "****  SEARCHING THROUGH SFTP FOLDERS  ******";
    echo "********************************************";
    echo "* IF I FIND SOMETHING, I WILL LIST IT HERE *";
    echo "********************************************";
    echo "********************************************";
    echo "GENERATED ON $TIMESTAMP                     ";

    echo
    echo
    #Loop through all the files and list list them
    for i in " ${f[@]}"
    do
            echo $i
    done
    }

    sftp_log() {
    #This function checks the /var/log/auth.log file for sessions 

    echo "*****************Begin Access Log*********************"
    cat /var/log/auth.log|grep -E "interactive/pam"

    }

    TIMESTAMP=$(date)
    files=$(find "/home/SFTP" -type f | tr " " "_")

     #If there are files present create the report, email it and log we found something.
    #Else, log we didn't find anything 
    if [ "$files" != "" ]; then
            { build_report && sftp_log; } | awk '{print $0,"\n"}' | mail -s "report" [email protected]
             echo $TIMESTAMP " Files found. Email Sent">>filereport.log
    else
            echo $TIMESTAMP " No files found" >>filereport.log
    fi

    exit 0

この問題は毎日午前8時に発生します。何が起こるかの例を以下に示します。

午前 7 時: ファイルが存在します。両方の関数の出力とともにレポートが正しく送信されます。

午前8時: 同じファイルが存在します。レポートはbuild_report関数の出力のみで送信されます。

午前9時: 同じファイルが存在します。レポートはbuild_report関数の出力のみで送信されます。

午前 10 時: ファイルはまだ存在します (新しいファイルが追加されている可能性もあれば、同じファイルである可能性もあります)。両方の関数の出力が正しく記載された電子メールが送信され、8 時から 9 時の間に行われたログインが存在します。

何らかのファイルローテーション/ファイルロックの問題がないことを確認するために、auth.log を週に 1 回ローテーションするように設定しました。また、午前 7 時にファイルが存在する場合は、正しいレポートを取得します。

何かアイデアはありますか?私のbashスクリプトのスキルはせいぜい粗雑なので、どんなアイデアでも歓迎します

答え1

echo $BASH を入力して何が起こるか確認すると、crown に bash を使用するように明示的に指示しない限り、sh が使用されていることがわかります。また、[@] を追加することが FreeBSD sh で可能かどうかはわかりません。

関連情報