Новая Школа - онлайн-школа подготовки к ЕГЭ
Задача Задача №3362700
А
Аноним
08 сентября 2025 13:48 · публичный вопрос
А
Аноним

Запишите программу наблюдения за любым домашнем процессом

Ответ нейросети
08 сентября 2025 13:48

Ниже пример кода на Python для наблюдения за любым локальным процессом: можно мониторить существующий процесс по PID, найти и наблюдать по имени или запустить внешний процесс и следить за ним. Программа пишет логи в CSV.

Что нужно установить:

  • Python 3.x
  • пакет psutil: pip install psutil

Пример кода (сохраните как monitor_process.py):

import psutil import time import csv import argparse import subprocess import datetime import sys

def find_proc_by_name(name): for p in psutil.process_iter(['name']): if p.info.get('name') == name: try: return psutil.Process(p.pid) except psutil.NoSuchProcess: continue return None

def monitor_process(proc, logfile, interval=1.0, duration=None): with open(logfile, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) header = ['timestamp','pid','name','status','cpu_percent','memory_rss','memory_vms','io_read_bytes','io_write_bytes','start_time'] writer.writerow(header) # Первая выборка CPU может быть нулевой; сделаем предварительный вызов try: proc.cpu_percent(interval=None) except psutil.NoSuchProcess: print("Процесс завершился до начала мониторинга.", file=sys.stderr) return

    start_time_epoch = time.time()
    while True:
        if not proc.is_running():
            break
        time.sleep(interval)
        try:
            cpu = proc.cpu_percent(interval=None)

            mem = proc.memory_info()
            mem_rss = getattr(mem, 'rss', None)
            mem_vms = getattr(mem, 'vms', None)

            io_read = None
            io_write = None
            try:
                io_counters = proc.io_counters()
                io_read = getattr(io_counters, 'read_bytes', None)
                io_write = getattr(io_counters, 'write_bytes', None)
            except (NotImplementedError, AttributeError):
                pass

            ts = datetime.datetime.now().isoformat(timespec='seconds')
            start_time = datetime.datetime.fromtimestamp(proc.create_time()).isoformat(timespec='seconds')

            writer.writerow([ts, proc.pid, proc.name(), proc.status(), cpu, mem_rss, mem_vms, io_read, io_write, start_time])
            f.flush()
        except psutil.NoSuchProcess:
            break
        except Exception as e:
            print("Ошибка мониторинга:", e, file=sys.stderr)

        if duration is not None and (time.time() - start_time_epoch) >= duration:
            break

def main(): parser = argparse.ArgumentParser(description="Мониторинг любого локального процесса: по PID, по имени или запустив внешний процесс.") group = parser.add_mutually_exclusive_group(required=True) group.add_argument('--pid', type=int, help='PID процесса, который нужно мониторить') group.add_argument('--name', help='Имя процесса для мониторинга (первый найденный)') group.add_argument('--cmd', nargs='+', help='Команда для запуска и мониторинга (пример: --cmd python script.py)') parser.add_argument('--logfile', default='process_monitor.csv', help='Файл лога (CSV)') parser.add_argument('--interval', type=float, default=1.0, help='Период выборки (сек)') parser.add_argument('--duration', type=float, default=None, help='Общее время мониторинга (сек)')

args = parser.parse_args()

proc = None
if args.pid:
    try:
        proc = psutil.Process(args.pid)
    except psutil.NoSuchProcess:
        print("Процесс с PID {} не найден.".format(args.pid), file=sys.stderr)
        sys.exit(1)
elif args.name:
    proc = find_proc_by_name(args.name)
    if proc is None:
        print("Процесс с именем '{}' не найден.".format(args.name), file=sys.stderr)
        sys.exit(1)
elif args.cmd:
    cmd = args.cmd
    p = subprocess.Popen(cmd)
    try:
        proc = psutil.Process(p.pid)
    except psutil.NoSuchProcess:
        print("Не удалось запустить процесс.", file=sys.stderr)
        sys.exit(1)

if proc is None:
    print("Не удалось определить процесс для мониторинга.", file=sys.stderr)
    sys.exit(1)

monitor_process(proc, args.logfile, interval=args.interval, duration=args.duration)

if name == 'main': main()

Как пользоваться:

  • Мониторинг по PID: python monitor_process.py --pid 1234 --logfile log.csv --interval 1

  • Мониторинг по имени (первый найденный процесс с таким именем): python monitor_process.py --name bash --logfile log.csv --interval 1

  • Запуск и мониторинг внешнего процесса: python monitor_process.py --cmd python my_script.py --logfile log.csv --interval 1

Примечания:

  • Параметр interval задаёт частоту выборки.
  • Лог содержит: временная отметка, pid, имя, статус, загрузку CPU, память (RSS и VM), счётчики IO (read_bytes, write_bytes) и время запуска процесса.
  • На некоторых платформах часть полей памяти/IO может быть недоступна; в таких случаях значения будут None.

Если хотите адаптировать под конкретный домашний сценарий (например, мониторинг конкретного сервиса в системе умного дома), скажите название процесса/сервис и требуемые метрики — подстрою пример под ваши условия.