質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

4259閲覧

Perlでハマっています。HTTPリクエストでperl内の他perlの実行、もしくはXML返却とログ出力の同時実行

s.t.

総合スコア2021

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2016/06/09 08:18

perlの勉強中です。
あるサーバーにhoge.plを置いて、XMLをPOSTでrequestを投げ、
hoge.pl側で受け取ったPOSTのXMLの中身をfuga.logに書き込み、
responseにPOSTで来たXMLをそのまま返却しようとしています。
ログの書き込みはmakeLog.plという同じ場所に置いてあるcgiを実行することで書き込もうとしておりますが
現在、XMLの中身はまだmakeLog.plに渡しておらずとりあえずログの書き込みができる+XMLが返却されることを確認するところでハマってしまいました。

現状、Advanced REST Clientのような指定URLにPOSTでXMLを投げられるツールを利用して確認しています。
このツールでリクエストをhoge.plに投げた結果、ステータスは200でXMLもリクエストと同じものが返却されました。
しかし、fuga.logは更新されておりませんでした。

linux上でcgi-binに移動して「perl hoge.pl」を実行すると
POSTデータはないので
Content-Type: text/xmlのみの表示となりますが、fuga.logは更新されておりました。

最初hoge.plにすべて書こうとしましたが、500エラーでXML返却ができなかったので別ファイルにする方法に切り替えました。
httpd.confの
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
も変更してみましたが変わりませんでした。

httpリクエストでのperl内での他perlの実行もしくは
1ファイル内でXMLの返却+ログ出力でよい方法はないでしょうか?

【hoge.pl】
'#!/usr/bin/perl --
use LWP::UserAgent;
use strict;
use CGI;

my $q = new CGI;
my $postStr = "";
for my $param_name ($q->param) {
$postStr = $postStr . $q->param($param_name);
}

perl /var/www/cgi-bin/makeLog.pl;

print "Content-Type: text/xml\n\n";
print $postStr;

【makeLog.pl】
'#!/usr/bin/perl --
use strict;
use utf8;
use open ":utf8";
binmode STDIN, ':encoding(cp932)';
binmode STDOUT, ':encoding(cp932)';
binmode STDERR, ':encoding(cp932)';

my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
my $nowDateTime = sprintf("%04d/%02d/%02d %02d:%02d:%02d" , $year + 1900, $mon + 1, $mday, $hour, $min, $sec);

open(DATAFILE, ">> fuga.log") or die("Error:$!");
print DATAFILE $nowDateTime . "\n";

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

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

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

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

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

guest

回答2

0

500エラーのページを参照できるのであれば、
use CGI::Carp qw(fatalsToBrowser);を使って
エラーを特定してみるのが良いかも知れません。

下記ページの"Perlエラーをブラウザ・ウィンドウに表示させる"という項目に説明があります。

CGI::Carp - HTTPD(またはその他)にエラーログを書込むためのCGIルーチン - perldoc.jp
http://perldoc.jp/docs/modules/CGI-2.89/CGI/Carp.pod

確認の際は、バッククォート演算子で外部スクリプトを呼び出すと
別プロセスになってエラーが特定しにくいかも知れませんので、
別ファイルにしない状態にして動作させてみて下さい。

なお、この設定は他の人からも内部の情報が見えてしまう危険があるので、
デバッグ中だけ入れるようにした方が良いです。

投稿2016/06/09 21:04

argius

総合スコア9388

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

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

s.t.

2016/06/10 01:11

ありがとうございます!HTTPDのエラーログを見ておりませんでした。 HTTPDエラーログを見るとログファイルのパーミッションで拒否されていました。 教えていただきましたモジュールも今後活用したいと思います。 本当にたすかりました!
guest

0

ベストアンサー

fuga.log は、Webサーバーのユーザーで書き込み可能でしょうか?

所有者、パーミッションを確認してください。

投稿2016/06/09 08:55

CHERRY

総合スコア25171

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

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

s.t.

2016/06/09 09:02

ありがとうございます。パーミッションは755です。 perlファイルもすべて755にしております。
CHERRY

2016/06/09 11:28

fuga.log を 777 にしてみたら cgi から 書き込めたりしますか?
s.t.

2016/06/10 01:12

HTTPDのエラーログを見るとパーミッションで拒否されていたので教えていただいた通り777にしたら無事うごきました! ありがとうございました!
s.t.

2016/06/10 01:16

まとめ:同じコードを介したログ出力の処理でも実行元によって処理できるできないが変わるようです。 パーミッション755のファイルへの書き込みはlinuxのコマンドで直接perl hoge.plと打つと書き込みができますが、ブラウザやリクエストを投げるツールを利用した場合は777でなければ権限がないとのことでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問