0

非常に奇妙なエラーが発生しています。

Linuxコマンドを実行するperlスクリプトを実行します。これらは次のように実行されます。

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`;
myLog("$err");

また、$ errは空です。これは、コマンドが返されず、エラーが発生したことを意味します。(右?)

exec ""またはsystem()を使用してLinuxコマンドを実行しようとしましたが、成功しませんでした。パスを変更してみました。同じ。

また、新しいperlスクリプトでcpコマンドのみを実行しようとしました。できます。しかし、私の完全なperlスクリプトにはありません。

このperlスクリプトでは、一部のコマンドが機能しているものと機能していないものがあります。

スクリプトは昨日機能していましたが、今朝は機能していません。その間、変更はありません。

いろいろ試してみましたが、誰かアイデアがあれば嬉しいです。

編集:サーバーには多くのプロセスが終了していませんでした。それらを掃除することで問題は解決しました。したがって、問題は別のアプリケーションに関連していますが、コメントのおかげでロギングを改善します。

4

3 に答える 3

5

小さな問題: STDERRをキャプチャしていないため、エラーは表示されません($?リターンコードもチェックしていません)。

やったほうがいい

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;

STDERRをSTDOUTにリダイレクトするか、コマンドを実行するためにモジュールの1つを使用します。


大きな問題:

Perlネイティブモジュールが存在するPerlからシステムコマンドを実行しないでください。この場合:File::Copy::Recursiveモジュール。

からコピーした独自のディレクトリをロールすることもできますFile::Copy

于 2012-02-28T11:01:17.077 に答える
1

バックティックを使用していますか?cpコマンドに-vを追加して、STDOUTに何かを表示し、STDERRをSTDOUTにリダイレクトして、STDERRのエラーメッセージではなくcmd出口コードを確認します。

実行直後にコマンド出力を出力するのはどうですか?

my $err = `cp -rv $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`;
my $exitcode = $? >> 8;
warn "Output: $err\nexitcode: $exitcode\n";

qxを使用することをお勧めします。これを確認してください: http: //www.perlmonks.org/?node_id = 454715

于 2012-02-28T11:00:49.840 に答える
0

スペースを含むシェルの特殊文字を含む可能性のある引数を引用することもできます。シェルは指定された文字列に対して単語分割を行うため$HTML、スペースcpが含まれていると、予想よりも多くの引数が取得されます。Perlには、そのための非常に単純なメカニズムがあります\Q\E。これがあなたのやり方です:

my $err = `cp -r \Q$HTML\E \Q/tssobe/www/tstweb/$subpath/$HTMLDIR1\E 2>&1`;

英数字以外は、シェルに渡す前にバックスラッシュでエスケープされます。cpそして、それらの変数に何が含まれているかに関係なく、に正確に2つの引数を指定します。

于 2014-06-05T02:51:22.967 に答える