在 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
,您会看到它仍然是 运行。详细了解 nohup
、disown
和符号 (&) here
对上述示例的一些说明:</dev/null
用于使每个读取调用都收到 EOF(实际上您的应用程序不会因等待输入而卡住),并且 &>/dev/null
重定向 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);
}
});
如何让 Electron 应用程序在 Linux 上从其父进程中分离出来,以便当它从终端启动时,终端继续进行,就好像进程已退出(可以输入下一个命令等) ).从终端启动 Visual Studio 代码是我要实现的目标之一。
在您的命令前加上 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
重定向 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);
}
});