为何使用spawnSync执行命令时,&后台运行方式失效?
问题解决:spawnSync中&后台运行失效的原因及方案
原因分析
spawnSync是同步阻塞的方法,它会等待整个shell会话(包括所有后台进程)完全结束后才返回结果。虽然你在命令里加了&把npm run startServer放到后台,但因为startServer是永久运行的,shell会话会一直等待这个后台进程结束,导致后续的echo "*** End"永远无法执行,spawnSync也一直卡着。
而直接在bash中运行时,交互式shell不会等待后台进程结束,所以能正常执行后续命令,这就是两者表现不同的核心原因。
解决方案
方案1:改用异步的spawn(推荐)
如果不需要同步等待执行结果,直接用异步的spawn代替spawnSync,它不会阻塞当前进程,后台命令和后续命令都能正常执行:
const { spawn } = require('child_process'); spawn(`echo "*** Begin" && npm run startServer & echo "*** End"`, { stdio: ["ignore", "pipe", "inherit"], encoding: "utf-8", shell: true, });
方案2:让后台进程脱离shell会话(必须用spawnSync时)
如果一定要用spawnSync,需要让startServer脱离当前shell会话的控制,这样shell可以在启动后台进程后立即结束,spawnSync就不会卡住。可以用nohup结合输出重定向实现:
const { spawnSync } = require('child_process'); spawnSync(`echo "*** Begin" && nohup npm run startServer > /dev/null 2>&1 & echo "*** End"`, { stdio: ["ignore", "pipe", "inherit"], encoding: "utf-8", shell: true, });
nohup:让进程忽略挂起信号,即使当前shell退出,进程也能继续运行> /dev/null 2>&1:将标准输出和错误输出重定向到/dev/null,避免生成默认的nohup.out文件
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

