How can I make Perl wait for child processes started in the background with system()?

前端 未结 3 2223
醉梦人生
醉梦人生 2021-02-14 10:41

I have some Perl code that executes a shell script for multiple parameters, to simplify, I\'ll just assume that I have code that looks like this:

for $p (@a){
           


        
3条回答
  •  猫巷女王i
    2021-02-14 10:55

    You are going to have to change something, changing the code to use fork is probably simpler, but if you are dead set against using fork, you could use a wrapper shell script that touches a file when it is done and then have your Perl code check for the existence of the files.

    Here is the wrapper:

    #!/bin/bash
    
    $*
    
    touch /tmp/$2.$PPID
    

    Your Perl code would look like:

    for my $p (@a){
        system("/path/to/wrapper.sh /path/to/file.sh $p &");
    }
    while (@a) {
        delete $a[0] if -f "/tmp/$a[0].$$";
    }
    

    But I think the forking code is safer and clearer:

    my @pids;
    for my $p (@a) {
        die "could not fork" unless defined(my $pid = fork);\
        unless ($pid) { #child execs
            exec "/path/to/file.sh", $p;
            die "exec of file.sh failed";
        }
        push @pids, $pid; #parent stores children's pids
    }
    
    #wait for all children to finish
    for my $pid (@pids) {
        waitpid $pid, 0;
    }
    

提交回复
热议问题