OVH Cloud OVH Cloud

Question sur FORK

9 réponses
Avatar
Timothée POISOT
Bonjour

J'ai un petit probleme avec un fork :
Je cherche a tester l'ensemble des ports d'une machine de mon r=E9seau
local pour voir lesquels sont ouverts, et j'=E9cris ces resultats dans
un fichier.
Pour v=E9rifier l'ouverture, j'utilise le module IO::Socket::INET.

J'ai plac=E9 le code pour se connecter au port dans un fork, de la
mani=E8re suivante :

//DEBUT DU CODE//

my $pid;
my $socket;
for (my $i =3D $start ; $i <=3D $stop ; $i++)
{
defined($pid =3D fork) or die "Pas de fork possible : $!";
unless($pid) {
$socket =3D IO::Socket::INET->new(
PeerAddr =3D> $adresse,
Proto =3D> $proto,
PeerPort =3D> $i
) or exit(0);
$socket =3D undef;
print "OPEN : \t$i\n";
print(FIC "OPEN : \t$i\n");
exit(0);
}
# waitpid($pid, 0);
}


//FIN DU CODE//

Mon probleme : quand je lance le scan sur un petit nombre de ports,
aucun probleme, ca va meme tr=E8s vite. Mais si je veux faire des
grandes s=E9ries, j'ai une erreur ( ressources momentan=E9ment
indisponibles ) .
Donc je suis obliger de remettre le waitpid, ce qui est tr=E8s long!

Est-ce que quelqu'un =E0 une id=E9e?

Merci

9 réponses

Avatar
Nicolas George
"Timothée POISOT" wrote in message
:
Mon probleme : quand je lance le scan sur un petit nombre de ports,
aucun probleme, ca va meme très vite. Mais si je veux faire des
grandes séries, j'ai une erreur ( ressources momentanément
indisponibles ) .


Le nombre de process est limité à plusieurs niveaux (limites imposées pour
équilibrer l'usage des resources, limite globale à l'OS, limite de la
mémoire de la machine). De toute évidence, cette limite est atteinte.

Donc je suis obliger de remettre le waitpid, ce qui est très long!

Est-ce que quelqu'un à une idée?


La méthode standard, c'est de se fixer un nombre de process en parallèle :
tant qu'il y en a moins, on forke à fond, et quand la limite est atteinte on
met des waitpid pour attendre que ça se libère.

On peut faire la même chose en visant la limite elle-même, mais ce n'est pas
une bonne idée parce que ça va monopoliser toute la session, impossible de
faire quelque chose en parallèle.

Une autre possibilité encore est de ne pas forker et d'utiliser les sockets
de manière asynchrone, mais c'est plus pénible à gérer, et il y a aussi des
limites sur les file descriptors qu'un processus peut avoir. On peut
combiner les deux limites pour aller plus loin.

Ceci dit, la méthode la plus simple _et_ la plus efficace est certainement
d'installer nmap, qui fait tout ça bien mieux que n'importe quel script
perl. (Et en prime, comme dans certains modes il fait sa propre tambouille
réseau, il est moins sujet aux limites.)

Avatar
Timothée POISOT
Ouais...

Ok pour nmap, mais ca m'interessait de le faire tout seul...
Je vais essayer de jouer avec la limite des pid.

Merci
Avatar
Jacques Caron
Salut,

On Tue, 17 Jan 2006 11:51:17 +0100, Timothée POISOT""
wrote:

J'ai placé le code pour se connecter au port dans un fork


Question idiote: quel intérêt?

Jacques.
--
Oxado http://www.oxado.com/

Avatar
DoMinix
Timothée POISOT wrote:
Bonjour

J'ai un petit probleme avec un fork :
...

J'ai placé le code pour se connecter au port dans un fork, de la
manière suivante :

//DEBUT DU CODE//
...


//FIN DU CODE//

Mon probleme : quand je lance le scan sur un petit nombre de ports,
aucun probleme, ca va meme très vite. Mais si je veux faire des
grandes séries, j'ai une erreur ( ressources momentanément
indisponibles ) .
Donc je suis obliger de remettre le waitpid, ce qui est très long!

Est-ce que quelqu'un à une idée?

Merci



si tu tient a faire des fork il y a chez Merlin un bon exemple
http://www.stonehenge.com/merlyn/UnixReview/col41.html
mais comme il dit lui meme tu peut utiliser Parallel::ForkManager
pour faire ça.

--
dominix

Avatar
Timothée POISOT
Parce qu'un crash dans fork ne plante pas le script...
En gros, c'est une mesure de précaution...
Avatar
Paul Gaborit
À (at) 18 Jan 2006 07:18:35 -0800,
"Timothée POISOT" écrivait (wrote):
Parce qu'un crash dans fork ne plante pas le script...
En gros, c'est une mesure de précaution...


Mis à part un crash de perl lui-même (ce qui est très très rare et
mérite un rapport de bug auprès des développeurs de perl), on peut
toujours récupérer les erreurs d'exécution (ou traper les exceptions
comme on dit). C'est l'un des usages intéressants de la forme :

eval {...};

Ce n'est donc pas le bon argument ;-)


--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Timothée POISOT
Serait-il alors possible d'avoir le bon argument?
(outre le fait qu'il y a toujours plusieurs façons de faire une seule
tache)
Avatar
Paul Gaborit
À (at) 18 Jan 2006 13:42:52 -0800,
"Timothée POISOT" écrivait (wrote):
Serait-il alors possible d'avoir le bon argument?


C'est vous qui avez choisi d'utiliser 'fork', j'imagine donc que vous
avez des arguments justifiant ce choix. Je soulignais juste que
l'argument de la gestion des erreurs ne justifiait pas ce choix.

Je ne sais pas si vos autres arguments sont "bons" ou "mauvais". Et ne
le surtout prenez pas comme une attaque personnelle : on a tous des
"bonnes" ou "mauvaises" raisons de faire tel ou tel choix.

Personnellement, avant de choisir la solution du 'fork' (ou du
multi-thread), j'aurais jeté un oeil du côté du module Net::Ping qui
serait peut-être suffisant pour votre application...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Timothée POISOT
Je ne l'ai pas pris comme une attaque personelle, bien au contraire...
Je vais regarder ce que le module Ping propose

Merci