2016-12-05 2 views
1

Я работаю над программой, которая требует от меня отслеживать PID определенных экземпляров Chrome/браузера. Это код, который я написал для этого:Как отслеживать PID вкладки Chrome в Python?

def launch_procs(): 
    low1 = Popen(['google-chrome-stable', 'http://www.google.com']) 
    med1 = Popen(['google-chrome-stable', 'http://www.netflix.com']) 
    high1 = Popen(['google-chrome-stable', 'http://www.facebook.com']) 
    return [low1.pid, med1.pid, high1.pid] 

Однако при попытке сослаться на ИДП позже в программе, кажется, что ИДП истек. Здесь ошибка я получаю:

7894 
strace: attach: ptrace(PTRACE_ATTACH, ...): No such process 
7896 
strace: attach: ptrace(PTRACE_ATTACH, ...): No such process 
7901 
strace: attach: ptrace(PTRACE_ATTACH, ...): No such process 

Является ли проблема, что Chrome не назначает постоянный ИДП его вкладки/процессы (т.е. он порождает только процесс запусков и канаву Chrome родительского процесс)?

Примечание: Эта реализация является агностикой браузера/реализации, мне просто нужен способ получить стабильный доступ к PID этих запущенных процессов. Если у кого-то есть предложения по этому поводу, они будут очень оценены.

Спасибо!

+0

Можно ли показать код, который вы имеете в виду «позже в программе»? – tijko

+0

Поскольку это исследовательский код, мне не разрешено делиться этим, но я могу опубликовать наиболее релевантную часть: 'для pid в vm_list:' 'print (pid)' 'os.system ('sudo timeout 10 strace -p '+ str (pid) +' -o temp.out | cat temp.out | tail - '+ str (line_count) +'> '+ outfile) 'Vm_list должен быть PID, собранным из Chrome. Для каждого цикла я печатаю результаты strace в выходной файл и делаю некоторые вещи с ним. – bearface

+0

Я не могу получить форматирование по какой-либо причине, мои извинения. – bearface

ответ

0

увидеть процесс корочки вкладок Chrome вы можете открыть диспетчер задач, нажав Shift, Esc. Я провел некоторое тестирование, и, как вы подозреваете, PID отличается от сообщения Popen.

Один из способов получить доступный PID с помощью Chrome - это использовать опцию --temp-profile, чтобы создать новый сеанс для каждого сайта вместо существующего.

+0

Спасибо! Я попытался использовать '--temp-profile', и у него все еще была та же проблема. Я пробовал искать другие решения, такие как использование Firefox, но из того, что я читал, Firefox запускает все вкладки под одним процессом. Мне нужно одновременно запускать эти вкладки и запускать диагностику по отдельности, поэтому я не уверен, могу ли я на самом деле сделать это на этом этапе. – bearface

1

Хром не работает как корень при нормальных условиях эксплуатации. Вы можете найти несколько обсуждений для этого here и here

Существует несколько аргументов, которые позволят вам обойти это. Пройдя --user-data-dir и --no-sandbox, вы сможете управлять хромом как root.

import os 
from subprocess import Popen 


line_count = 10 
outfile = 'foo.txt' 
cmd = 'sudo timeout 10 strace -p {} -o temp.out | cat temp.out | tail -{} > {}' 
tab_sites = ['www.google.com', 'www.yahoo.com', 'www.msn.com'] 


for site in tab_sites: 
    chrome_proc = Popen(['google-chrome-stable', site, '--user-data-dir', '--no-sandbox']) 
    print(chrome_proc.pid) 
    os.system(cmd.format(chrome_proc.pid, line_count, outfile)) 

В качестве альтернативы вы можете использовать runuser с командой:

import os 
import sys 
from subprocess import Popen 


line_count = 10 
outfile = 'foo.txt' 
cmd = 'sudo timeout 10 strace -p {} -o temp.out | cat temp.out | tail -{} > {}' 
tab_sites = ['www.google.com', 'www.yahoo.com', 'www.msn.com'] 


for site in tab_sites: 
    chrome_proc = Popen(['runuser', '-u', sys.argv[1], 'google-chrome-stable', site]) 
    print(chrome_proc.pid) 
    os.system(cmd.format(chrome_proc.pid, line_count, outfile)) 

Просто передать имя пользователя, вы хотите запустить это в разделе, sudo python trace_chrome.py your_user_name

Я понимаю, что вы не в состоянии показать свое точный код, который делает вещи более жесткими, чтобы быть в состоянии помочь.

+0

Спасибо, что посмотрели! Я думаю, что проблема, с которой я сталкиваюсь, заключается в том, что PID, возвращенные Popen, отличаются от того, что PIDs в конечном итоге. Поэтому, когда я пытаюсь сделать то, что вы делали программно, strace не может подключиться к процессам. Вы вручную захватываете PID из графического интерфейса Chrome или используете Popen для вас? – bearface

Смежные вопросы