如何检索python中的进程开始时间(或正常运行时间)

如何检索在Linux中的Python的过程开始时间(或正常运行时间)?

我只知道,我可以调用“ps -p my_process_id -f”然后parsing输出。 但这并不酷。

Solutions Collecting From Web of "如何检索python中的进程开始时间(或正常运行时间)"

如果你正在从你正在测试的python程序中完成,你可以这样做:

 import time # at the beginning of the script startTime = time.time() # ... def getUptime(): """ Returns the number of seconds since the program started. """ # do return startTime if you just want the process start time return time.time() - startTime 

否则,你别无选择,只能解析ps或进入/proc/pid 。 一个很好的方式获得时间是:

 ps -eo pid,etime | grep $YOUR_PID | awk '{print $2}' 

这只会以下列格式打印经过的时间,所以解析应该很容易:

 days-HH:MM:SS 

(如果它运行了不到一天,那只是HH:MM:SS

开始时间是这样的:

 ps -eo pid,stime | grep $YOUR_PID | awk '{print $2}' 

不幸的是,如果你的过程没有从今天开始,这只会给你开始的日期,而不是时间。

这样做的最好方法是获得时间和现在的时间,只是做一些数学。 以下是一个Python脚本,它将PID作为参数,并为您执行上面的操作,输出过程的开始日期和时间:

 import sys import datetime import time import subprocess # call like this: python startTime.py $PID pid = sys.argv[1] proc = subprocess.Popen(['ps','-eo','pid,etime'], stdout=subprocess.PIPE) # get data from stdout proc.wait() results = proc.stdout.readlines() # parse data (should only be one) for result in results: try: result.strip() if result.split()[0] == pid: pidInfo = result.split()[1] # stop after the first one we find break except IndexError: pass # ignore it else: # didn't find one print "Process PID", pid, "doesn't seem to exist!" sys.exit(0) pidInfo = [result.split()[1] for result in results if result.split()[0] == pid][0] pidInfo = pidInfo.partition("-") if pidInfo[1] == '-': # there is a day days = int(pidInfo[0]) rest = pidInfo[2].split(":") hours = int(rest[0]) minutes = int(rest[1]) seconds = int(rest[2]) else: days = 0 rest = pidInfo[0].split(":") if len(rest) == 3: hours = int(rest[0]) minutes = int(rest[1]) seconds = int(rest[2]) elif len(rest) == 2: hours = 0 minutes = int(rest[0]) seconds = int(rest[1]) else: hours = 0 minutes = 0 seconds = int(rest[0]) # get the start time secondsSinceStart = days*24*3600 + hours*3600 + minutes*60 + seconds # unix time (in seconds) of start startTime = time.time() - secondsSinceStart # final result print "Process started on", print datetime.datetime.fromtimestamp(startTime).strftime("%a %b %d at %I:%M:%S %p") 

通过使用psutil https://github.com/giampaolo/psutil

 >>> import psutil, os, time >>> p = psutil.Process(os.getpid()) >>> p.create_time() 1293678383.0799999 >>> time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(p.create_time())) '2010-12-30 04:06:23' >>> 

加上它是跨平台的,不仅仅是Linux。

注:我是这个项目的作者之一。

man proc/proc/my_process_id/stat中的第22项是:

starttime %lu

系统启动后,进程启动。

你现在的问题是,如何确定jiffy的长度以及如何确定何时引导系​​统。

后者的答案仍然来自man proc :它在/proc/stat ,像这样:

 btime 1270710844 

这是自纪元以来的秒数。


前者的答案我不确定。 man 7 time说:

软件时钟,HZ和Jiffies

许多系统调用和时间戳的准确性受到软件时钟分辨率的限制,软件时钟是由内核维护的时钟,用于测量时间。 jiffy的大小由内核常量HZ的值决定。 HZ的价值在内核版本和硬件平台上有所不同。 在x86上,情况如下:在2.4.x以内的内核中, HZ为100,给出0.01秒的跳跃值; 从2.6.0开始, HZ提高到1000,速度为0.001秒; 从内核2.6.13开始, HZ值是一个内核配置参数,可以是100,250(默认值)或1000,产生一个jiffies值,分别为0.01,0.004或0.001秒。

我们需要找到HZ ,但我不知道如何去除Python,除了希望值是250(因为维基百科声称是默认值)。

ps从而得到它:

  /* sysinfo.c init_libproc() */ if(linux_version_code > LINUX_VERSION(2, 4, 0)){ Hertz = find_elf_note(AT_CLKTCK); //error handling } old_Hertz_hack(); //ugh 

这听起来像一个非常小的C模块为Python完成的工作:)

这里是基于badp的答案的代码:

 import os from time import time HZ = os.sysconf(os.sysconf_names['SC_CLK_TCK']) def proc_age_secs(): system_stats = open('/proc/stat').readlines() process_stats = open('/proc/self/stat').read().split() for line in system_stats: if line.startswith('btime'): boot_timestamp = int(line.split()[1]) age_from_boot_jiffies = int(process_stats[21]) age_from_boot_timestamp = age_from_boot_jiffies / HZ age_timestamp = boot_timestamp + age_from_boot_timestamp return time() - age_timestamp 

我不确定是否正确。 我写了一个测试程序,调用睡眠(5),然后运行它,输出是错误的,从运行到运行几秒钟。 这是在vmware工作站vm中:

 if __name__ == '__main__': from time import sleep sleep(5) print proc_age_secs() 

输出是:

 $ time python test.py 6.19169998169 real 0m5.063s user 0m0.020s sys 0m0.036s 

你可以解析/proc/uptime

 >>> uptime, idletime = [float(f) for f in open("/proc/uptime").read().split()] >>> print uptime 29708.1 >>> print idletime 26484.45 

对于Windows机器,你可以使用wmi

 import wmi c = wmi.WMI() secs_up = int([uptime.SystemUpTime for uptime in c.Win32_PerfFormattedData_PerfOS_System()][0]) hours_up = secs_up / 3600 print hours_up 
 def proc_starttime(pid=os.getpid()): # https://gist.github.com/westhood/1073585 p = re.compile(r"^btime (\d+)$", re.MULTILINE) with open("/proc/stat") as f: m = p.search(f.read()) btime = int(m.groups()[0]) clk_tck = os.sysconf(os.sysconf_names["SC_CLK_TCK"]) with open("/proc/%d/stat" % pid) as f: stime = int(f.read().split()[21]) / clk_tck return datetime.fromtimestamp(btime + stime)