Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Как в скрипте запусить несколько процессов


Автор: study 1.11.2004, 11:02
Народ, подскажите мне пожалуйста, как мне в скрипте запустить несколько, одновременно выполняющихся программ, и если какая-то затянулось, то убить её (программу). Если можно пример или ссылку, где можно почитать как это делается. Заранее спасибо.

Автор: chaos 1.11.2004, 12:31
почитай про fork()
Добавлено @ 12:38
Вот не большой пример
Код
$pid = fork;
if ($pid == -1) {print "Error fork"; die;}
if ($pid != 0) {exit;}
$pid=setsid;
if ($pid == -1) {die "Error setsid";}

Автор: study 1.11.2004, 12:57
chaos, я попробовал сделать что-то с fork(), но я не разобрался, дай ссылку где про fork() написанно. Смотри, мне в цикле надо считывать строку из файла и запустить процесс. Я сделал все с помощью system(), всё хорошо работает, но слишком долго :( , теперь мне надо разделить, чтобы, например из файла считать 10 строк и сразу запустить 10 процессов, как это сделать :qstn

Автор: chaos 1.11.2004, 13:28
Цитата(study @ 1.11.2004, 12:57)
chaos, я попробовал сделать что-то с fork(), но я не разобрался, дай ссылку где про fork() написанно. Смотри, мне в цикле надо считывать строку из файла и запустить процесс. Я сделал все с помощью system(), всё хорошо работает, но слишком долго :( , теперь мне надо разделить, чтобы, например из файла считать 10 строк и сразу запустить 10 процессов, как это сделать :qstn

а что за процессы? Ты наверное имеешь в виду другие программы, имена каторых ты читаешь в файли или чтьо?

Автор: study 1.11.2004, 14:12
chaos запускается программа, а в файле входные данные к программе. Программа должна запускаться, например, 50 раз (зависит от строк в файле), из-за этого скрипт работает долго. Мне надо, чтобы я мог считать из файла, например, 10 строк и одновременно запустить 10 программ.

Автор: chaos 1.11.2004, 14:25
Цитата(study @ 1.11.2004, 14:12)
chaos запускается программа, а в файле входные данные к программе. Программа должна запускаться, например, 50 раз (зависит от строк в файле), из-за этого скрипт работает долго. Мне надо, чтобы я мог считать из файла, например, 10 строк и одновременно запустить 10 программ.

а че тебя не устраивает 10 раз вызвать system?

Автор: Nobody 1.11.2004, 16:00
study

Код
#!/usr/bin/perl -w
use strict;
use vars qw($pid $i @programs);
@programs = (
'/path/to/prog1',
'/path/to/prog2',
'/path/to/prog3',
'/path/to/prog4',
);
for ($i = 0; $programs[$i]; $i++) {
if (!defined ($pid = fork())) {
 die "cannot fork: $!";
} elsif ($pid == 0) {
 exec ($programs[$i]);
}
}


А теперь замени жёстко заданный список программ на то, что ты читаешь из файла.

Автор: study 1.11.2004, 16:18
Спасибо Nobody, попробую, а как мне узнать как завершилась программа? exec(), что-нибудь возвращает?
И если можно подскажи, как мне убить прогу, если она не завершилась в течение 10 секунд.

Автор: chaos 1.11.2004, 16:23
Цитата(Nobody @ 1.11.2004, 16:00)
study

Код
#!/usr/bin/perl -w
use strict;
use vars qw($pid $i @programs);
@programs = (
'/path/to/prog1',
'/path/to/prog2',
'/path/to/prog3',
'/path/to/prog4',
);
for ($i = 0; $programs[$i]; $i++) {
if (!defined ($pid = fork())) {
 die "cannot fork: $!";
} elsif ($pid == 0) {
 exec ($programs[$i]);
}
}


А теперь замени жёстко заданный список программ на то, что ты читаешь из файла.

Я считаю что в данном случае system'а за глаза хватит, fork хорошо бы сгодился если бы надо было бы хапускать несколько копий одного приложения

Автор: study 1.11.2004, 16:26
Цитата(chaos @ 1.11.2004, 14:25)

а че тебя не устраивает 10 раз вызвать system?


потому что system() ждёт завершения программы, а мне нужно одновременно сразу несколько запустить, чтобы ускорить процесс.

Автор: study 3.11.2004, 13:18
Nobody, подскажи мне. Как отслеживать, если выполнение exec() затянулось, то как мне завершить этот процесс.

Автор: lockdock 11.11.2004, 15:23
man wait

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)