从Heroku上的nodejs app调用可执行文件会导致“权限被拒绝”,但是从bash运行是可以的。为什么?

时间:2016-09-23 14:48:15

标签: node.js bash heroku

我们在Heroku上有一个nodejs应用程序。代码中的某处我们运行

var spawn = require('child_process').spawn;
var child = spawn('/bin/bash', ['-c', '/app/node_modules/wkhtmltopdf-prebuilt/bin/linux64/bin/wkhtmltopdf' + ' | cat ; exit ${PIPESTATUS[0]}']);

但是如果我们这样做,我们得到Permission denied,即使可执行文件是chmod 0777.如果我从Heroku bash运行wkhtmltopdf命令,它运行正常。就在我们从节点内运行它时,我们得到Permission Denied

此外,如果我们只是在节点内fs.readFileSync()甚至fs.unlinkSync(),我们就不会遇到任何问题。该文件可以被读取,写入,删除等。

有人有指针吗?

1 个答案:

答案 0 :(得分:0)

所以我发现了这个问题。实际上,这真是太愚蠢了。我们正在chmod进行heroku run bash,我认为会在实际运行的网络动态上运行bash。

然而,事实证明,运行heroku run bash将使用文件系统等的副本启动一次性dyno。因此,当我执行chmod并检查节点是否可以读取,删除等,然后我确实可以,但那是在一次性系统上,而不是在正在运行的网络dyno上。

虽然在一次性dyno上进行chmodding,但在web dyno上没有任何实际改变,因此同样的Permission Denied错误不断出现。