Как запустить скрипт и не ждать его в 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-страница для примеров.