Rails 7下配置systemd运行jsbundling-rails监听服务异常问题咨询
问题解决方法
根因分析
- esbuild 默认的
--watch监听模式存在交互环境依赖:当检测到标准输入(STDIN)被关闭时,会在单次构建完成后自动退出 - systemd 运行后台服务时默认不会分配 TTY,且默认将
StandardInput设为 null,因此触发了 esbuild 的自动退出逻辑,表现为进程直接以退出码0终止
解决方案
推荐最稳妥的修改方案,无需调整systemd默认配置:
- 可选方案一(推荐):修改项目根目录下的
package.json文件,找到scripts段的build配置,给 esbuild 命令添加--watch=forever参数,修改后示例:
{ "scripts": { "build": "esbuild app/javascript/*.* --bundle --outdir=app/assets/builds --watch=forever" } }
- 可选方案二(无需修改项目配置):直接调整systemd服务的
ExecStart配置,直接传入参数:
ExecStart=/usr/local/bin/yarn --verbose build --watch=forever
- 可选方案三(不推荐):如果不想修改esbuild参数,也可以调整systemd服务配置,分配伪TTY模拟交互环境,在Service段添加如下配置:
StandardInput=tty TTYPath=/dev/tty
配置修改完成后,执行以下命令生效:
sudo systemctl daemon-reload sudo systemctl restart rails_app_js_watcher.service
验证
执行systemctl status rails_app_js_watcher.service查看服务状态,若显示active (running)即为配置生效,esbuild已进入持久监听模式。
内容的提问来源于stack exchange,提问作者wojja
相关产品推荐
相关产品推荐

