Как получить время начала процесса (или время работы) в Python

Как получить время начала процесса (или время работы) в Python в Linux?

Я только знаю, я могу назвать "PS-p my_process_id-f" и затем проанализировать вывод. Но это не прохладно.

33
задан badp 8 April 2010 в 07:13
поделиться

3 ответа

Если вы делаете это из программы 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 .Хороший bash способ получить истекшее время:

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

Это будет печатать только прошедшее время в следующем формате, поэтому его будет довольно легко проанализировать:

days-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")
17
ответ дан 27 November 2019 в 17:40
поделиться

вы можете проанализировать / 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
1
ответ дан 27 November 2019 в 17:40
поделиться

man proc говорит, что 22-й элемент в /proc/my_process_id/stat:

starttime %lu

Время в джиффиях, когда процесс стартовал после загрузки системы.

Теперь ваша проблема заключается в том, как определить длительность джиффи и как определить, когда система загрузилась.

Ответ на последний вопрос можно найти в man proc: он находится в /proc/stat, в такой строке:

btime 1270710844

Это измерение в секундах с момента Epoch.


Ответ для первого я не уверен. man 7 time говорит:

Программные часы, HZ и джиффи

Точность многих системных вызовов и временных меток ограничена разрешением программных часов - часов, поддерживаемых ядром, которые измеряют время в джиффи. Размер джиффи определяется значением константы ядра HZ. Значение HZ варьируется в зависимости от версии ядра и аппаратных платформ. На x86 ситуация следующая: на ядрах до 2.4.x включительно значение HZ было равно 100, что давало значение jiffy 0.01 секунды; начиная с 2.6.0 значение HZ было увеличено до 1000, что давало значение jiffy 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 :)

14
ответ дан 27 November 2019 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: