2014-03-27 49 views
3

我想配置一個應用程序,將日誌寫入/ dev/stdout,以便它們最終位於Heroku的邏輯卷組中。但是,我獲得權限拒絕嘗試寫入/ dev/stdout。爲什麼Heroku拒絕訪問/ dev/stdout和/ dev/stderr?

我不在尋找解決方法。我可以煮很多。我真的很想知道爲什麼Heroku拒絕打開並寫入/ dev/stdout,如果有人對此有所瞭解。謝謝!

回答

3

的原因權限被拒絕的錯誤是/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可能在主機操作系統中分配,並且訪客容器未在/dev/pts(不管是有意還是無意中,這將是一個相關問題)繼承它。

0

Heroku正在運行Ubuntu。默認情況下,Ubuntu會阻止對/ dev/stdout等的訪問(apparmor)。 Heroku鼓勵您直接用應用程序流寫入STDOUT/STDERR,而不是手動寫入/ dev中的STDOUT流。

更新:這是不正確的 - @Aron格里菲斯得到它正確的上面 - 謝謝!

+1

Ubuntu不會正常阻止對'/ dev/stdout'的訪問。 AppArmor策略僅針對從父進程繼承標準文件描述符的其他用戶(例如使用'su')來阻止它。在任何情況下,這都不適用,因爲Heroku容器中的問題是懸掛符號鏈接(請參閱上面的答案) –

+0

謝謝!我已經修改了我的答案以指出你的意思 - 抱歉!我正在記憶中,應該看看。 – rdegges

相關問題