如何在python中检索流程开始时间(或正常运行时间) [英] How to retrieve the process start time (or uptime) in python

查看:163
本文介绍了如何在python中检索流程开始时间(或正常运行时间)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How to retrieve the process start time (or uptime) in python in Linux?

我只知道,我可以调用"ps -p my_process_id -f",然后解析输出.但这并不酷.

I only know, I can call "ps -p my_process_id -f" and then parse the output. But it is not cool.

推荐答案

如果您是在尝试测量的python程序中执行此操作,则可以执行以下操作:

If you are doing it from within the python program you're trying to measure, you could do something like this:

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.获取经过时间的bash y一种不错的方法是:

Otherwise, you have no choice but to parse ps or go into /proc/pid. A nice bashy way of getting the elapsed time is:

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

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

This will only print the elapsed time in the following format, so it should be quite easy to parse:

days-HH:MM:SS

(如果运行时间不足一天,则为HH:MM:SS)

(if it's been running for less than a day, it's just HH:MM:SS)

开始时间如下:

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

不幸的是,如果您的流程今天没有开始,则只会为您提供开始的日期,而不是时间.

Unfortunately, if your process didn't start today, this will only give you the date that it started, rather than the time.

执行此操作的最佳方法是获取经过时间和当前时间,然后进行一些数学运算.以下是一个Python脚本,该脚本将PID作为参数,并为您执行上述操作,并打印出该过程的开始日期和时间:

The best way of doing this is to get the elapsed time and the current time and just do a bit of math. The following is a python script that takes a PID as an argument and does the above for you, printing out the start date and time of the process:

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")

这篇关于如何在python中检索流程开始时间(或正常运行时间)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆