我想配置一個應用程序,將日誌寫入/ dev/stdout,以便它們最終位於Heroku的邏輯卷組中。但是,我獲得權限拒絕嘗試寫入/ dev/stdout。爲什麼Heroku拒絕訪問/ dev/stdout和/ dev/stderr?
我不在尋找解決方法。我可以煮很多。我真的很想知道爲什麼Heroku拒絕打開並寫入/ dev/stdout,如果有人對此有所瞭解。謝謝!
我想配置一個應用程序,將日誌寫入/ dev/stdout,以便它們最終位於Heroku的邏輯卷組中。但是,我獲得權限拒絕嘗試寫入/ dev/stdout。爲什麼Heroku拒絕訪問/ dev/stdout和/ dev/stderr?
我不在尋找解決方法。我可以煮很多。我真的很想知道爲什麼Heroku拒絕打開並寫入/ dev/stdout,如果有人對此有所瞭解。謝謝!
的原因權限被拒絕的錯誤是/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
(不管是有意還是無意中,這將是一個相關問題)繼承它。
Heroku正在運行Ubuntu。默認情況下,Ubuntu會阻止對/ dev/stdout等的訪問(apparmor)。 Heroku鼓勵您直接用應用程序流寫入STDOUT/STDERR,而不是手動寫入/ dev中的STDOUT流。
更新:這是不正確的 - @Aron格里菲斯得到它正確的上面 - 謝謝!
Ubuntu不會正常阻止對'/ dev/stdout'的訪問。 AppArmor策略僅針對從父進程繼承標準文件描述符的其他用戶(例如使用'su')來阻止它。在任何情況下,這都不適用,因爲Heroku容器中的問題是懸掛符號鏈接(請參閱上面的答案) –
謝謝!我已經修改了我的答案以指出你的意思 - 抱歉!我正在記憶中,應該看看。 – rdegges