in reply to How Was My Script Run?

In principle, get your parent process id. (getppid) then interrogate that. On UNIX you can use Proc::ProcessTable or walk the /proc directory tree.
Example for Linux:
use warnings; use strict; my $ppid = getppid(); open (my $cmdfh, '<', "/proc/$ppid/cmdline") or die "Unable to open pp +id cmdline: $!"; my $cmdline = <$cmdfh>; close $cmdfh; if ($cmdline =~ /bash|ksh|csh/) { print "Started by a shell\n"; } elsif ($cmdline =~ /perl/) { print "Perl is the daddy\n"; } else { print "I was created by: $cmdline\n"; }
On Windows it is not so easy. For some reason getppid is not implemented although there are Win32 API calls which will give details of the parent process based around CreateToolhelp32Snapshot() API.

Replies are listed 'Best First'.
Re^2: How Was My Script Run?
by Anonymous Monk on Mar 15, 2011 at 10:56 UTC
    You can always do like
    $ENV{I_AM_THE_PARENT_PROCESS_ALL_MY_KIDS} = "LOVE ME"; fork ...
    Even cpan/cpanplus does this

      When I try using:

      if (-t STDIN) { $stdflag = 1; }
      I get the same result, whether I run my program from bash or if it's a spinoff from my Perl program, launched by system() or within backticks. I have no idea why, but that simply is not working on my system.

      When I use getppid() and get the command line from the /proc file system it works every time.

      What's important to me is that I have something that works so I don't have to set flags or be sure a parameter is passed on the command line. I can't use fork() to start the new process unless I make some significant changes in combining modules or USEing mods I don't want to on small daemon programs.

      But, as a point of interest, does anyone know why "-t STDIN" would still return a true when run from system() or with backticks?

      Thank you, everyone, for all the help!

        Unless you do  < NUL or some such, children might also get STDIN as tty -- i've seen it happen on win32, don't really know why, don't really care since I always rely on switches or commandline arguments, easier to debug, easier to implement, easily cross platform
Re^2: How Was My Script Run?
by TomDLux (Vicar) on Mar 15, 2011 at 19:06 UTC

    Slightly more general is to use the ps command. Unfortunately details vary on different varieties of Unix:

    68$ cat /tmp/p.pl; perl /tmp/p.pl my $ppid= getppid(); my $job = `ps -o "cmd" -p $ppid`; print $job # ----- CMD /bin/ksh

    As Occam said: Entia non sunt multiplicanda praeter necessitatem.