Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Who called Perl?

by Discipulus (Monsignor)
on Mar 02, 2015 at 08:25 UTC ( #1118371=perlquestion: print w/replies, xml ) Need Help??
Discipulus has asked for the wisdom of the Perl Monks concerning the following question:

Hello monks, I asked yet this in chat and i'm almost convinced there is no answer but..
as we say in my country ask is free so:

Perl has some knoweledge about who called him? It must be some shell in all Linux flavours (bash, csh, ksh..) or in win32 the stupid cmd.exe, or maybe another modified shell-like program (Console2, powershell.. ).

Once Perl has started I can easily make a system call to get description of the PID using $$ but i'd like to investigate the parent of such PID.

Any ideas?
L*


There are no rules, there are no thumbs..
Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

Replies are listed 'Best First'.
Re: Who called Perl?
by Corion (Pope) on Mar 02, 2015 at 08:59 UTC

    You can use getppid resp. Win32::Getppid to find the PID of the parent process. This is not necessarily a shell, because Perl and other programs can also launch Perl directly without an intervening shell.

Re: Who called Perl?
by Anonymous Monk on Mar 02, 2015 at 09:01 UTC
Re: Who called Perl?
by Anonymous Monk on Mar 02, 2015 at 09:34 UTC
    On Linux it's
    $ perl -E 'my $parent = getppid(); open my $fh, "<", "/proc/$parent/comm"; print <$fh>' bash
    The proc directory has a number of other interesting files.

      ... with the caveat that orphaned processes get adopted by init (process 1). Might want to test for that.

      Also, there's a potential for race in there.

Re: Who called Perl? (solved)
by Discipulus (Monsignor) on Mar 02, 2015 at 12:54 UTC
    Thanks to you all monks, named or unnamed ones.
    I putted the pieces togheter and this was the result (ugly code I know, the command parsing over other things):
    #!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 no +t support no header output $invoker = $1 if /\s([\w\d\.]+)$/; } } } print "Perl (PID $$) was invoked from PID $parent ($invoker)\n";
    It outputs the correct thing in 3 different test cases:
    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)

    L*
    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1118371]
Approved by Athanasius
Front-paged by Arunbear
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (2)
As of 2018-01-21 10:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    How did you see in the new year?










    Results (227 votes). Check out past polls.

    Notices?