perl - 如何在 Perl 中快速找到用户的终端 PID?

标签 perl terminal pid

以下代码片段用于通过使用 ptree 并抓取 来查找用户终端的 PID。第三个 PID 从它返回的结果。所有终端 PID 都存储在一个哈希中,以用户的登录名作为 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;
   }

下面是一个示例 ptree 执行:
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

我想知道是否有更好的方法来对此进行编码。这是脚本中运行时间最长的部分。

注意:此代码与其他代码段一起位于循环内并执行几次。

最佳答案

我认为主要问题是这段代码处于循环中。您不需要多次运行 ptree 并解析结果!你需要想办法把 ptree 运行一次,然后放到一个数据结构中,以后可以使用。可能是某种简单的散列就足够了。您甚至可以保留 %terminals 哈希值并继续重用它。

一些挑剔...

  • 你的两个“下一个”陈述似乎
    对我来说没有必要……你应该
    能够删除它们。
  • 代替
    $terminals{$user} = $terminals{$user} . " $1";
    

  • 和:
        $terminals{$user} .= " $1";
    
  • 替换您使用的裸字 PTREE
    用作文件句柄
    $ptreeF 或一些这样的......使用
    裸词变得不必要了
    大约 10 年前的文件句柄 :)
  • 我不知道为什么你的 $PID 变量
    都是大写的……这可能会让人困惑
    给你的代码的读者,因为它
    好像有东西
    那个变量的特别之处,以及
    没有。
  • 关于perl - 如何在 Perl 中快速找到用户的终端 PID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/393627/

    相关文章:

    perl - 如何在 Perl 中读取传递给构造函数的参数和由 `use Module` 传递的参数?

    macos - 将终端命令输出直接打印到 vim - macOS

    linux - httpd 的 pid 文件只包含一个 ID,即使它产生了许多

    bash - 等待具有特定名称的所有进程完成(在 bash 中)

    c++ - 从c/cpp程序中的进程ID获取进程名称(我不能使用/proc/<pid>/cmdline)

    Perl:哪些浮点运算是无损的?

    Perl:如何使用模块的本地副本而不是安装的版本?

    regex - 使用 Perl 的 RegEx 查找集合的任何排列

    bash - 在终端 : "Command not found" & "No such file or directory" 中使用 subl 命令的问题

    macos - 在 golang 中使用 exec.Command,如何打开一个新终端并执行命令?