执行execSync后NodeJS spawn命令无法运行的原因咨询
问题原因及解决办法
你的问题出在spawn的参数配置和父进程生命周期的配合上:
当你给
spawn设置detached: true和stdio: 'ignore'时,这个子进程会完全脱离当前Node.js父进程的控制,成为独立的会话进程。但如果你的父进程在execSync执行完毕后很快就退出了,系统会直接回收这个刚启动的脱离子进程——因为它还没来得及完成执行就失去了父进程的上下文(类Unix系统里,父进程退出后这类子进程会被init进程收养,但启动速度赶不上父进程退出速度的话就会被终止)。而
exec('ls -la')没有设置detached,它的子进程和父进程保持关联,父进程不会让它被立刻回收,所以能正常跑完命令。
解决方式
- 如果你不需要子进程完全脱离,去掉
detached: true和stdio: 'ignore'配置:
spawn('ls', ['-la']);
- 如果必须用
detached,可以在spawn后调用child.unref(),让父进程不需要等待这个子进程再退出:
const child = spawn('ls', ['-la'], { detached: true, stdio: 'ignore', }); child.unref();
- 或者让父进程延迟退出,给子进程足够的执行时间:
execSync('ls -la').toString(); const child = spawn('ls', ['-la'], { detached: true, stdio: 'ignore', }); // 延迟1秒再让父进程退出,确保子进程执行完成 setTimeout(() => {}, 1000);
内容的提问来源于stack exchange,提问作者Waldo Valenzuela
相关产品推荐
相关产品推荐

