Как запустить скрипт и не ждать его в Perl?

У меня есть системный вызов в Perl, который выглядит так:

system('/path/to/utility >> /redirect/to/log file');

Но это ждет utility завершить. Я просто хочу вызвать это и позволить Perl-скрипту завершиться независимо от того, utility звонок закончен или нет.

Как я могу это сделать?

Я пытался изменить строку на

system('/path/to/utility >> /redirect/to/log file &');

но этот синтаксис все еще ожидает завершения вызова в Windows. Мне нужно, чтобы он работал на Linux и Windows.

4 ответа

Решение
if ($^O eq 'MSWin32') {
   system('start "" \\path\\to\\utility >> \\redirect\\to\\log_file');
} else {
   system('/path/to/utility >> /redirect/to/log_file &');
}

или же

if ($^O eq 'MSWin32') {
   system(1, '\\path\\to\\utility >> \\redirect\\to\\log_file');
} else {
   system('/path/to/utility >> /redirect/to/log_file &');
}

В POSIX-подобных системах проще всего использовать тот, который вы уже пробовали:

system('/path/to/utility >> /redirect/to/log_file &');

Самый простой способ заставить инструмент работать в фоновом режиме в Windows - это использовать start.exe как помощник запуска:

system('start /path/to/utility >> /redirect/to/log_file');

Однако я не знаю, работает ли он таким образом, чтобы перенаправить вывод в файл журнала, и у меня сейчас нет системы Windows для его тестирования.

Да, это означает, что вам потребуется ветвь кода в зависимости от текущей системы, но может понадобиться и другим решениям. Если ваш Perl имеет fork() эмуляция, вы можете использовать fork() в обеих системах (это немного сложнее, так как вы не можете так просто перенаправить стандартный вывод в лог-файл, сначала вы должны открыть его в Perl и сделать его стандартным дочерним потомком перед вызовом нового процесса). Если ваш Windows Perl не имеет fork() эмуляция, вам также нужна ветвь кода, так как в этом случае вы можете использовать fork() только в UNIX, и вам нужно будет использовать Win32::Process::Create с DETACHED_PROCESS вариант на винде.

Но, может быть, вы можете сначала сообщить нам, если запуск уже работает для вас. Если это не так, может быть start.exe не обрабатывает косые черты В этом случае вам может понадобиться что-то вроде

C:\\path\\to\\utility

вместо этого (двойная обратная косая черта важна! Отдельная обратная косая черта имеет особое значение в строковых литералах; это escape-символ).

Чтобы узнать, работаете ли вы в Windows или нет, взгляните на переменную $OSNAME или же $^OS, он должен сказать что-то вроде "MSWin32" на Windows.

Эта общая задача была абстрагирована в модуль CPAN Proc::Background

Вы можете попробовать посмотреть на fork ключевое слово и запустите системную команду из разветвленного процесса. Увидеть perlipc man-страница для примеров.

Другие вопросы по тегам