如果我查看/ proc / 6945 / stat,则会得到一系列数字,其中一个是进程已经运行的CPU-centisecond数。
但是我正在重负载的机器上运行这些进程,我感兴趣的是工作完成时的时钟,为此我想知道它开始的时钟时间。
/ proc / 6945中的文件的时间戳看起来是在正确的范围,但我找不到一个具有正确时钟的特定文件。
一如既往,我无法修改这个过程。
我在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
,但这应该是非常简单的。
/ 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请求内核的值。
使用/ proc / 6945目录(或任何PID)的创建时间戳,而不是查看它包含的文件。 例如:
ls -ld /proc/6945