如果该终端已关闭(按下关闭按钮)并使用 CTRL+C,则可以使用 NodeJS 生成终端并触发 closeHandler

Is possible spawn terminal using NodeJS and trigger closeHandler if that terminal has been Closed (with press close button) and with CTRL+C

您好!

我的 OS 目前在 Linux,我的目标是 .spawn() 另一个终端,并使用命令 tail -f app.log 观察该终端的父进程输出,它是 运行很好用这个...

代码

const xec = spawn('gnome-terminal', ['-x', 'bash', '-c', '"tail -f app.log; exec bash"'], {
    shell: true
});

但如果终端已关闭并使用 CTRL+C,我无法触发 .spawn(),即使使用此...

代码

// Trigger when terminal is show
xec.stdout.on('end', () => {
    console.log('stdout: End');
});

// Not response
xec.stdout.on('exit', () => {
    console.log('stdout: Exit');
});

// Trigger when terminal is show
xec.stdout.on('close', () => {
    console.log('stdout: Close');
});

// Not response
xec.on('close', () => {
    console.log('xec: Close');
});

// Trigger when terminal is show
xec.on('exit', () => {
    console.log('xec: Exit');
});

如果从 OP 问题中不清楚 CTRL/C 是发送给原始 window 还是发送给 spanwed window。从表面上看,描述的问题与 CTLR/C 发送到原始 window(节点程序启动的地方)有关。

'CTRL/C' 可以作为全局进程对象上的信号事件被捕获。参见 https://nodejs.org/api/process.html#process_signal_events

const process = require('process');
...
process.on('SIGINT', () => { console.log("INT")));

旁注:考虑将“--wait”添加到 gnome 命令行。它将允许节点从子进程获取正确的信号,并启用 xec.on 事件。消除将事件放在 xec.stdout

上的需要
const xec = spawn('gnome-terminal', ['--wait' '-e', 'tail -f app.log'], {
    shell: true
});

我可以触发关闭按钮,也可以用 CTRL+C 来触发...

代码

const command = 'gnome-terminal --disable-factory -- /bin/bash -i -c "tail -f app.log; exec bash"'
const xec = exec(command, (err, out, derr) => {
        console.log(`Error: ${err}`);
        console.log(`Out: ${out}`);
        console.log(`derr: ${derr}`);
});

我只是添加 --disable-factory。另外 --disable-factory 不支持较新的版本,但到目前为止我正在使用 v3.28.1 它仍然可以正常工作。看到这个 issue also this blog