为什么“vagrant ssh -c'cabal build'”产生一个空的二进制文件?

时间:2014-03-16 18:18:25

标签: linux haskell vagrant cabal

我正在使用Vagrant在Linux上构建我的Haskell Cabal项目。当我在Vagrant VM中cabal build时,生成的二进制文件很好。当我尝试使用vagrant ssh -c 'cabal build'从主机编写脚本时,会生成零大小的二进制文件。编译显然有效但我认为一旦链接器启动,Vagrant shell就会关闭并终止链接。为什么会发生这种情况?

经过一些谷歌搜索,我只能找到一个SO question that looked similar

在IRC的帮助下,我们能够确定这是有效的:

ssh vagrant@127.0.0.1 -p 2222 -i .vagrant.d/insecure_private_key 'cabal build'

这是调试模式下的ssh命令vagrant ssh转储,它不起作用:

["vagrant@127.0.0.1", "-p", "2222", "-o", "Compression=yes", "-o", "DSAAuthentication=yes", "-o", "LogLevel=FATAL", "-o", "StrictHostKeyChecking=no", "-o", "UserKnownHostsFile=/dev/null", "-o", "IdentitiesOnly=yes", "-i", ".vagrant.d/insecure_private_key", "-t", "bash -l -c 'pwd'"]

使用演绎我发现ssh -t导致问题。来自文档:

 -t      Force pseudo-tty allocation.  This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services.
         Multiple -t options force tty allocation, even if ssh has no local tty.

现在问题是为什么-t会导致cabal build失败?

使用错误cabal build -v3运行/usr/bin/ghc returned ExitFailure 9,我认为这意味着内存不足。

1 个答案:

答案 0 :(得分:0)

当内存不足时,OOM会杀死GHC。 ssh -t标志显然足以超过阈值。已确认/var/log/syslog。解决方案是简单地为VM分配更多内存。感谢Freenode上的tibber和teukka。