-1

親 perl スクリプトから [system(Start コマンド) を使用して] 新しい独立した Perl スクリプトを開始しています。子スクリプトの PID を 1 つのファイルに書き込み、それを親スクリプトで読み取って、子プロセスを終了したいときはいつでもその PID を使用して簡単に強制終了できるようにします。

しかし、子スクリプトから子プロセス ex system("somebatchfile) を使用して別のバッチ ファイルを呼び出しています。ここで PID が変更され、バッチ ファイルが作業を終了するまで閉じることができません。PID を取得できません。 fork 関数を使用してみましたが、とにかくバッチ ファイルを呼び出すと、独自の別の PID が作成されます。

私のコードは次のとおりです。

親スクリプト: 新しいスクリプトを開始し、PID を読み取り、必要に応じて開始されたスクリプトを強制終了します。

子スクリプト:

open(PID,">PID_Value.txt");
print PID "\$Process_id=$$"; # write the PID of child script
close(PID);
system("somebatch file name"); # I am using Windows 7
4

2 に答える 2

2

代わりに pid をファイルに追加するのはどうですか?

open(PID, ">>PID_Value.txt");
print PID "$$\n";
close(PID);

そうすれば、他のpidを上書きすることはありません。

fork()または、 andを使用しexec()て子プロセスを生成することもできます。その後、親は子の pid を直接取得します。

my $pid = fork();
die "fork failed: $!" unless defined($pid);
if ($pid) {
  push(@child_pids, $pid); # parent executes this
} else {
  # child executes here
  exec("somebatch file name")
    or die "failed to exec somebatch file name: $!";
}

これは Unix 流の方法です。ただし、Windows 7 で Cygwin perl を使用している場合Win32::Process::Create(...)は、実際の Windows プロセスが作成されるため、Cygwin perl も使用することをお勧めします。

于 2012-09-11T13:24:58.530 に答える
1

バッチ処理を実行する別のプロセスを作成する子プロセスを作成しているため、バッチコードを変更できないと仮定すると、バッチプロセスを選択的に強制終了する唯一の方法は、実行中のすべてのプロセス名を反復処理することだと思います( Win32::Process::Info) を使用してバッチの PID を識別し、それを強制終了します。

于 2012-09-11T15:21:34.540 に答える