如何解决在 Linux 中让一个 Electron 应用程序从其父进程中分离自己
你如何让一个 Electron 应用程序与它在 Linux 上的父进程分离,这样当它从终端启动时,终端就像进程退出一样继续运行(可以输入下一个命令等)。从终端启动 Visual Studio Code 是我想要实现的目标之一。
解决方法
使用 nohup 为您的命令添加前缀。示例:nohup ping 8.8.8.8 -c 100 </dev/null &>/dev/null &
。如果您关闭终端,并从另一个终端检查 ps aux | grep ping
,您会看到它仍在运行。详细了解 nohup
、disown
和与符号 (&) here
对上述示例的一些说明:</dev/null
用于使每个读取调用接收一个 EOF(实际上您的应用程序不会卡在等待输入),并且 &>/dev/null
重定向 {{1} } 和 stdin
到 stdout
(因为您的应用程序将不会在任何地方写入,一旦它与控制终端分离)。 /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);
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。