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
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")
7条答案
按热度按时间chy5wohz1#
使用psutil https://github.com/giampaolo/psutil:
字符串
它是跨平台的,不仅仅是Linux。
NB:我是这个项目的作者之一。
irtuqstp2#
如果你是在你要测量的Python程序中进行的,你可以这样做:
字符串
否则,您别无选择,只能解析
ps
或进入/proc/pid
。一个很好的bash
y获取运行时间的方法是:型
这只会以下面的格式打印经过的时间,所以它应该很容易解析:
型
(if它已经运行了不到一天,它只是
HH:MM:SS
)开始时间如下所示:
型
不幸的是,如果您的进程不是从 * 今天 * 开始的,则这将只给予它开始的日期,而不是时间。
最好的方法是获取经过的时间和当前时间,然后做一些数学运算。下面是一个python脚本,它将PID作为参数,并为您执行上述操作,打印出进程的开始日期和时间:
型
yfjy0ee73#
man proc
表示/proc/my_process_id/stat
中的第22项是:starttime %lu
个系统 Boot 后进程启动的时间,以jiffies为单位。
现在的问题是,如何确定jiffy的长度以及如何确定系统何时启动。
后者的答案仍然来自
man proc
:它在/proc/stat
中,在它自己的一行上,如下所示:字符串
这是自纪元以来的秒测量值。
前者的答案我不确定。
man 7 time
说:软件时钟、HZ和Jiffies
许多系统调用和时间戳的准确性受到软件时钟分辨率的限制,软件时钟是由内核维护的时钟,以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,分别产生0.01、0.004或0.001秒的jiffies值。我们需要找到
HZ
,但我不知道如何从Python中找到它,除了希望值是250(维基百科声称是默认值)。ps
这样得到:型
这听起来像是一个非常小的Python C模块所做的工作:)
xdyibdwo4#
下面是基于badp答案的代码:
字符串
但我不确定这样对不对。我写了一个测试程序,它调用sleep(5),然后运行它,输出是错误的,并且在几秒钟内从运行到运行都有变化。这是在一个vmware工作站虚拟机:
型
输出为:
型
1tu0hz3e5#
字符串
g52tjvyc6#
你可以解析
/proc/uptime
字符串
对于windows机器,您可能可以使用wmi
型
cwdobuhd7#
此实现基于Dan Benamy's answer,并通过使用以秒为单位的正常运行时间而不是自纪元以来以秒为单位的 Boot 时间来简化。该方法在Python 2和Python 3上进行了测试。
字符串
输出量:
型