如何将 STDIO 从线程进程传输到 /dev/null?

如何将 STDIO 从线程进程传输到 /dev/null?

我正在尝试跑步Plarium 玩酒,但遇到了一个奇怪的问题。当尝试从常规桌面条目启动它时,我收到以下 JavaScript 错误:

错误0

如果我从终端启动,则不会发生这种情况。如果我尝试从桌面条目启动它,即使是一个管道到 /dev/null,在第一次登录后,没有先从终端启动 Plarium Play,我会收到两个 JavaScript 错误,一个接一个:

错误1 错误2

在这两种情况下,在消除它们之后,溅起的水花会永远挂起。

如果我首先从命令行启动 Plarium Play,然后使用修改后的桌面条目(使用指向 /dev/null 的 stdio 管道)进行后续启动,则不会发生这种情况。值得注意的是,即使我按 Ctrl+C 或关闭终端,从终端启动的程序也会继续运行,并且稍后使用管道桌面条目启动比初始终端启动更快,因此我假设它正在启动后台进程。另外值得注意的是,如果我在收到上述启动错误后尝试启动 Plarium Play 而不注销,它会认为 Plarium Play 的实例正在运行,并立即退出。

即使我确实从终端启动了该服务,我也无法从桌面条目启动 Plarium Play,除非我将其修改为至少在某处通过管道传输常规 stdio。如果我尝试使用未经修改的桌面条目,我会收到与上述类似的 JavaScript 错误:

错误3

值得注意的是,只要我从终端执行此操作或通过管道输出,我仍然可以在最后一个错误发生后重新启动 Plarium Play,而无需注销。

我的结论是,由于 JavaScript 和 Electron 的限制(我对两者都知之甚少),调用后台服务现有实例的程序的初始阶段需要在某个地方进行调试,就像服务启动的初始阶段一样。问题是,服务启动当然会发送到单独的线程,因此不会使用启动命令中的常规 >​​ 管道,尽管它会成功找到常规终端的 stdio。但是,由于某种原因,将桌面文件配置为在终端中执行并不能解决问题。请注意,任何成功的启动都会显示 Plarium Play 的 Electron GUI,正如其预期的那样。

假设这个结论是正确的(如果您认为不正确,请告诉我),我该怎么做才能将服务器启动线程尝试的 stdio 访问通过管道传输到 /dev/null (或任何地方),这样我就不会每次登录时首先从命令行启动 Plarium Play?

答案1

当您运行桌面文件时,文件描述符标准输入(0),标准输出(1) 和标准错误(3)关闭。您的应用程序期望能够(至少)写入标准输出但由于该文件描述符未打开,因此会导致程序崩溃。

解决方案是打开描述符,但将它们重定向到/dev/null

application >/dev/null 2>&1

顺序很重要:首先我们重定向标准输出,然后我们重定向描述符 2 (标准错误) 复制描述符 1 (标准输出,现附于/dev/null)

相关内容