如何确定Linux进程启动的日期和时间?

时间:2011-07-10 14:27:09

标签: linux process statistics

如果我查看/ proc / 6945 / stat,我会得到一系列数字,其中一个是进程运行的CPU中心数。

但是我在重负载的盒子上运行这些进程,而我感兴趣的是作业完成时的时钟时间,我想知道它开始的时钟时间。

/ proc / 6945中文件的时间戳看起来是在正确的范围内,但我找不到一个具有正确时钟时间的特定文件。

一如既往,我无法修改过程。

4 个答案:

答案 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);}")