Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I quickly find the user's terminal PID in Perl?

Tags:

terminal

perl

pid

The following snippet of code is used to find the PID of a user's terminal, by using ptree and grabbing the third PID from the results it returns. All terminal PID's are stored in a hash with the user's login as the key.

   ## If process is a TEMINAL.
   ## The command ptree is used to get the terminal's process ID.
   ## The user can then use this ID to peek the user's terminal.
   if ($PID =~ /(\w+)\s+(\d+) .+basic/) {
    $user = $1;
    if (open(PTREE, "ptree $2 |")) {
     while ($PTREE = <PTREE>) {
      if ($PTREE =~ /(\d+)\s+-pksh-ksh/) {
       $terminals{$user} = $terminals{$user} . " $1";
       last;
      }
      next;
     }
     close(PTREE);
    }
    next;
   }

Below is a sample ptree execution:

ares./home_atenas/lmcgra> ptree 29064
485   /usr/lib/inet/inetd start
  23054 /usr/sbin/in.telnetd
    23131 -pksh-ksh
      26107 -ksh
        29058 -ksh
          29064 /usr/ob/bin/basic s=61440 pgm=/usr/local/etc/logon -q -nr trans
            412   sybsrvr

I'd like to know if there is a better way to code this. This is the part of the script that takes longest to run.

Note: this code, along with other snippets, are inside a loop and are executed a couple of times.

like image 836
lamcro Avatar asked Dec 02 '22 08:12

lamcro


1 Answers

I think the main problem is that this code is in a loop. You don't need to run ptree and parse the results more than once! You need to figure out a way to run ptree once and put it into a data structure that you can use later. Probably be some kind of simple hash will suffice. You may even be able to just keep around your %terminals hash and keep reusing it.

Some nitpicks...

  • Both of your "next" statements seem unnecessary to me... you should be able to just remove them.

  • Replace

    $terminals{$user} = $terminals{$user} . " $1";
    

with:

    $terminals{$user} .= " $1";
  • Replace the bareword PTREE which you are using as a filehandle with $ptreeF or some such... using barewords became unnecessary for filehandles about 10 years ago :)

  • I don't know why your $PID variable is all caps... it could be confusing to readers of your code because it looks like there is something special about that variable, and there isn't.

like image 144
JoelFan Avatar answered Jan 13 '23 10:01

JoelFan