部署Node.js至Heroku Scheduler遇Shebang行错误求助
我最近尝试把一个小型Node.js应用部署到Heroku,还用Heroku Scheduler设置每10分钟运行一次。这个应用之前是客户的前供应商在Heroku托管的,我以为直接用拿到的源码就行,结果Heroku日志里出现了错误:
2018-05-09T07:26:07.710882+00:00 app[api]: Starting process with command
fetchby user scheduler@addons.heroku.com
2018-05-09T07:26:11.124833+00:00 heroku[scheduler.2653]: Starting process with commandfetch
2018-05-09T07:26:11.718182+00:00 heroku[scheduler.2653]: State changed from starting to up
2018-05-09T07:26:13.647479+00:00 heroku[scheduler.2653]: State changed from up to complete
2018-05-09T07:26:13.629258+00:00 heroku[scheduler.2653]: Process exited with status 126
2018-05-09T07:26:13.542885+00:00 app[scheduler.2653]: bash: /app/bin/fetch: /usr/local/bin/node: bad interpreter: No such file or directory
一看就知道是运行index.js的fetch文件里的Shebang行出问题了,那行内容是:
#!/usr/local/bin/node var path = require('path'); require(path.join(__dirname, '../index')).start();
我是Node.js新手,不太懂Shebang行的作用,但猜是路径错了,请问该怎么改这一行?
别担心,这个问题其实挺常见的,尤其是在不同托管环境之间切换时。先给你简单解释下Shebang行的作用:它是用来告诉操作系统,要用哪个解释器来执行当前这个脚本文件,比如这里就是指定用Node.js来运行这个fetch脚本。
Heroku上的Node.js安装路径和你现在写的/usr/local/bin/node不一样,不过我们有两个简单的解决办法:
- 方案一:用环境变量自动查找Node路径(推荐)
把Shebang行改成:
#!/usr/bin/env node
/usr/bin/env会自动在系统的环境变量PATH里找到Node.js的正确执行路径,不管是在本地开发环境还是Heroku这种托管平台,这个写法都更通用,能避免硬编码路径带来的适配问题。
- 方案二:直接使用Heroku的Node路径(不推荐)
如果你非要硬编码路径,Heroku的Node.js实际路径是/app/.heroku/node/bin/node,但这个方案不够灵活——万一Heroku以后调整了Node的安装路径,你的脚本又会出问题,所以还是第一个方案更靠谱。
另外,记得确保fetch文件有可执行权限,不过Heroku在部署过程中一般会自动处理这个;如果本地测试时遇到权限问题,可以先运行chmod +x bin/fetch再提交代码。
内容的提问来源于stack exchange,提问作者RonRonDK

