【问题标题】:Acquire renderer process id in Electron在 Electron 中获取渲染器进程 ID
【发布时间】:2017-10-14 20:01:57
【问题描述】:

在 Electron 中,渲染器进程的 pid 被暴露了

processId = require('remote').getCurrentWindow().getProcessId()

但是,在最近的版本(1.4.x、1.5.x、1.6.x)中不再有效。

还有其他方法可以获取渲染器进程的 pid,即 Windows 的 pid 吗?

【问题讨论】:

    标签: javascript node.js electron chromium


    【解决方案1】:

    getOSProcessId() 获取渲染器的操作系统 pid(不是路由 ID)的方法已添加到 Electron v1.7.1。这是原来的pull request

    require('electron').remote.getCurrentWebContents().getOSProcessId();
    

    【讨论】:

    • 这在您从渲染器进程中访问 pid 时非常有用。对于任何阅读的人,当我尝试从主进程中访问渲染器的 pid 时遇到的一个问题是,您必须等待 did-finish-load 事件从窗口的 webContents 发出,然后才能查询 pid。否则window.webContents.getOSProcessId() 将返回0
    【解决方案2】:

    奇怪的是,在 Darwin 或 Linux Mint 上,使用 Electron 1.6.7,

    require('electron').remote.getCurrentWebContents().getProcessId()
    

    返回 3,这对于有效的进程 ID 来说似乎很小。

    但是,从渲染器进程来看,

    process.pid
    

    返回正确的渲染器进程 ID,并且

    require('electron').remote.process.pid
    

    返回正确的主进程 ID。

    这可以通过使用 Darwin 上的 Activity Monitor 应用程序或 Linux Mint 上的 System Monitor 应用程序来确认。

    【讨论】:

    • 这也是我感到困惑的地方。返回的值看起来更像是一个内部窗口 ID,而不是一个有效的进程 ID。
    【解决方案3】:

    以下稍作修改的版本适合我

    require('electron').remote.getCurrentWebContents().getProcessId()
    

    例子:

    const { app, BrowserWindow } = require('electron')
    
    app.once('ready', () => {
      var br = new BrowserWindow()
      br.once('focus', () => {
        br.webContents.openDevTools({detach:true})
        br.webContents.executeJavaScript(`
          const remote = require('electron').remote
          console.log(remote.getCurrentWebContents().getProcessId())
        `)
      })
      br.loadURL('http://google.com')
    })
    

    在 1.4.13 测试

    【讨论】:

    • 打印出来的pid是什么?它是一个有效的 pid,还是只是一个 Windows 路由 ID?
    • 它打印4,所以它似乎对进程ID无效。然而,remote.process.pid 也在这里返回有效值,正如 Mikaeru 建议的那样
    • 谢谢,这是路由 ID,而不是操作系统进程 ID。获取后者的方法是Electron v1.7.1刚刚添加的。
    【解决方案4】:

    从电子 14 开始,远程模块为 removed

    // Deprecated in Electron 12:
    const { BrowserWindow } = require('electron').remote
    
    
    // Replace with:
    const { BrowserWindow } = require('@electron/remote')
    
    // In the main process:
    require('@electron/remote/main').initialize()
    

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 2019-10-27
      • 2017-05-01
      • 2017-06-01
      • 2018-01-05
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2019-03-21
      相关资源
      最近更新 更多