下面的代码片段用于通过使用ptree并从它返回的结果中获取第三个 PID 来查找用户终端的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;
}
Run Code Online (Sandbox Code Playgroud)
下面是一个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
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来编写代码.这是脚本运行时间最长的部分.
注意:此代码与其他代码段一起位于循环内并执行几次.
我认为主要的问题是这个代码是循环的.您不需要运行ptree并多次解析结果!您需要找到一种方法来运行ptree一次并将其放入一个稍后可以使用的数据结构中.可能是某种简单的哈希就足够了.您甚至可以只保留%终端哈希并继续重用它.
一些挑剔......
你的两个"下一个"陈述似乎对我来说都是不必要的......你应该能够删除它们.
更换
$terminals{$user} = $terminals{$user} . " $1";
Run Code Online (Sandbox Code Playgroud)有:
$terminals{$user} .= " $1";
Run Code Online (Sandbox Code Playgroud)
用$ ptreeF替换你正在使用的裸字PTREE作为文件句柄或者一些这样的...使用裸字变成大约10年前的文件句柄:)
我不知道为什么你的$ PID变量都是大写的...它可能让你的代码的读者感到困惑,因为看起来这个变量有一些特别的东西,而且没有.
归档时间: |
|
查看次数: |
1788 次 |
最近记录: |