Изменить рабочий каталог при использовании Proc :: Background - PullRequest
2 голосов
/ 15 апреля 2011

Я использую Proc::Background для запуска определенной пользователем программы из Tk GUI, чтобы графический интерфейс не зависал из-за вызова system.Я хочу иметь возможность запускать пользовательскую программу из каталогов, которые отличаются от расположения этого сценария Perl.

Возможно ли это?Есть ли другой модуль, который я должен использовать?Я хочу

  1. Запустить процесс асинхронно.
  2. Уметь определить, запущен ли процесс.
  3. Уметь убить процесс.
  4. Поддержка Unix / Linux и Win32.
  5. Возможность указать текущий рабочий каталог процесса.

Proc::Background выполняет все эти запросы, кроме #5, по крайней мере, насколько я могу судить.

Редактировать: 22 апреля 2011
Я попробовал 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, чтобы удовлетворить мои потребности.Я добавил новую необязательную запись в хэш опций и передал хэш опций в подпрограммы _new для Win32 и Unix.Затем я могу предоставить каталог для вызова Win32 :: Process :: Create для Win32 и использовать chdir для Unix.

Ответы [ 2 ]

1 голос
/ 18 апреля 2011

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
1 голос
/ 17 апреля 2011

Наивной реализацией было бы просто использовать chdir перед тем, как запустить функцию Proc :: Background, чтобы запустить другой процесс, а затем сразу же запустить chdir.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...