【发布时间】:2010-09-28 11:05:06
【问题描述】:
下面的 sn-p 代码用于查找用户终端的 PID,通过使用 ptree 并从它返回的结果中获取 第三个 PID。所有终端 PID 都以用户登录作为键存储在哈希中。
## 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
我想知道是否有更好的编码方式。这是脚本中运行时间最长的部分。
注意:这段代码和其他 sn-ps 都在一个循环中并被执行了几次。
【问题讨论】:
-
"这是脚本中运行时间最长的部分。"哪一点需要时间? ptree 的执行,还是结果的修改?这将有助于避免优化实际上没有任何区别的东西。
-
ptree 会减慢程序的速度。毫无疑问。我只是想知道是否有更好的方法来捕获 ptree 结果中第三行中的进程 ID。这就是我从这段代码中需要的全部内容。
-
捕获 PID 的方式看起来很合理。唯一的(微)优化是您知道正则表达式与前两行不匹配。您可以只数三行,然后仅在第三行上进行正则表达式匹配。但是,鉴于时间在 ptree 中,有什么意义呢?请参阅我的其他答案。