Запишите программу наблюдения за любым домашнем процессом
Ответ нейросети
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.
Если хотите адаптировать под конкретный домашний сценарий (например, мониторинг конкретного сервиса в системе умного дома), скажите название процесса/сервис и требуемые метрики — подстрою пример под ваши условия.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



