use strict; use warnings; use threads; use threads::shared; main(); sub main { my @arr = ( 'ssh user@host rm -rf /cygdrive/mobile', 'ssh user@host mkdir /cygdrive/mobile', ); foreach my $key(@arr) { my $path = '/home/tart/tmp/'; execute($path, $key); } } sub execute { my $path = shift; my $cmd = shift; chdir($path) || die"Cant change patch $path\n"; my $done :shared = 0; my @out; async { @out = `$cmd &`; if($?) { print "Error: $cmd\n"; } $done = 1; }->detach; until($done) { for(1 .. 20 ) { sleep 1; last if $done; } verbose($cmd); } print "@out\n"; } sub verbose { my $cmd = shift; print "Still executing: $cmd\n"; }