在Linux中,让一个Electron应用程序与其父进程分离



如何让Electron应用程序在Linux上与其父进程分离,以便在从终端启动时,终端会像进程退出一样继续运行(可以输入下一个命令等(。从终端启动VisualStudioCode就是我试图实现的一个例子。

创建您自己的启动器,您可以将其与前几天的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);
}
});

在命令前面加上nohup。示例:nohup ping 8.8.8.8 -c 100 </dev/null &>/dev/null &。如果你关闭你的终端,从另一个终端检查ps aux | grep ping,你会发现它仍然在运行。阅读更多关于nohupdisown和此处的符号(&(

对上面的例子进行了一些澄清:</dev/null用于使每个读取调用都接收一个EOF(实际上,您的应用程序不会被困在等待输入(,而&>/dev/nullstdinstdout重定向到/dev/null(因为一旦应用程序从控制终端分离,它就不会在任何地方写入(。&只是直接在后台运行进程。

最新更新