在 Linux 中让一个 Electron 应用程序从其父进程中分离自己

问题描述

你如何让一个 Electron 应用程序与它在 Linux 上的父进程分离,这样当它从终端启动时,终端就像进程退出一样继续运行(可以输入下一个命令等)。从终端启动 Visual Studio Code 是我想要实现的目标之一。

解决方法

使用 nohup 为您的命令添加前缀。示例:nohup ping 8.8.8.8 -c 100 </dev/null &>/dev/null &。如果您关闭终端,并从另一个终端检查 ps aux | grep ping,您会看到它仍在运行。详细了解 nohupdisown 和与符号 (&) here

对上述示例的一些说明:</dev/null 用于使每个读取调用接收一个 EOF(实际上您的应用程序不会卡在等待输入),并且 &>/dev/null 重定向 {{1} } 和 stdinstdout (因为您的应用程序将不会在任何地方写入,一旦它与控制终端分离)。 /dev/null 只是直接在后台运行进程。

,

创建您自己的启动器,您可以将其与前几天的 CLI 脚本结合起来。

这将假设如果 IPC 服务器未运行,它将启动并分离您的应用程序。您需要立即在您的应用程序中启动 IPC 服务器,即使这样也会出现竞争条件,但如果您使用 requestSingleInstanceLock,您应该没问题。

这是更新后的 CLI 脚本

#!/usr/bin/node
const net = require('net'),{spawn} = require('child_process'),APP_LOC = '/path/to/electron-app';

let args = process.argv;
args.shift(); // Drop /usr/bin/node 
args.shift(); // Drop script path

let line = args.join(' ');
net.connect('/tmp/my-app.sock',(conn)=>{
  conn.setEncoding('utf8');
  conn.on('data',(response)=>{
    console.log(response);
    process.exit(0);
  });
  conn.write(line+'\n');
}).on('error',(err)=>{
  if(err.code == 'ENOENT') {
    console.log('Attempting to launch application');
    const cp = spawn(APP_LOC,{
      detached: true,stdio:'ignore',}).on('error',(err) => {
      console.error(err);
      process.exit(2);
    }).on('spawn',() => {
      cp.unref();
      console.log('Application launched');
      process.exit(0);
    });
  }
  else {
    console.error(err);
    process.exit(1);
  }
});