🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

1回答

1544閲覧

サーバー移行したバッチ処理がうまく動かない

youplus40

総合スコア19

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2020/12/08 07:04

編集2020/12/08 08:02

前提・実現したいこと

centos 6で動いていた配信メルマガの短縮urlのリダイレクト処理、およびクリック・開封率を解析するバッチ処理を行う機能を
サーバー移行にして動作検証をしております。
下記の流れで、処理を行うのですが、①②ともに動いていない状況です。同ディレクトリ内にあるリダイレクト処理 (PHP)は動いております。
PrivateTmpはfalse、SElinuxはDisabledです。また、httpd、crondの再起動も行っています。
パーミッションはもともとの本番サーバーと同様にしてあるので、問題ないかと思います。
/home/xxx/web/log/error.logには特にエラーは出ていないです。

他に考えられる原因はありますでしょうか。

①/home/xxx/web/log/access.log-日付 ファイルにログを記載
②/tmp/click_log_日付.csv ファイルにログをCSV化
③csvからデータをmysqlのDBに保存

該当のソースコード

#crontab #クリックカウント解析(5時) 32 01 * * * /bin/bash /home/xxx/web/analysis/scripts/parse_click_log.sh staging >> /home/xxx/web/log/click/batch.log 2>&1
#parse_click_log.sh #DB_CONN="$DB_BIN -S $DB_SOCK -u$DB_USER -p$DB_PASSWORD" DB_CONN="$DB_BIN -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASSWORD" AGODAY="$(date +"%Y%m%d" --date="1 days ago")" FILEDAY="$(date +"%Y%m%d")" TODAY="$(date +"%Y-%m-%d")" APACHE_LOG=${APACHE_LOG_PATH}/access.log-${FILEDAY} TMP_LOG_FILE=/tmp/click_log_${FILEDAY}.csv rm -f $TMP_LOG_FILE touch $TMP_LOG_FILE ### read apache log echo "`date` read apache log" while read line; do delivery_mail_id=`echo $line | grep 'GET /c/' | awk -F'"' '{print $4}' | tr '/' ' ' | awk '{print $3"\t"$4"\t"}'` if [ -n "$delivery_mail_id" ] && [ "z$delivery_mail_id" != 0 ]; then log_at=`echo $line | awk -F'"' '{print $2"\t"}'` ua=`echo $line | awk -F'"' '{print $6"\t"}'` echo "${log_at}${ua}${delivery_mail_id}" >> $TMP_LOG_FILE fi done < $APACHE_LOG ### load apache log into click_log tbl sql_cmd="LOAD DATA LOCAL INFILE '${TMP_LOG_FILE}' INTO TABLE click_log FIELDS TERMINATED BY '\t' (@col1,@col2,@col3,@col4) set clicked_at=@col1,ua=@col2,delivery_mail_id=@col4,short_url=@col3,is_active=1,created_at=NOW();" #$DB_CONN -D $DB_NAME_LOG -e "${sql_cmd}" echo "`date` load apache log into click_log tbl" for((i=1;i<=5;i+=1)); do $DB_CONN -D $DB_NAME_LOG -e "${sql_cmd}" if [ "z$?" == "z0" ]; then break fi echo "`date` fail $i, sleep 10s and update again" sleep 10 done ### update mail_id, email, url, mail_type sql_cmd="UPDATE ${DB_NAME_LOG}.click_log, ${DB_NAME_MAIL}.delivery_mail, ${DB_NAME_MAIL}.mail_url, ${DB_NAME_MAIL}.url_master SET click_log.email = delivery_mail.email, click_log.mail_id = delivery_mail.mail_id ,click_log.mail_type=mail_url.mail_type,click_log.url=url_master.url WHERE click_log.delivery_mail_id = delivery_mail.delivery_mail_id AND mail_url.short_url=click_log.short_url AND url_master.url_id = mail_url.url_id AND click_log.created_at >= '${TODAY} 00:00:00';" #$DB_CONN -e "${sql_cmd}" echo "`date` update mail_id, email, url, mail_type" for((i=1;i<=5;i+=1)); do $DB_CONN -e "${sql_cmd}" if [ "z$?" == "z0" ]; then break fi echo "`date` fail $i, sleep 10s and update again" sleep 10 done #rm -f $TMP_LOG_FILE echo "`date` <<<<< END" ### END
#httpd.conf <VirtualHost *:80> ServerAdmin xxx@xxx DocumentRoot /home/xxx/web/analysis/src ServerName image.xxx.jp ErrorLog /home/xxx/web/log/error.log LogFormat "%h %l %u \"%{%Y-%m-%d %H:%M:%S}t\" \"%r\" %>s %b \"%{User-Agent}i\" \"%{Referer}i\"" parselog CustomLog /home/xxx/web/log/access.log parselog <Directory "/home/xxx/web/analysis/src"> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>

試したこと

・llでcsvファイルを確認したところ、更新はされているようでした。
・access.log-xxxにデータを入れましたが、csvは更新されませんでした。
・②のうち、ファイルの作成は動いています。
・前のサーバーからcsvファイルを移行したところ、mysqlへの書き込み(③の動作)は確認しました。

補足情報(FW/ツールのバージョンなど)

cent os 8.2
apache 2.4.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2020/12/08 07:34

/home/xxx/web/log/click/batch.logは確認しましたか? cron の登録で、/bin/bash -x とデバッグ情報出力オプションを指定して実行した結果 /home/xxx/web/log/click/batch.log の内容で想定と異なる結果になってませんか?
youplus40

2020/12/08 07:48

ご質問ありがとうございます。 batch.logは問題なく記録されており、おかしな部分は確認されませんでした。 -xオプションで再度確認を行いましたが、同様におかしな部分は確認されませんでした。
Y.H.

2020/12/08 08:33

> access.log-xxxにデータを入れましたが、csvは更新されませんでした。 想定通りの動作をしているのにcsvは更新されないってことですか?
youplus40

2020/12/08 08:54

そうです。前サーバーのbatch.logと同様の記載がありました。
Y.H.

2020/12/08 09:12

>更新されませんでした とはファイルのタイムスタンプも? 一度削除する処理入ってるからファイルは更新されてると思うんですが。
Y.H.

2020/12/08 09:14

インプットとなるaccess.log-xxxが異なる2回の実行で、結果が同じになってるだけでは?
youplus40

2020/12/08 09:21

私の書き方が悪く申し訳ありませんが、タイムスタンプは更新されておりました。 access.log-xxxを変更してもcsvファイルに書き込みがない状態ですね。
Y.H.

2020/12/08 12:03

以下のように wc コマンドで入力ファイルの行数を出力して実行し、 access.log-xxxにデータを入れたと思ってるファイルを読み込んでいるか確認してみては? touch $TMP_LOG_FILE echo ${APACHE_LOG} wc -l ${APACHE_LOG}
guest

回答1

0

自己解決

DNSの設定でサーバーに変更していなかったため、目的のアクセスログ(/c/を含むログ)がなく、csvに変換されておりませんでした。DNSの設定を変更したところ、問題なく動作しました。

投稿2020/12/14 08:08

youplus40

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問