Shantesh
Shantesh

Reputation: 1600

Executing a multiple indefinite perl script within another perl script

My intention is to execute long.pl perl script with different path as an argument and since long.pl has indefinite loop such that in the main script it does not come to second path. I thought to use fork for doing it, but I'm not sure whether it will solve my problem or not!

Some information on the method of achieving the task would be helpful, and please let me know if you need any clarification on the problem statement.

#!/usr/bin/perl
use strict;
use warnings;

print localtime () . ": Hello from the parent ($$)!\n";

my @paths = ('C:\Users\goudarsh\Desktop\Perl_test_scripts','C:\Users\goudarsh\Desktop\Perl_test_scripts/rtl2gds'); 
foreach my $path(@paths){
    my $pid = fork;
    die "Fork failed: $!" unless defined $pid;
    unless ($pid) {
        print localtime () . ": Hello from the child ($$)!\n";
        exec "long.pl $path";  # Some long running process.
        die "Exec failed: $!\n";
    }
}

long.pl

#!/usr/bin/perl
use strict;
use warnings;
while(1){
    sleep 3;
    #do some stuff here 
}

Upvotes: 2

Views: 250

Answers (1)

7stud
7stud

Reputation: 48599

Example run:

$ perl my_forker.pl
Done with other process.
Done with long running process.
Done with main process.

The following files must have executable permissions set:

long_running.pl:

#!/usr/bin/env perl

use strict;
use warnings;
use 5.020;

sleep 5;
say 'Done with long running process.';

other_process.pl:

#!/usr/bin/env perl

use strict;
use warnings;
use 5.020;

sleep 3;
say "Done with other process."

my_forker.pl:

use strict;
use warnings;
use 5.020;

my @paths = (
    './long_running.pl',
    './other_process.pl',
);

my @pids;

for my $cmd (@paths) {

    defined (my $pid = fork()) or die "Couldn't fork: $!";

    if ($pid == 0) { #then in child process
        exec $cmd;
        die "Couldn't exec: $!";  #this line will cease to exist if exec() succeeds
    }
    else {  #then in parent process, where $pid is the pid of the child
        push @pids, $pid;
    }

}

for my $pid (@pids) {
    waitpid($pid, 0)  #0 => block
}

say "Done with main process.";

Upvotes: 2

Related Questions