在 Linux 中让 Electron 应用程序从其父进程中分离出来

Have an Electron App detach itself from its parent Process in Linux

如何让 Electron 应用程序在 Linux 上从其父进程中分离出来,以便当它从终端启动时,终端继续进行,就好像进程已退出(可以输入下一个命令等) ).从终端启动 Visual Studio 代码是我要实现的目标之一。

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

对上述示例的一些说明:</dev/null 用于使每个读取调用都收到 EOF(实际上您的应用程序不会因等待输入而卡住),并且 &>/dev/null 重定向 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);
  }
});