• 締切済み

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に結果が書き込まれています。 この書き込まれた結果をそのままにしておけば、ブラウザにその結果も表示されます。 ですが、シェルで引数で渡す度に結果は上書きするはずなのですが、シェルが実行されている気配がありません。 なんででしょうか?教えてください。

みんなの回答

  • bgbg
  • ベストアンサー率53% (94/175)
回答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);

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.2

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

manami921
質問者

補足

すみません。 ログファイル名を投稿用に変更したのですが、すべて変更するのを忘れていました。 本番では一致しています。 "Search for $id"部分も表示されません。 ですが、Please enter user ID は表示されるため、Content-type の問題ではない気がいたします。 アドバイスありがとうございます。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.1

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

manami921
質問者

補足

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