2011-04-15 10 views
2

Proc::Backgroundを使用して、system呼び出しのためにGUIがフリーズしないように、Tk GUIからユーザ定義プログラムを実行しています。私はこのPerlスクリプトの場所とは異なるディレクトリからユーザー定義のプログラムを起動できるようにしたい。Proc :: Background使用時に作業ディレクトリを変更する

これは可能ですか?私が使用するはずの別のモジュールはありますか?私はしたい

  1. プロセスを非同期に実行します。
  2. プロセスがまだ実行中かどうかを知ることができます。
  3. プロセスを強制終了できます。
  4. Unix/LinuxとWin32の両方をサポートします。
  5. プロセスの現在の作業ディレクトリを指定できること。

Proc::Backgroundは、少なくとも私が知る限り、#5を除くすべての要求を満たしています。

編集:2011年4月22日
は私が提案につき、フォーク::スーパーを試してみましたが、私は物事が正常に働いて得ることができませんでした。例えば、私はシグナルを殺す/プロセスを中断するのを見たいと思う。私は次のようなものを使用します:

my $pid = fork { dir => $my_dir, cmd => [ $my_cmd, $my_args ] }; 
my $ProcessObj = Forks::Super::Job::get($pid); 
while($ProcessObj->is_active()) { 
    if($run_cmd_die == 1) { 
     $ProcessObj->kill(1); 
    } 
} 

これは決してwhileループから抜けることはありません。

私の最終的な解決策は、私のニーズを満たすようにProc::Backgroundを変更することでした。私はオプションのハッシュに新しいオプションのエントリを追加し、オプションのハッシュをWin32とUnixの_newサブルーチンに渡しました。次に、Win32用のWin32 :: Process :: Create呼び出しにディレクトリを提供し、Unix用にchdirを使用することができます。

+0

[ 'フォーク:: Super'は](http://search.cpan.org/perldoc?Forks::Super)のいずれか#5を行うことはできませんが、私は他にあり – mob

+0

それを追加しますあなたが維持しているモジュールに必要な機能を追加する機能はありますか?それはサービスです! –

答えて

1

純粋な実装では、proc :: Background関数を実行して他のプロセスを開始してからすぐにchdirを戻す前にchdirするだけです。

+0

これはUnix/Linuxでも動作するかもしれませんが、Windowsではバックグラウンドプロセスをフォークするときに、スクリプトの作業ディレクトリに初期化された独自の作業ディレクトリがあります。 – RyGuyinCA

1

Forks::Super v0.51は、これらの5つの機能すべてをサポートしています。

use Forks::Super; 

# launch $command $arg1 $arg2 in background, starting from dir $directory 
$pid = fork { dir => $directory, cmd => [ $command, $arg1, $arg2 ], ... }; 

# check if process is still running 
if (! $pid->is_complete) { ... } 

# kill a process. Straightforward on UNIX, DWIM on Win32 
$num_signalled = kill 'TERM', $pid; 
$pid->kill($signal);     # alternate 
関連する問題