Kicking off multiple processes at once instead of waiting....

S

Simon

Hi guys hope you can help.

I have the following script which connects to remote machines and returns
information about the values of certain registry keys.
All is good, but the way the script runs is that it does this....
Connects to first machine.......returns data
Then connects to next machine....returns data
Then the next
Then the next and so on.

What Id like to be able to do, because we have so many machines to process,
is to do the following...

Connect to, say 10 machines all at the same time, then return data back to
the one main console (where I executed the script in the first place),
instead of waiting for 1 machine to end, then move on to the next.

Any help greatly appreciated. Here is the script.

================================================================= Script

use Win32;
use Win32::Registry;

sub RunRegQuery {

$p = 'Software\Network Associates\TVD\VirusScan Enterprise\CurrentVersion';
Win32::RegOpenKeyEx(&HKEY_LOCAL_MACHINE,$p,&NULL,&
KEY_QUERY_VALUE|&KEY_SET_VALUE,$hkey);
Win32::RegQueryValueEx($hkey,"szVirDefVer",&NULL,$ type,$Definition);
Win32::RegQueryValueEx($hkey,"szProductVer",&NULL, $type,$Product);
Win32::RegQueryValueEx($hkey,"szEngineVer",&NULL,$ type,$Engine);

print "$SystemName\n";
print "$Definition\n";
print "$Product\n";
print "$Engine\n";
print " \n";
}

##########
## MAIN ##
##########

open (Store, "< llsystems.txt") or die "can't open systems.txt: $!";
foreach $line (<Store>)
{
chomp($line);
$SystemName = $line;
if ($SystemName =~ /^l/i) {
system ("net use \\\\$SystemName\\ipc\$ "password"
/user:$SystemName\\useraccount > NUL");
sleep 3;
RunRegQuery();
system ("net use \\\\$SystemName\\ipc\$ /delete /y > 2NUL > NUL"); # Delete
previous connection
}
else {
print "not a valid system\n";
}
}
close (Store);
exit;

=================================================================== End of
script

Output is as follows..

C:\>script.pl
Lcomputer1
5060
8.0.0.912
5100
Lcomputer2
5060
8.0.0.912
5100
Lcomputer3
5060
8.0.0.912
5100

etc etc

Any help greatly appreciated guys, thank you.

S
 
Q

QoS

Simon said:
Hi guys hope you can help.

I have the following script which connects to remote machines and returns
information about the values of certain registry keys.
All is good, but the way the script runs is that it does this....
Connects to first machine.......returns data
Then connects to next machine....returns data
Then the next
Then the next and so on.

What Id like to be able to do, because we have so many machines to process,
is to do the following...

Connect to, say 10 machines all at the same time, then return data back to
the one main console (where I executed the script in the first place),
instead of waiting for 1 machine to end, then move on to the next.

Any help greatly appreciated. Here is the script.

================================================================= Script

use Win32;
use Win32::Registry;

sub RunRegQuery {

$p = 'Software\Network Associates\TVD\VirusScan Enterprise\CurrentVersion';
Win32::RegOpenKeyEx(&HKEY_LOCAL_MACHINE,$p,&NULL,&
KEY_QUERY_VALUE|&KEY_SET_VALUE,$hkey);
Win32::RegQueryValueEx($hkey,"szVirDefVer",&NULL,$ type,$Definition);
Win32::RegQueryValueEx($hkey,"szProductVer",&NULL, $type,$Product);
Win32::RegQueryValueEx($hkey,"szEngineVer",&NULL,$ type,$Engine);

print "$SystemName\n";
print "$Definition\n";
print "$Product\n";
print "$Engine\n";
print " \n";
}

##########
## MAIN ##
##########

open (Store, "< llsystems.txt") or die "can't open systems.txt: $!";
foreach $line (<Store>)
{
chomp($line);
$SystemName = $line;
if ($SystemName =~ /^l/i) {
system ("net use \\\\$SystemName\\ipc\$ "password"
/user:$SystemName\\useraccount > NUL");
sleep 3;
RunRegQuery();
system ("net use \\\\$SystemName\\ipc\$ /delete /y > 2NUL > NUL"); # Delete
previous connection
}
else {
print "not a valid system\n";
}
}
close (Store);
exit;

=================================================================== End of
script

Output is as follows..

C:\>script.pl
Lcomputer1
5060
8.0.0.912
5100
Lcomputer2
5060
8.0.0.912
5100
Lcomputer3
5060
8.0.0.912
5100

etc etc

Any help greatly appreciated guys, thank you.

S

Just use Threads
 
J

Joe Schaefer

Simon said:
What Id like to be able to do, because we have so many machines to
process, is to do the following...

Connect to, say 10 machines all at the same time, then return data
back to the one main console (where I executed the script in the first
place), instead of waiting for 1 machine to end, then move on to the
next.

Any help greatly appreciated. Here is the script.

================================================================= Script

use Win32;
use Win32::Registry;

[...]

system ("net use \\\\$SystemName\\ipc\$ "password"
/user:$SystemName\\useraccount > NUL");
sleep 3;
RunRegQuery();
system ("net use \\\\$SystemName\\ipc\$ /delete /y > 2NUL > NUL"); # Delete
previous connection

What you want to do sounds fine, but personally I don't think you're
asking the right question. What you should be asking is "How do I get
rid of these system() calls in my script?", because there's no way
to parallelize your script without doing at least that.

If I were you, I'd be looking over the Win32::Registry documentation
for a way to directly connect to a remote registry. If you can figure
out how to do that, you should be able to access the repository by
calling a suitably modified version of

RunRegQuery($SystemName);

without ever needing to make those calls to system() and sleep().

If it turns out *that* script isn't fast enough, at that point people
will be able to give you advice on how to parallellize it like you
have originally asked.
 
S

Simon

Thanks Joe..much appreciated.

I do know Joe how to connect to a remote registry.

I spose what Im trying to do, but cant get myself on some really really
simple examples, so i can play with them, are example scripts on how to fork
a process.
Ive looked at the perldoc but I find the doco not as clear as some good
beginner fork examples so I can test them out on my systems, then gain
confidence that way.

Appreciate your help. :)

Joe Schaefer said:
Simon said:
What Id like to be able to do, because we have so many machines to
process, is to do the following...

Connect to, say 10 machines all at the same time, then return data
back to the one main console (where I executed the script in the first
place), instead of waiting for 1 machine to end, then move on to the
next.

Any help greatly appreciated. Here is the script.

================================================================= Script

use Win32;
use Win32::Registry;

[...]

system ("net use \\\\$SystemName\\ipc\$ "password"
/user:$SystemName\\useraccount > NUL");
sleep 3;
RunRegQuery();
system ("net use \\\\$SystemName\\ipc\$ /delete /y > 2NUL > NUL"); #
Delete
previous connection

What you want to do sounds fine, but personally I don't think you're
asking the right question. What you should be asking is "How do I get
rid of these system() calls in my script?", because there's no way
to parallelize your script without doing at least that.

If I were you, I'd be looking over the Win32::Registry documentation
for a way to directly connect to a remote registry. If you can figure
out how to do that, you should be able to access the repository by
calling a suitably modified version of

RunRegQuery($SystemName);

without ever needing to make those calls to system() and sleep().

If it turns out *that* script isn't fast enough, at that point people
will be able to give you advice on how to parallellize it like you
have originally asked.
 
Q

QoS

Simon said:
Hi QoS,

Thanks for your input.

Do you mean the module Threads?


[snip]
Connect to, say 10 machines all at the same time, then return data back
to
the one main console (where I executed the script in the first place),
instead of waiting for 1 machine to end, then move on to the next.

Any help greatly appreciated. Here is the script.
[snip]
Any help greatly appreciated guys, thank you.

S

Just use Threads

Yeah have a look at:
perldoc perlthrtut
and
perldoc Threads
and
perldoc Threads::Shared

HtH

J
 
S

Simon

Thanks QoS...appreciate it mate.

Hi QoS,

Thanks for your input.

Do you mean the module Threads?


<[email protected]>

[snip]
Connect to, say 10 machines all at the same time, then return data
back
to
the one main console (where I executed the script in the first place),
instead of waiting for 1 machine to end, then move on to the next.

Any help greatly appreciated. Here is the script.
[snip]
Any help greatly appreciated guys, thank you.

S

Just use Threads

Yeah have a look at:
perldoc perlthrtut
and
perldoc Threads
and
perldoc Threads::Shared

HtH

J
 
M

Mark Clements

Simon wrote:
Thanks Joe..much appreciated.

I do know Joe how to connect to a remote registry.

I spose what Im trying to do, but cant get myself on some really really
simple examples, so i can play with them, are example scripts on how to fork
a process.
Ive looked at the perldoc but I find the doco not as clear as some good
beginner fork examples so I can test them out on my systems, then gain
confidence that way.

Appreciate your help. :)

You could look at Parallel::ForkManager - it may make things easier for
you.

Mark
 
S

Simon

Thank you Mark...really appreciate it.

Mark Clements said:
Simon wrote:


You could look at Parallel::ForkManager - it may make things easier for
you.

Mark
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,902
Latest member
Elena68X5

Latest Threads

Top