如果我查看/ proc / 6945 / stat,我会得到一系列数字,其中一个是进程运行的CPU中心数。
但是我在重负载的盒子上运行这些进程,而我感兴趣的是作业完成时的时钟时间,我想知道它开始的时钟时间。
/ proc / 6945中文件的时间戳看起来是在正确的范围内,但我找不到一个具有正确时钟时间的特定文件。
一如既往,我无法修改过程。
答案 0 :(得分:2)
/ proc中目录的时间戳是无用的。
我被建议看'man proc';这表示/ proc / $ PID / stat字段21记录了自启动以来内核jiffies中进程的开始时间 ...所以:
open A,"< /proc/stat"; while (<A>) { if (/^btime ([0-9]*)/) { $btime = $1 } }
获取启动时间,然后
my @statl = split " ",`cat /proc/$i/stat`;
$starttime_jiffies = $statl[21];
$starttime_ut = $btime + $starttime_jiffies / $jiffies_per_second;
$cputime = time-$starttime_ut
但是我将$ jiffies_per_second设置为100,因为我不知道如何从perl询问内核的值。
答案 1 :(得分:1)
使用/ proc / 6945目录(或任何PID)的创建时间戳,而不是查看它包含的文件。例如:
ls -ld /proc/6945
答案 2 :(得分:1)
我在github上有一个项目在perl中执行此操作。你可以在这里找到它:
https://github.com/cormander/psj
您想要的代码位于lib/Proc/PID.pm
,这里是snippit(删除了评论):
use POSIX qw(ceil sysconf _SC_CLK_TCK);
sub _start_time {
my $pid = shift->pid;
my $tickspersec = sysconf(_SC_CLK_TCK);
my ($secs_since_boot) = split /\./, file_read("/proc/uptime");
$secs_since_boot *= $tickspersec;
my $start_time = (split / /, file_read("/proc/$pid/stat"))[21];
return ceil(time() - (($secs_since_boot - $start_time) / $tickspersec));
}
请注意此处的非标准代码函数file_read
,但这应该非常简单。
答案 3 :(得分:0)
Bash命令获取某个进程的开始日期:
date -d @$(cat /proc/PID/stat | awk "{printf \"%.0f\", $(grep btime /proc/stat | cut -d ' ' -f 2)+\$22/$(getconf CLK_TCK);}")