
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に結果が書き込まれています。
この書き込まれた結果をそのままにしておけば、ブラウザにその結果も表示されます。
ですが、シェルで引数で渡す度に結果は上書きするはずなのですが、シェルが実行されている気配がありません。
なんででしょうか?教えてください。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.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);
No.2
- 回答日時:
シェルスクリプトで出力されているログファイル名とPerlで読み込んでいるログファイル名が違う気がするのですが。
何も表示されないのは"Search for $id"の部分も表示されないということですか?
あと、Content-typeの出力もないようですが。
この回答への補足
すみません。
ログファイル名を投稿用に変更したのですが、すべて変更するのを忘れていました。
本番では一致しています。
"Search for $id"部分も表示されません。
ですが、Please enter user ID は表示されるため、Content-type の問題ではない気がいたします。
アドバイスありがとうございます。
No.1
- 回答日時:
SQLを実行させるのに必要な環境変数が足りないのでしょう。
Webサーバ->perlから実行させるシェルと直接コマンドラインから実行するシェルでは環境変数が変わることに注意してください
(実行ユーザが違うため)
これを解決するには、シェルスクリプトの方にSQLを動かすのに必要な環境変数を追加してください。
(OracleならOLACLE_で始まる変数、MySqlならMYSQL_で始まる変数,etc...)
この回答への補足
ありがとうございました!
これで、ログへの反応が見ることができましたが、引数が上手く渡されません。。。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
Strawberry Perl for Windows ...
-
perlのプログラミング 部分入れ...
-
Perlでファイルの末尾から指定...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プロシージャの戻り値を取得す...
-
外部CGIの実行結果を変数内に取...
-
system関数を使用してJava実行...
-
Perlソースコードをコンパイル...
-
windowsNTのCGI
-
perl/tkを使って作ったGUIを実...
-
以下のperlのプログラムについ...
-
perlのsystem関数内でのコロン...
-
Perlで環境変数を設定するには
-
VB.NETからPerlを呼び出す
-
perlでコマンドプロンプト実行
-
perlからcを呼び出す
-
自分以外のPerl.exeを強制終了...
-
perlで 引数1を別リストの複数...
-
ActivePerl5.8で日本語を使いたい
-
バッチファイルの記述の仕方に...
-
perl拡張子in linux
-
Xサーバーのcronでcgiが自動更...
-
Perlのフレームワーク"Catalyst...
-
Perlで文字の切り出し時に起こ...
おすすめ情報