1

いくつかのコマンドを実行してからマシンに telnet するスクリプトがあります。ここで、別の perl スクリプトからこのスクリプトを呼び出す必要があります。

$result = `some_script.pl`;

スクリプト some_script.pl は正常に実行されますが、スクリプトが telnet プロンプトで待機しているため、メイン スクリプトを終了できません。

some_script.pl が正常に実行されたことを確認するために、スクリプトの終了ステータスも取得する必要があります。

some_script.pl を変更できません。

some_script.pl が正常に実行された後、quit を発行する方法はありますか?

4

2 に答える 2

0

システムへの「バックティック」呼び出しを使用して実際にperlスクリプトを実行する方法が好きではありません。実際にフォーク(または同等のもの)を使用して、より制御された方法でプログラムを実行することをお勧めします。

use POSIX ":sys_wait_h";
my $pid = fork();
if($pid) { # on the parent proc, $pid will point to the child
  waitpid($pid); # wait for the child to finish      
} else { # this is the child, where we want to run the telnet
  exec 'some_script.pl'; # this child will now "become" some_script.pl
}

some_script.plが実際にどのように機能するかわからないので、ここでこれ以上お手伝いすることはできません。ただし、たとえば、some_script.plのコマンドラインに「quit」と出力するだけの場合は、別の質問で提案されているようにIPC::Open2を使用できます。次のようなことをします:

use IPC::Open2;

$pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some_script.pl');
print CHLD_IN "quit\n";
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;

これを少し調整する必要がありますが、アイデアは問題を解決するはずです。

于 2013-02-06T15:58:40.520 に答える
0

これを試してみてください。この「魔法」は標準の入力/出力/エラーを閉じ、プログラムを終了させる可能性があります。

$ result = `some_script.pl>&-2>&-<&-';

それ以外の場合は、open2を使用して、プログラム出力で特定の文字列(Done!など)を監視し、完了したら閉じることを期待できます。

http://search.cpan.org/~rgiersig/Expect-1.15/Expect.pod

よろしく

于 2013-02-06T15:21:23.843 に答える