当前位置: 首页 > 面试题库 >

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

顾俊楚
2023-03-14
问题内容

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

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


问题答案:

如果您正在尝试测量的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/pidbash获取经过时间的一种不错的方法是:

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


 类似资料:
  • 问题内容: 在Java中获得UNIX正常运行时间的最佳方法是什么?我是否可以使用标准的Java库/函数,还是应该使用运行时的exec或ProcessBuilder执行“正常运行时间”?谢谢 问题答案: 您可以阅读: 从维基百科: 显示自上次重新启动以来系统已开启多长时间: 第一个数字是系统启动的 总秒数 。第二个数字是机器空闲的时间(以秒为单位)。

  • 问题内容: 是否可以获取旧的运行过程的开始时间?如果今天不是开始日期,似乎会报告日期(而不是时间),如果今年不是开始日期,则只会报告日期。旧工艺会永远失去精度吗? 问题答案: 您可以指定格式器并使用,例如以下命令: 上面的命令将输出所有进程,并带有格式化程序以获取PID,命令运行以及启动日期和时间。 示例(从Debian / Jessie命令行) 您可以阅读的联机帮助页或查看Opengroup的其

  • 问题内容: 如何在python中计算程序运行时间? 问题答案: 您可能需要看一下该模块: http://docs.python.org/library/timeit.html 或模块: http://docs.python.org/library/profile.html 这里还有一些不错的教程: http://www.doughellmann.com/PyMOTW/profile/index.h

  • 有一个 JDK 错误:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8022628 它将在49.7天内获得java.net.SocketTimeoutException。 在那个链接中,它说“我们已经加速了cpu的正常运行时间”。我想测试一下这个bug,但是我不知道如何“加速cpu的正常运行时间”。 我运行了上面的程序,而不是将时间更改为4

  • 问题内容: 有没有办法在运行时(从代码中)知道变量的名称?还是在编译过程中忘记了变量的名称(是否使用字节码)? 例如: 注意 :我说的是普通数据类型的变量(,,等) 问题答案: 这里是一个基本的(也许很奇怪)函数,它显示了参数的名称…这个想法是分析代码并搜索对该函数的调用(在 init 方法中添加它可以帮助找到实例名称,尽管带有一个更复杂的代码分析) 请注意:如下面的示例所示,从调用代码中获取多行

  • 问题内容: 我已经用Java编写了一个应用程序,并且想添加一个功能来报告该应用程序的正常运行时间。JVM中是否有可以执行此操作的类/方法? 我应该在应用程序启动时保存时间戳,然后在请求时计算与当前正常运行时间的差额吗? 用Java检索应用程序正常运行时间的更好方法是什么? 问题答案: 您可以使用RuntimeMXBean.getUptime()