X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=data%2FPVE%2FProcFSTools.pm;h=bdb6e52abe86a85e78a2e71c371117138b50cfcc;hp=dd22c4b21fff206334ba9d2d2919090dbc239b47;hb=66bda4e09d2d7de880b1fda8b54c72bd68adf555;hpb=8104dfe38b6a5faa4f1648765f9869b209714c13 diff --git a/data/PVE/ProcFSTools.pm b/data/PVE/ProcFSTools.pm index dd22c4b..bdb6e52 100644 --- a/data/PVE/ProcFSTools.pm +++ b/data/PVE/ProcFSTools.pm @@ -20,6 +20,7 @@ sub read_cpuinfo { model => 'unknown', mhz => 0, cpus => 1, + sockets => 1, }; my $fh = IO::File->new ($fn, "r"); @@ -35,7 +36,11 @@ sub read_cpuinfo { $res->{mhz} = $1 if !$res->{mhz}; } elsif ($line =~ m/^flags\s*:.*(vmx|svm)/) { $res->{hvm} = 1; # Hardware Virtual Machine (Intel VT / AMD-V) + } elsif ($line =~ m/^physical id\s*:\s*(\d+)\s*$/i) { + my $sid = $1 + 1; + $res->{sockets} = $sid if $sid > $res->{sockets}; } + } $res->{cpus} = $count; @@ -53,7 +58,7 @@ sub read_proc_uptime { my $line = PVE::Tools::file_read_firstline("/proc/uptime"); if ($line && $line =~ m|^(\d+\.\d+)\s+(\d+\.\d+)\s*$|) { if ($ticks) { - return (int($1*100), int($2*100)); + return (int($1*$clock_ticks), int($2*$clock_ticks)); } else { return (int($1), int($2)); } @@ -124,18 +129,43 @@ sub read_proc_stat { return $res; } -sub read_proc_starttime { +sub read_proc_pid_stat { my $pid = shift; my $statstr = PVE::Tools::file_read_firstline("/proc/$pid/stat"); - if ($statstr && $statstr =~ m/^$pid \(.*\) \S (-?\d+) -?\d+ -?\d+ -?\d+ -?\d+ \d+ \d+ \d+ \d+ \d+ (\d+) (\d+) (-?\d+) (-?\d+) -?\d+ -?\d+ -?\d+ 0 (\d+) (\d+) (-?\d+) \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ -?\d+ -?\d+ \d+ \d+ \d+/) { - my $starttime = $6; - - return $starttime; + if ($statstr && $statstr =~ m/^$pid \(.*\) (\S) (-?\d+) -?\d+ -?\d+ -?\d+ -?\d+ \d+ \d+ \d+ \d+ \d+ (\d+) (\d+) (-?\d+) (-?\d+) -?\d+ -?\d+ -?\d+ 0 (\d+) (\d+) (-?\d+) \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ \d+ -?\d+ -?\d+ \d+ \d+ \d+/) { + return { + status => $1, + utime => $3, + stime => $4, + starttime => $7, + vsize => $8, + rss => $9 * 4096, + }; } - return 0; + return undef; +} + +sub check_process_running { + my ($pid, $pstart) = @_; + + # note: waitpid only work for child processes, but not + # for processes spanned by other processes. + # kill(0, pid) return succes for zombies. + # So we read the status form /proc/$pid/stat instead + + my $info = read_proc_pid_stat($pid); + + return $info && (!$pstart || ($info->{starttime} eq $pstart)) && ($info->{status} ne 'Z') ? $info : undef; +} + +sub read_proc_starttime { + my $pid = shift; + + my $info = read_proc_pid_stat($pid); + return $info ? $info->{starttime} : 0; } sub read_meminfo {