こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PERLからcshellを実行したいのですが

PERLからcshellを実行したいのですが、UNIXのコマンドラインから直接実行すると上手く行くのですが、ブラウザからでは欲しい結果が表示されず、ログにも何も残りません。

$ret = system ("/bin/csh /home/my47143/.www/test.csh $argv1");
#$ret = 265/ 265 = 1

戻り値は1、いろいろ調べてみてLANG をCに指定して、パーミションも全て777にしてあります。

シェルの内容は、SQLをしてその結果をtest.logに書き込み、後に同じCGIの中で読み込み標準出力をしています。

open( TEXTFILE, "<test.log" );
$line = <TEXTFILE>;
print $line;
@lines = <TEXTFILE>;
foreach ( @lines ) {
print $_;
}
close( TEXTFILE );

コマンドラインから実行すれば、ちゃんとtest.logに結果が書き込まれています。
この書き込まれた結果をそのままにしておけば、ブラウザにその結果も表示されます。
ですが、シェルで引数で渡す度に結果は上書きするはずなのですが、シェルが実行されている気配がありません。
なんででしょうか?教えてください。

投稿日時 - 2006-07-05 21:13:21

QNo.2257879

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

すみません。原因は違うところにあるようですね。

my $ret = system($command) or error ( $!, "Cannot access!");

これはsystem関数の戻り値、すなわち$retが0または未定義の時error関数に入るという処理です。
system関数が正常に終了したときの戻り値は0なので、シェルスクリプトが正常に終了すると全部エラーとなってしまう、というミスのようです。
次のようにしてみてください。

my $ret = system($command);
error ( $!, "Cannot access!") if($ret != 0);

投稿日時 - 2006-07-07 18:01:49

ANo.2

シェルスクリプトで出力されているログファイル名とPerlで読み込んでいるログファイル名が違う気がするのですが。
何も表示されないのは"Search for $id"の部分も表示されないということですか?
あと、Content-typeの出力もないようですが。

投稿日時 - 2006-07-07 10:31:18

補足

すみません。
ログファイル名を投稿用に変更したのですが、すべて変更するのを忘れていました。

本番では一致しています。

"Search for $id"部分も表示されません。
ですが、Please enter user ID は表示されるため、Content-type の問題ではない気がいたします。

アドバイスありがとうございます。

投稿日時 - 2006-07-07 13:01:41

ANo.1

SQLを実行させるのに必要な環境変数が足りないのでしょう。
Webサーバ->perlから実行させるシェルと直接コマンドラインから実行するシェルでは環境変数が変わることに注意してください
(実行ユーザが違うため)
これを解決するには、シェルスクリプトの方にSQLを動かすのに必要な環境変数を追加してください。
(OracleならOLACLE_で始まる変数、MySqlならMYSQL_で始まる変数,etc...)

投稿日時 - 2006-07-06 09:54:20

補足

ありがとうございました!
これで、ログへの反応が見ることができましたが、引数が上手く渡されません。。。

CGI スクリプト
============================

#!/opt/perl/5.8.0/bin/perl

BEGIN { $ENV{LANG}='C';
$ENV{SYBASE} = '/home/sb/OCS125_1.0/32';
$ENV{SYBASE_OCS} = 'OCS-12_5';
$ENV{LD_LIBRARY_PATH} = "$ENV{SYBASE}/$ENV{SYBASE_OCS}/lib";
}

use CGI qw(:standard);
use CGI::Carp qw/fatalsToBrowser/;
use strict;

my $query = new CGI;
my $id = $query->param('id');

&print_head;
if ($query->param('submitted')){
&display;
} else {
print "ERROR";
}
&print_foot;

sub print_head{

print <<EOF;

<html>
<head><title>JT3 User Account Status</title></head>
<body>
<form name="Form1">
<input type="hidden" name="submitted" value="yes">
UserId:<input type="text" name="id"><input type=submit>
</form>
EOF
}

sub display{
#$id = "my47143";
my $command = "/bin/csh /home/tfastweb/.www/jt3_sp_display/jt3_lock.csh $id"; #引数$idが上手く渡されない。空で出すと Please enter UserId が出てきてくれるが、ちゃんとしたIDを登録すると何も表示されない。
my $ret = system($command) or error ( $!, "Cannot access!");
print "$ret\n"; #ret = 256/256 = 1
print "Search for: $id<br><br>";
open( TEXTFILE, "<jt3.log");
my $line = <TEXTFILE>;
print $line;
my @lines = <TEXTFILE>;
foreach ( @lines) {
print $_;}
close (TEXTFILE);}

sub print_foot{

print <<EOF;

</body>
</html>
EOF
}

exit;


シェルスクリプト
=========================================
#!/bin/csh

source setenv.csh
setenv LOG_NAME ~tweb/.www/test.log

if ($#argv == 0) then
echo "Please enter UserId"
exit 1
endif

isql -S$DBQUERY -U$DBID -P$DBPW -X << SQL >! $LOG_NAME
sp__displaylogin $argv[1]
go
SQL
cat $LOG_NAME
exit 0

投稿日時 - 2006-07-06 20:09:41

あなたにオススメの質問