Forum Webscript.Ru
Программирование => Perl => Тема начата: Nickolaz от 22 Ноября 2005, 12:08:44
-
Здравствуйте, многоуважаемые знатоки!
Эта тема логическое продолжение первой темы :) (http://forums.webscript.ru/showthread.php?s=&threadid=21820&msgnum=6), в решении которой очень помог NeoNox, за что ему отдельное спасибо!
Второй вопрос может покажется совсем уж простым, но тем лучше :)
Как из запущенного скрипта запустить другие скрипты по циклу, но не ожидать конца их выполнения и не получать никаких данных, а после запуска последнего завершить выполнение.
Заранее спасибо за ответ!
-
perldoc -f fork
perldoc -f exec
-
NeoNox
Спасибо за совет! Но никак не получается запустить скрипты по циклу и не ждать конца их выполнения :( Уже всё перепробовал.
Может быть у Вас есть простенький пример запуска серии скриптов без возвращения результатов в родительский скрипт?
Поясню более детально: есть скрипт, который проверяет количество (и имена) процессов, которые на текущий момент запущены, затем, отталкиваясь от этого количества, он запускает другие скрипты (каждый из которых выполняться может и 3 часа) параллельно, а сам заканчивает работу. При этом в ps отображаются все запущенные скрипты...
Вроде всё просто звучит, но никак не могу найти ответ :(
Буду беспредельно благодарен за ответ! :)
-
Nickolaz:
Но никак не получается запустить скрипты по циклу и не ждать конца их выполнения Уже всё перепробовал.
Там не нужно ничего пробовать. Покажите что уже написано.
-
наверняка что-то неправильно :(
вот код:
#!/usr/bin/perl
$SIG{CHLD}=\'IGNORE\';
for ($i=0; $i<10; $i++)
{
$pid = fork();
if ($pid eq \'0\'){
exec("perl scr.pl A$i");
exit 0;
}
}
и scr.pl (не так важно что тут - но работать это что может дооолго :) ):
open (FILE,">file-".$ARGV[0]);
print FILE $ARGV[0]."\\n";
close FILE;
for (my $i=0;$i<100;$i++)
{
print $ARGV[0]."\\n";
}
Это всё, конечно, примерно. И наверное всё неправильно :(
Очень прошу помочь!!
-
тебе, похоже, форк не очень нужен. exec сам порождает процесс.
а так?
for ($i=0; $i<10; $i++)
{
exec("perl scr.pl A$i");
}
-
# cat > test.pl
#! /usr/bin/perl
print "@ARGV\\n";
exit;
^D
# chmod +x test.pl
# perl -e \'fork () == 0 && exec "./test.pl $_" foreach (1..$ARGV[0]);\' 10
1
2
3
4
5
6
8
9
# 7
10
# perl -e \'exec "./test.pl $_" foreach (1..$ARGV[0]);\' 10
1
#
-
arto прав.
-
arto, твой код действительно подходит именно для моих задач :)
Огромное спасибо, arto и NeoNox!
Вы мне очень помогли!
Этот форум - лучший из тех что я видел!!!
:beer:
-
Сегодня праздник - узнал кое-что интересненькое, и поэтому позволю себе еще раз отвлечь arto :)
Не подскажешь, почему не работал мой код:
#!/usr/bin/perl
$SIG{CHLD}=\'IGNORE\';
for ($i=0; $i<10; $i++)
{
$pid = fork();
if ($pid eq \'0\'){
exec("perl scr.pl A$i");
exit 0;
}
}
?
-
#!/usr/bin/perl
$SIG{CHLD}=\'IGNORE\';
for ($i=0; $i<10; $i++)
{
$pid = fork();
if ($pid eq \'0\'){
exec("perl scr.pl $i");
exit 0;
}
}
scr.pl:
#!/usr/bin/perl
open FH, \'>>\', \'./aaa\';
print FH $ARGV[0]."--".$$."\\n";
close FH;
в файле ааа найдешь 10 записей типа
0--9411
1--9412
2--9413
3--9414
4--9415
5--9416
7--9418
8--9419
6--9417
9--9420
-
# perl -e \'$SIG{CHLD}="IGNORE"; foreach (0..9) { $pid = fork (); if ($pid == 0) { exec "./test.pl","A$_"; exit; }}\'
A0
A1
A2
A3
A4
A5
A6
A7
A8
# A9