You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

React项目后台运行失败:nohup执行npm start报EBADF错误

解决React项目用nohup后台运行时出现EBADF错误的问题

你遇到的核心问题是React开发服务器依赖终端交互,而你的命令把所有输出重定向到/dev/null的同时,没处理标准输入的问题,导致进程触发未捕获的EBADF错误直接崩溃了。下面给你几个可行的解决方案:

方案1:修复nohup命令,补充标准输入重定向

把你的命令修改为:

nohup npm start > /dev/null 2>&1 < /dev/null &

为什么这样有效?

React的react-scripts start启动的开发服务器会尝试读取标准输入(stdin),当你用&把进程放到后台时,它的stdin会被关闭。如果不把stdin重定向到/dev/null,进程尝试从已关闭的文件描述符读取数据时,就会抛出EBADF错误。补充< /dev/null后,相当于告诉进程从“空设备”读取输入,避免了这个报错。

方案2:使用专业进程管理工具(推荐长期运行场景)

如果需要长期后台运行React项目,更推荐用PM2这类工具,比nohup更稳定且方便管理:

  1. 先安装PM2:
npm install -g pm2
  1. 启动你的React项目:
pm2 start npm -- start
  1. 查看进程状态:
pm2 status
  1. 查看日志:
pm2 logs

PM2会自动帮你处理进程的后台运行、日志管理、崩溃重启等问题,比手动用nohup省心很多。

方案3:用screen/tmux保留终端会话(适合调试阶段)

如果只是临时需要后台运行且可能需要随时查看终端输出,可以用screen或tmux:

  1. 安装screen(以Ubuntu为例):
sudo apt install screen
  1. 启动screen会话:
screen
  1. 在会话里运行npm start
  2. Ctrl+A+D脱离会话,此时终端断开也不会影响进程
  3. 之后要重新查看会话,运行:
screen -r

关于错误日志的解释

你看到的EBADF: bad file descriptor, read错误,本质是进程尝试从已经关闭的文件描述符(这里是标准输入)读取数据,而React开发服务器没有处理这个异常,导致进程直接终止。只要解决了stdin的问题,这个错误就会消失。

内容的提问来源于stack exchange,提问作者Jurgen Swensen

火山引擎 最新活动