Я думал об использовании ps, чтобы получить pid родителей, но мне нужно было зациклить это, чтобы получить pid прадедушки. Это то, что мне нужно. Благодарю. - лакро
Извините, пользователей много, и у каждого может быть открыто до трех терминалов. Весь скрипт используется для поиска тех терминалов, которые используют файл. Я использую fuser, чтобы найти процессы, которые используют файл. Затем используйте ptree, чтобы найти pid терминала. - лакро
Если у вас есть (или вы можете получить) список PID, использующих файл, и вам просто нужны все прародители этого PID, наверняка есть более простой способ.
#!perl
use warnings;
use strict;
#***** these PIDs are gotten with fuser or some other method *****
my($fpids) = [27538, 31812, 27541];
#***** get all processes, assuming linux PS *****
my($cmd) = "ps -ef";
open(PS, "$cmd |") || die qq([ERROR] Cannot open pipe from "$cmd" - $!\n);
my($processlist) = {};
while (<PS>) {
chomp;
my($user, $pid, $ppid, $rest) = split(/ +/, $_, 4);
$processlist->{$pid} = $ppid;
}
close PS;
#***** lookup grandparent *****
foreach my $fpid (@$fpids) {
my($parent) = $processlist->{$fpid} || 0;
my($grandparent) = $processlist->{$parent} || 0;
if ($grandparent) {
#----- do something here with grandparent's pid -----
print "PID:GRANDPID - $fpid:$grandparent\n";
}
else {
#----- some error condition -----
print "ERROR - Cannot determine GrandPID: $fpid ($parent)\n";
}
}
Что для меня производит:
ERROR - Cannot determine GrandPID: 27538 (1)
PID:GRANDPID - 31812:2804
PID:GRANDPID - 27541:27538