#!/usr/local/bin/perl use strict; use warnings; use threads; use Capture::Tiny qw/capture_merged/; use IO::File; use IPC::Run qw/run/; use autodie qw/open close/; use FindBin qw/$RealBin/; my $thread1 = threads->create ( \&worker, 1, 'sub1.log' ); my $thread2 = threads->create ( \&worker, 2, 'sub2.log' ); my $need_to_continue = 1; while ($need_to_continue) { print "MAIN THREAD IS PRINTING\n"; if ( $thread1->is_running() || $thread2->is_running() ) { sleep 3; } else { $need_to_continue = 0; } } $thread1->join(); $thread2->join(); exit 0; ################ sub worker { my $num = shift; my $log_file = shift; open ( my $LFH, '>', $log_file ); capture_merged { inner_worker ( $num ); } stdout=>$LFH,stderr=>$LFH; close $LFH; }; sub inner_worker { my $num = shift; print STDOUT "INFO> Some info from sub $num\n"; print STDERR "WARN> Some warn from sub $num\n"; system ("$RealBin/test_err.pl"); print STDERR "INFO> Some info from sub $num\n"; print STDERR "WARN> Some warn from sub $num\n"; };