Как мне получить PID процесса, который я запускаю в системе Perl ()? - PullRequest
4 голосов
/ 26 декабря 2009

Я пишу Perl-скрипт, который запускает 4 одновременных идентичных процесса с разными входными параметрами (см. Справочную информацию здесь - остальная часть моего вопроса станет намного более понятной после прочтения этого).

Я выполняю системный вызов () для программы, которая генерирует данные (XFOIL, снова см. Ссылку выше). Моя одноядерная версия этой программы выглядит так:

eval{
    local $SIG{ALRM} = sub{die "TIMEOUT"};
    alarm 250;
    system("xfoil <command_list >xfoil_output");
    alarm 0;
};

if ($@){
    # read the output log and run timeout stuff...
    system('killall xfoil') # Kill the hung XFOIL. now it's a zombie.
}

По сути, запуск XFOIL должен занимать всего около 100 секунд - поэтому через 250 секунд программа зависает (предположительно, ожидая пользовательского ввода, которого она никогда не получит).

Проблема теперь в том, что если я сделаю killall в многоядерной версии моей программы, я собираюсь убить 3 других экземпляра XFOIL, и эти процессы генерируют данные. Поэтому мне нужно убить только зависший экземпляр, а для этого нужно получить PID.

Я не очень разбираюсь в вилках и тому подобном. Из того, что я могу сказать до сих пор, я запускаю exec ('xfoil') внутри дочернего процесса, который я разветвляю. Но PID exec () будет отличаться от PID дочернего процесса (или это? Это отдельный процесс, поэтому я бы предположил, что это так, но опять же у меня нет опыта с этим ..), так что это все еще не помогает, когда я хочу принудительно убить процесс, так как у меня все равно не будет PID. Как мне это сделать?

Спасибо огромное за вашу помощь!

1 Ответ

8 голосов
/ 26 декабря 2009

Если вам нужен PID, fork выполняйте самостоятельно, а не system . Команда system в основном разработана как инструмент «запускай и забывай». Если вы хотите взаимодействовать с процессом, используйте что-то еще. См., Например, документацию perlipc .

Я думаю, что вы уже посмотрели Parallel :: ForkManager на основе ответов на ваш вопрос Как я могу заставить мой скрипт Perl использовать несколько ядер для дочерних процессов?

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