Вызов пакетных файлов из Perl асинхронно - PullRequest
0 голосов
/ 28 июля 2011

У меня есть пакетный файл, который будет выполнять задачи для меня. Я должен вызвать этот командный файл из моего файла PERL.

Я хочу, чтобы это называлось асинхронно. Пакетный файл задачи будет занимать много времени, и я не хочу, чтобы этот Perl-файл ожидал, пока файл Баха закончится

Это то, что я пытался для симуляции

Пакетный файл:

@ECHO off
ECHO ------Start of Batch file---------- >> C:\\temp\test.txt
Echo ------End of Batch file---------- >> C:\\temp\test.txt
pause

Причина, по которой я добавил Pause, заключается в том, чтобы моделировать айснч (Логично, что если в Async нет способа нажать enter в командном файле :-))

Мой Perl-код выглядит так

system("CreateTicket.bat");

Когда я использую system();, он ожидает, пока командный файл завершит свое выполнение

Я изменил его с помощью

"C://Work/Playground/Perl/CQ_createRTCTicket.bat"; (с галочками здесь проблема форматирования)

Это также ожидает остановки командного файла (думаю, из-за паузы)

Или, если мой подход неверен, есть ли способ симулировать этот асинхронный?

[Я не могу использовать дополнительные модули из CPAN]

Спасибо

Karthik

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Как вы заметили, system () ожидает другого процесса. Внутренне, он forks () другой процесс, который вызывает exec () для запуска вашего пакетного файла, и оригинальный процесс ждет. Если вы не можете использовать CPAN, тогда вы можете сами вызывать fork () и exec () и просто не ждать завершения дочернего процесса.

Сначала прочтите это:

Обратите внимание на бит о сигналах и процессах зомби. Как только вы поняли, как это работает, все достаточно просто.

Если ваш пакетный файл генерирует вывод, который вам нужно обработать в вашем perl, тогда вы можете использовать open () для создания канала к нему (perldoc -f open).

Подобные вопросы задавались ранее:

В чем разница между бэкиксами Perl, системой и exec?

1 голос
/ 28 июля 2011

Используйте «начало» (как предложено здесь

короткое POC:

  print 'before', "\n";
  system "start notepad.exe";
  print 'between', "\n";
  system "start wait.bat";
  print 'after', "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...