【问题标题】:how to investigate Process.Start() failure?如何调查 Process.Start() 失败?
【发布时间】:2019-02-02 02:44:37
【问题描述】:

希望这是一个有效的问题。
这是我维护的遗留代码。
Windows 服务(以 SYSTEM 或“专用服务用户”身份登录)将执行可移植的 python exe,即带有附加参数的 python.exe 运行代码 (.pyc)。

问题:
Process.Start() 没有抛出异常并且它返回 false,有没有办法调查原因?请不要粘贴 MSDN 文档,我已经阅读了足够多的时间。
我尝试使用 UseShellExecute true/false 执行 python,没关系,不起作用。

C# Windows 服务代码:

var processInfo = new ProcessStartInfo(_pythonExePath/*path to python.exe*/, exeParams/*path to pyc, and additionl params*/)
{
    WorkingDirectory = workingDirectory
};
var process = new Process
{
    StartInfo = processStartInfo,
    EnableRaisingEvents = true
};
process.Start();

当我使用命令行参数执行 python.exe(作为“专用服务用户”并且使用 psexec 作为 SYSTEM)时,它起作用了。

调用 GetLastError() 或 Marshal.GetLastWin32Error() 返回 0。
事件查看器(应用程序、系统、安全)中没有任何内容

我用进程监视器捕获了 2 个执行,一个有效,一个无效。两次执行都显示 python.exe 已启动,之后当然有数千次调用.. 我想调查什么?如何查看安全策略是否阻止了我的 exe?

谢谢。

【问题讨论】:

  • 进程监视器(可从 Microsoft 网站获得)可能会有所帮助。
  • 如果你只是想知道为什么启动失败,也许你可以在windows事件日志中找到一些线索
  • 事件查看器中没有任何内容。也没有杀毒软件。
  • pyc 的路径是相对的还是绝对的?
  • @ilansch 如果 pyc 在本地驱动器中会有所不同吗?

标签: c# windows service process process.start


【解决方案1】:

查看文档以获取 Process.Start 的返回值

如果进程资源已启动,则为真;如果没有启动新的进程资源(例如,如果重用现有进程),则为 false。

所以false不一定表示Process.Start出现错误;如果有错误,它应该抛出一个异常,它不会只是设置错误代码并默默地转到下一行。

正如Harry 在评论中所建议的,使用Process Monitor 监控python.exe 是一个好的开始。

【讨论】:

  • 如果我的进程没有启动,或者没有立即启动和停止,我会在 procmon 上看到它吗?
  • 如果您的代码无法启动 python.exe 应该有一个异常,如果未处理将导致 Windows 服务崩溃。 ProcMon 只是记录一个进程所做的一切,即使该进程只存在几毫秒。
  • 得到了进程监视器的输出。进程启动,镜像创建,Process.Start怎么返回false?
  • @ilansch false 表示重用现有进程。 Microsoft Word 表现出相同的行为,当您在已经打开一个文档的情况下打开第二个 word 文档时,会激活同一个 word 应用程序,而不是启动一个新的 word 应用程序。
  • 我知道,VM 上没有现有的 python.exe 进程实例。此外,一旦执行,我在进程监视器上看到了一个使用 python.exe 创建图像命令。
猜你喜欢
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多