#!perl use strict; use warnings; use if ($^O eq 'MSWin32'), 'Win32::Getppid'; my $parent; my $invoker; BEGIN{ if ($^O eq 'MSWin32') { $parent = getppid; open my $cmd,"tasklist /nh /FI \"PID eq $parent\" |" or die; while (<$cmd>){ chomp; next if /^$/;# yes it outputs a leading empty line.. $invoker = $1 if /^([\w\d\.]+)\W/; } } else { $parent = getppid; open my $cmd,"ps -p $parent|" or die; while (<$cmd>){ chomp; next if /^[\sA-Z]+$/;# get rid of heaader: freebsd does not support no header output $invoker = $1 if /\s([\w\d\.]+)$/; } } } print "Perl (PID $$) was invoked from PID $parent ($invoker)\n"; #### cmd.exe>perl who_called_Perl.pl Perl (PID 17400) was invoked from PID 10576 (cmd.exe) powershell> perl.exe who_called_Perl.pl Perl (PID 18212) was invoked from PID 11272 (powershell.exe) bash$ perl who_called_perl.pl Perl (PID 73288) was invoked from PID 31994 (bash)