为什么Heroku拒绝访问/ dev / stdout和/ dev / stderr?

时间:2014-03-27 17:09:15

标签: heroku

我想配置一个应用程序来将日志写入/ dev / stdout,以便它们最终出现在Heroku的logplex中。但是我得到Permission Denied试图写入/ dev / stdout。

我不是在寻找解决方法。我可以做很多的东西。我真的只想知道为什么Heroku否认开放并写入/ dev / stdout,如果有人对此有所了解的话。谢谢!

2 个答案:

答案 0 :(得分:3)

Permission Denied错误的原因是/dev/stdout符号链接悬空而不是终止于/dev/pts中分配的伪tty:

~ $ ls -l /dev/stdout /proc/self/fd/1 /dev/pts/0
lrwxrwxrwx 1 root root 15 2014-03-29 17:21 /dev/stdout -> /proc/self/fd/1
lrwx------ 1 u59417 59417 64 2014-03-29 17:25 /proc/self/fd/1 -> /dev/pts/0
ls: cannot access /dev/pts/0: No such file or directory

由于悬空符号链接终止于用户没有写入权限的目录(/dev/pts),操作系统拒绝创建不存在的/dev/pts/0

关于/dev/pts/0不存在的原因:Heroku的虚拟化基于LXC(参见https://devcenter.heroku.com/articles/dynos#technologies)。这并不排除伪tty分配,但在这种情况下,伪tty可能在主机OS中分配,并且guest容器不在/dev/pts中继承(无论是有意还是无意,这将是一个相关的问题)。

答案 1 :(得分:0)

Heroku正在运行Ubuntu。默认情况下,Ubuntu阻止访问/ dev / stdout等(apparmor)。 Heroku鼓励您直接使用应用程序流写入STDOUT / STDERR,而不是手动写入/ dev中的STDOUT流。

更新:这是不正确的 - @Aron Griffis把它直接放在上面 - 谢谢!