Как зафиксировать состояние успеха / сбоя рабочего процесса PowerCenter в среде PERL с помощью командной строки pmcmd? - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь запустить рабочий процесс Informatica PowerCenter с помощью команды pmcmd из Strawberry Perl. Я не работаю в случае каких-либо ошибочных данных, полученных в исходных файлах. После сбоя в рабочем процессе PowerCenter я хочу отправить электронное письмо из сценария Perl (а не из задачи «Пост сеанс» в свойствах сеанса). Помогите, пожалуйста, в получении статуса рабочего процесса из perl-скрипта. Я очень ценю ваше время и помощь.

Я пробовал несколько вариантов, таких как использование system (), qw (), IPC :: Run3, IPC :: System :: Simple qw (system) и т. Д., Но все же я невозможность зафиксировать успех или неудачу выполнения рабочего процесса. Я также знаю о деталях getworkflow pmcmd, но это будет мой последний вариант.

use strict;
use warnings;
use IPC::Run3;

use IPC::System::Simple qw(system);
my ($stdout, $stderr,$command,$run);

$command = "pmcmd.exe startworkflow -sv......." # not putting the complete command as it is very lengthy
$run = run3($command);

if ( $run == 0) {
print "success";
} else {
print "fail ";
}

У меня есть 2 рабочих процесса, 1 сбои и 1 успешный запуск. Но какой бы вариант я ни пробовал, он дает одинаковый результат как для выполнения рабочего процесса.

Ответы [ 2 ]

2 голосов
/ 17 октября 2019

Каждый из этих методов по-разному указывает на успешность, и есть также два разных типа успешности: успешно ли он выполняется, и статус завершения, возвращаемый процессом.

IPC :: System:: Simple system сгенерирует исключение, если команда не выполнится или вернет ненулевой статус. Вы можете определить приемлемые ненулевые состояния, передавая arrayref в качестве первого аргумента. Проще всего, когда вы хотите, чтобы ошибки приводили к смерти вашей программы с полезным сообщением об ошибке, поэтому вам не нужно обрабатывать какие-либо исключения, такие как eval или try / catch.

use strict;
use warnings;
use IPC::System::Simple qw(system EXIT_ANY);

system $cmd; # failure or non-zero exit will cause program to die

my $exit = system EXIT_ANY, $cmd; # failure to execute will cause program to die

use Syntax::Keyword::Try;
try {
  system $cmd;
} catch {
  # error in $@
}

try {
  my $exit = system [0..5], $cmd;
  if ($exit) {
    # one of the allowed non-zero exit status
  }
} catch {
  # error in $@
}

try {
  my $exit = system EXIT_ANY, $cmd;
  if ($exit) {
    # non-zero exit status
  }
} catch {
  # error starting command in $@
}

IPC:: Run3 вызовет исключение в случае сбоя команды и установит $? в состояние ожидания. Его возвращаемое значение всегда истинно.

use strict;
use warnings;
use IPC::Run3;
use Syntax::Keyword::Try;

try {
  run3 $cmd;
  if ($?) {
    # non-zero exit status
    my $exit = $? >> 8;
  }
} catch {
  # error starting command in $@
}

qx или обратные кавычки, являющиеся оператором readpipe , не вызовут исключение, но вернут undef, если команда не запустилась, ив противном случае установите $? так же, как IPC :: Run3.

use strict;
use warnings;

my $output = `$cmd`;
if (!defined $output) {
  # error occured starting command, check $!
} elsif ($?) {
  # non-zero exit status
  my $exit = $? >> 8;
}

Встроенная функция system вернет состояние ожидания или -1, если команда не запустиласьи установите то же значение в $?.

use strict;
use warnings;

system $cmd;
if ($? == -1) {
  # error occured starting command, check $!
} elsif ($?) {
  # non-zero exit status
  my $exit = $? >> 8;
}

Обратите внимание, что все эти параметры, кроме оператора readpipe (но см. мой IPC :: ReadpipeX ), поддерживают передачу командыв виде списка, который обходит оболочку и, таким образом, безопаснее, когда команда может содержать произвольный ввод, но иногда может содержать ошибки в Windows, так как она только притворяется, что обходит оболочку там.

system 'pmcmd.exe', 'startworkflow', '-sv', ...;
run3 ['pmcmd.exe', ...];
1 голос
/ 17 октября 2019

Спасибо, Гриннц, за ваше время и объяснения! Это действительно помогло, насколько мне известно. На мой вопрос проблема была с моей командой pmcmd. Мне не хватало опции -wait для использования в качестве аргумента. Следовательно, команда pmcmd просто возвращала общий код ошибки, равный 0. После использования -wait я мог зафиксировать состояние сбоя рабочего процесса. Еще раз спасибо !

Для тех, кто сталкивается с той же проблемой, вот полная команда, которую я использую:

pmcmd.exe startworkflow -sv <integrationservice> -d <domain> -u <user> -p <pwd> -f <folder name> -paramfile <parameter file name> -wait <workflow name>

...