在生产环境中打开控制台会导致Rake assets:precompile被终止

20

我的生产服务器托管在Digital Ocean上,操作系统是Ubuntu 12.04。我安装了RoR 4和rake 10.1.1。

每次部署时,我都会运行rake assets:precompile命令。但如果我在执行此命令时已经打开了rails console终端,就会出现以下输出:

~# rake assets:precompile
~# Killed

主要很烦人,但我希望解决它的原因是在聘请新开发人员时,会出现部署/控制台冲突的噩梦。

谢谢,

Brian

5个回答

64

你的预编译过程可能会因为内存不足而被终止。你可以在另一个ssh会话中运行top来确认这一点。为了解决这个问题,需要创建一个交换文件,当内存已满时将其用作备用。

在Ubuntu上创建SWAP空间 如果你计划在Digital Ocean 512MB RAM droplet上使用Rails,你可能最终需要一些交换空间。具体来说,当编译资源时耗尽内存,进程就会被悄悄地杀死,从而阻止成功部署。

要查看是否有交换文件:

sudo swapon -s

没有显示交换文件?检查一下你有多少磁盘空间:

 df
创建交换文件:
步骤1:为交换分配一个文件。
sudo fallocate -l 2048m /mnt/swap_file.swap

步骤2:更改权限

sudo chmod 600 /mnt/swap_file.swap

步骤三:格式化文件以进行设备交换

sudo mkswap /mnt/swap_file.swap

步骤4:启用交换空间

sudo swapon /mnt/swap_file.swap

第5步:确保交换空间在重新启动时已挂载。首先,打开fstab文件。

sudo nano /etc/fstab

最后,在fstab中添加条目(仅在未自动添加时)

# /etc/fstab
/mnt/swap_file.swap none swap sw 0 0 

保存并退出。你已经成功添加了交换空间。现在你的rake assets:precompile命令应该可以顺利完成而不会被杀掉。


我想我只是要买更多的电脑,谢谢你的回答,虽然这很有道理! - OneChillDude
2
如果fallocate“失败:操作不支持”,则改用以下命令:sudo dd if=/dev/zero of=/mnt/swap_file.swap bs=1024 count=2097152 - Jason R
我刚刚再次遇到了这个问题,但这次是在使用Capistrano时出现的。在预编译资产时,Cap deploy失败并显示“Cannot allocate memory - /usr/local/rvm/rubies/...”错误。上述步骤仍然有效,并解决了该问题。 - Jason R
2
在部署到 AWS 弹性 Beanstalk t1.micro 免费层时遇到了相同的问题。这解决了该问题。 - Ryan.lay
1
这是我读过的最好的Stack Overflow答案之一。谢谢!已确认在弹性Beanstalk Micro 5/12/17上运行! - Joseph Combs

1

Rake assets:precompile是一个占用内存大的进程。

因此,在使用该命令之前,请确保您有足够的RAM。


0

这可能对某些人有所帮助。对于我来说,由于无法使用“fallocate”命令,我不得不执行以下操作:

sudo dd if=/dev/zero of=/mnt/4GB.swap bs=4096 count=1048576
sudo chmod 600 /mnt/4GBB.swap
sudo mkswap /mnt/4GB.swap
sudo swapon /mnt/4GB.swap

0

这会使用大量的RAM。要检查您有多少可用的空闲RAM内存,请使用以下命令:

free -m

这将显示可用的RAM大小(以MB为单位)。

一个临时解决方案是创建交换空间。

在您执行Jason R上述步骤之前,我打算将此作为评论添加,只是为了确保这是RAM资源问题。

您还可以运行以下命令:

echo {1,2,3} > /proc/sys/vm/drop_caches

来清理缓存内存,但它可能不会释放足够的内存。


0
我在AWS上有一个OpsWorks堆栈,我想更改我的实例类型。 我之前使用的是t1.micro,现在已经更改为t1.small。
非常感谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接