如何在Python中跟踪Chrome标签的PID?



我正在研究一个程序,该程序需要我跟踪特定的chrome/浏览器实例的PID。这是我为此编写的代码:

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]

但是,当我稍后在程序中尝试引用PID时,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不会将永久性PID分配到其选项卡/进程(即,它叉一次启动并抛弃父进程)?

注意:此实现是浏览器/实现的不可知论,我只需要一种方法即可获得稳定的访问这些启动过程的PID。如果有人对此有建议,他们将不胜感激。

谢谢!

Chrome在正常工作条件下不以根而运行。您可以在这里和这里找到一些讨论

有几个参数可以允许您规避此问题。通过通过--user-data-dir--no-sandbox,您将可以作为root运行Chrome。

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

我知道您无法显示您的确切代码,这确实使事情变得更加困难。

要查看Chrome选项卡的进程ID,您可以通过按 shift> shift escemant> escemant> esc 打开任务管理器。我进行了一些测试,正如您所怀疑的那样,PID与Popen的报道不同。

使用Chrome获得可访问的PID的一种方法是使用选项--temp-profile为每个站点创建一个新的会话,而不是使用现有的会话。

最新更新