使用Proc :: Background时更改工作目录

时间:2011-04-15 14:51:23

标签: perl

我正在使用Proc::Background从Tk GUI执行用户定义的程序,以便GUI不会因system调用而冻结。我希望能够从与Perl脚本的位置不同的目录启动用户定义的程序。

这可能吗?我应该使用不同的模块吗?我想

  1. 异步运行该过程。
  2. 能够判断进程是否仍在运行。
  3. 能够杀死这个过程。
  4. 支持Unix / Linux和Win32。
  5. 能够指定流程的当前工作目录。
  6. Proc::Background履行除#5之外的所有请求,至少就我所知。

    编辑:2011年4月22日
    我根据建议尝试了Forks :: Super,但我无法正常工作。例如,我想要查看杀死/中断进程的信号。我用的是:

    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以满足我的需求。我在options hash中添加了一个新的可选条目,并将选项hash传递给Win32和Unix的_new子例程。然后我可以将目录提供给Win32的Win32 :: Process :: Create调用,并为Unix使用chdir。

2 个答案:

答案 0 :(得分:1)

一个天真的实现就是在运行Proc :: Background函数之前启动另一个进程然后立即返回chdir。

答案 1 :(得分:1)

Forks::Super v0.51支持所有这五个功能。

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