Shadowsocks-windows: Windows 10 RS5,当处于 PAC 模式时,每次睡眠唤醒后都多出一个 pacjsworker.exe 进程

Created on 20 Aug 2018  ·  38Comments  ·  Source: shadowsocks/shadowsocks-windows

也许与 RS5 的新沙盒有关。https://twitter.com/epakskape/status/1007316208087994368

Shadowsocks version / 影梭版本

4.1.1

Environment(Operating system, .NET Framework, etc) / 使用环境(操作系统,.NET Framework等)

Windows 10 build 17741

Steps you have tried / 操作步骤

  1. 切换到 PAC 模式
  2. Windows 选择睡眠,然后重新登陆

What did you expect to see? / 期望的结果

不要新出现 pacjsworker.exe

What did you see instead? / 实际结果

新出现了一个 pacjsworker.exe

third-party bug

Most helpful comment

Hello,我(应该)已经解决这个问题并发布了编译后的文件,详情请看:系统出现大量HTTP Auto Proxy Detection Worker Process

没时间看的可直接下载编译好的exe测试:ShadowSocks-4.1.4-1.zip

All 38 comments

Google了一下,整个互联网只有另一个SSR的issue中提到了这个文件。

image

你能把这个 exe 上传上来看看吗?或者打包成 zip 上传也行。

嗯,RS5 (version 1809) 后系统就自带这个文件了
pacjsworker.zip

https://www.virustotal.com/#/file/b48eec1a68e933b7f26fb041f843240346920aaeb261131334eefc09fd90d5c8/details

没有数字签名,看起来很像是微软签发的文件。

从文件说明来看(HTTP Auto Proxy Detection Worker Process),这看起来是一个自动代理检测工具。

但是从文件名来看,这看起来很像是用于处理PAC中JS脚本的工具。

因为这是微软的决定,这边控制不了。

如果你非常在意,可以你停用SS的系统代理,使用Firefox或者SwitchyOmega单独指定代理,应该就不会出现这个了。

最后发现是 PacUrl 后面的参数。每次设置系统代理的时候就会有新的参数,系统就会启动新进程进行处理。影梭这边有功能依赖这些参数,确实不太好处理。我自己本地 fork 了一份,删掉了参数。多谢帮助啦!

此问题在升级到1809后出现,在一些论坛也有该问题报告:
https://steamcn.com/t430331-1-1

初步研究了一下,这个 pacjsworker.exe 是经由WinHttpAutoProxySvc服务(WinHTTP Web Proxy Auto-Discovery Service)启动的,这个服务无法通过重新启动或者停止来清除这些 pacjsworker.exe 进程,如果尝试结束 pacjsworker.exe 的任务,会自动重新启动该进程,只能重新启动计算机。

当然,也可以找到WinHttpAutoProxySvc服务所在的svchost.exe进程然后结束,但是不推荐这样。

查了一下文档:
https://docs.microsoft.com/en-us/windows/desktop/winhttp/winhttp-autoproxy-support
https://docs.microsoft.com/en-us/windows/desktop/winhttp/autoproxy-issues-in-winhttp

不知道是否能有优化的余地?

@celeron533

@changjiangblog 这个问题和微软改变了PAC的处理机制有关,可能得等维护人员修改程序。

目前,除开重新启动计算机,尽量减少切换服务器,减少修改代理模式以外,暂时没有较好的解决办法。

我刚发现这个问题,数了下竟然有七八十个进程😱(看来只好暂时不睡眠电脑了)

我也有这个问题

微软有个bug了,大家去upvote和评论催微软修一下吧 https://aka.ms/AA33ywa

Hi, 我根据 @l1ken 评论的方法删去这行地址的参数后 https://github.com/shadowsocks/shadowsocks-windows/blob/98538e32c043a8d1c0cb57937c6c9a19c4d2e380/shadowsocks-csharp/Controller/Service/PACServer.cs#L54 系统就不会启动新进程了。

在我有限的测试中,本地更改完 pac 后,只要切到全局再切到 pac 模式就能更新系统 pac。不知道可不可以在软件层面做一些操作。

当然这只是不完美的 workaround,而且会使“保护本地 PAC”功能不可用。在微软修复这个问题以前,希望大神们能找到更好的方法。

@Joelism 使用这个workaround是需要改代码并重编译吗?有没有现成的fork之类的,谢谢。

@dspjm 对,我是自己拉到本地改完编译的

貌似 32Win10PRO 1809/17763.167 只见或自动变更了PID的一个了,以前机器重启才消失,现在休眠醒来那进程已不见😂😂

这个问题不知道新版的1901版的WINDOWS有没有解决。

这个问题不知道新版的1901版的WINDOWS有没有解决。

所以大家赶紧向微软报告这个bug吧

必要要反馈了,这个问题相当严重。尤其是开了几十个进程之后,对CPU跟硬盘都是负担。

请问4.13 prerelease版本中的 Fix sysproxy hanging issue 针对的是否是这个问题呢

@Feketerigo0827 release notes 里面笔误。实际上没有这个。

每运行一次,就增加78个甚至十几个进程!问题非常明显,希望微软尽快解决!

Hello,我(应该)已经解决这个问题并发布了编译后的文件,详情请看:系统出现大量HTTP Auto Proxy Detection Worker Process

没时间看的可直接下载编译好的exe测试:ShadowSocks-4.1.4-1.zip

Hello,我(应该)已经解决这个问题并发布了编译后的文件,详情请看:系统出现大量HTTP Auto Proxy Detection Worker Process

没时间看的可直接下载编译好的exe测试:ShadowSocks-4.1.4-1.zip

你好,我看到你的pr里提交的是你博客中所说的方案二。我在尝试方案一时遇到了点问题

// 文件: shadowsocks-csharp\Controller\Service\PACServer.cs
public void UpdateConfiguration(Configuration config)
{
  this._config = config;

  if (config.secureLocalPac)
  {
    // 注释掉部分
    // var rd = new byte[32];
    // RNG.GetBytes(rd);
    // PacSecret = $"&secret={Convert.ToBase64String(rd)}";

    // ----------------------------------- 以下部分 -----------------------------------
    // 这部分4.1.4版本的ss中是没有的 如果要添加的话 PAC_SECRET_FILE 未声明

    if (!File.Exists(PAC_SECRET_FILE))
    {
      var rd = new byte[32];
      RNG.GetBytes(rd);
      string secret = Convert.ToBase64String(rd);
      PacSecret = $"secret={secret}";
      File.WriteAllText(PAC_SECRET_FILE, secret);
    }
    else
    {
      PacSecret = $"secret={File.ReadAllText(PAC_SECRET_FILE)}";
    }
    // ----------------------------------- 以上部分 -----------------------------------

  }
  else
  {
    PacSecret = "";
  }
  // 注释掉部分
  // PacUrl = $"http://127.0.0.1:{config.localPort}/pac?t={GetTimestamp(DateTime.Now)}{PacSecret}";
  PacUrl = $"http://127.0.0.1:{config.localPort}/pac?{PacSecret}";
}

@KIRI-Z 是编译不通过的问题吗?
我博客中给出的代码不完整,你要在类中新增一个PAC_SECRET_FILE常量:

private const string PAC_SECRET_FILE = "pac-secret.txt";

@tlanyan 已解决,谢谢!

Hello,我(应该)已经解决这个问题并发布了编译后的文件,详情请看:系统出现大量HTTP Auto Proxy Detection Worker Process

没时间看的可直接下载编译好的exe测试:ShadowSocks-4.1.4-1.zip

支持加入ss官方版本,不胜其烦。别等微软了。

不需要修复了,在最新预览版18334中,只需要睡眠再唤醒,多余的pacjsworker.exe就会消失。

在19H1预览版18351和20H1预览版18850中,pacjsworker.exe的行为是一致的,旧的进程会在5分钟后自动退出。因此,将来这个issue只会影响1809这个系统版本。我觉得这个issue可以关闭了。

Fyir#Khitoe

在19H1预览版18351和20H1预览版18850中,pacjsworker.exe的行为是一致的,旧的进程会在5分钟后自动退出。因此,将来这个issue只会影响1809这个系统版本。我觉得这个issue可以关闭了。

19H1不知道要什么时候才能有正式版,而且说不定又要想1809一样延迟推送。预览版的特性能否保持到正式版也是问题。

@Feketerigo0827 如果你像我一样长期有用预览版,你就会知道,现在这个时期Fast Ring的预览版会和将来的正式版几乎无区别。目前的18362极有可能成为1903的正式build。

1809版本可以用脚本杀掉这个进程树。(仅供强迫症用户使用

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit }

$list = Get-Process -Name pacjsworker

if($list.Length -gt 0){
    $childId = $list[0].Id
    $instance = Get-CimInstance Win32_Process -Filter "ProcessId = '$childId'"
    $parent = Get-Process -Id $instance.ParentProcessId
    Start-Process $parent.Kill() -Verb runAs
}

1903来了
image

1903来了
image

面向普通用户推送是五月下旬。

😋非普通用户一枚?

见到有网友安装后蓝屏或者安装过程中回滚了,win10每次更新都让人惊喜

(十一、二年的老机器)一次过。。。
image

见到有网友安装后蓝屏或者安装过程中回滚了,win10每次更新都让人惊喜

这种通常都是用户程序/驱动的问题多。我台式和sbook基本都能正常升级。

1903依然也有这个问题,测试过了

测试了一下,该问题在 Windows 10 1903的表现是,一段时间后(5分钟?10分钟?)多余的进程会自动消失:
2019-04-26

一段时间后:
2019-04-26 (1)

emmmm 确实,1903,5分钟左右就消失了。

关于1903的安装包,msdn已经放出来了,可以去msdn i tell you 下载~

Was this page helpful?
0 / 5 - 0 ratings