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

时间:2016-12-05 00:13:54

标签: python linux google-chrome

我正在开发一个程序,要求我跟踪特定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(即,一旦Chrome进程启动并抛弃父进程,它就会分叉)?

注意:此实现与浏览器/实现无关,我只需要一种方法来获得对这些已启动进程的PID的稳定访问。如果有人对此提出建议,我们将非常感激。

谢谢!

2 个答案:

答案 0 :(得分:1)

Chrome在正常操作条件下无法以root用户身份运行。您可以针对此herehere

找到几个讨论

有几个参数可以让你绕过这个。通过--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

下传入您想要运行的用户名

我知道您无法显示确切的代码,这会使事情更难以协助。

答案 1 :(得分:0)

要查看Chrome标签的进程ID,可以按 Shift Esc 打开任务管理器。我做了一些测试,正如您所怀疑的那样,PID与Popen报告的不同。

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