virtual memory exhausted: Cannot allocate memory

今天在VPS上pip install -r requirements.txt的时候,报了这个错误。
不是很知道原因是什么,

dd if=/dev/zero of=/swap bs=1024 count=1M 
//Format the swap file: 
mkswap /swap 
//Enable the swap file: 
swapon /swap 
//Enable swap on boot: 
echo "/swap swap swap sw 0 0" >> /etc/fstab

根据网上的搜索结果,这样做就解决问题了。

Ubuntu 升级至PHP7.0

  1. sudo add-apt-repository ppa:ondrej/php
  2. sudo apt-get update
  3. sudo apt-get install php7.0 php7.0-mysql php7.0-curl php7.0-gd php7.0-json php7.0-mcrypt php7.0-opcache php7.0-xml libapache2-mod-php7.0
  4. (nginx)sudo apt-get install php7.0-fpm

安装时遇到了这个错误:

>sudo apt-get install php7.0
正在读取软件包列表... 有错误!
E: Encountered a section with no Package: header
E: Problem with MergeList /var/lib/apt/lists/cn.archive.ubuntu.com_ubuntu_dists_trusty_main_i18n_Translation-en
E: 无法解析或打开软件包的列表或是状态文件。
>sudo rm /var/lib/apt/lists/* -vf

后再执行,出现这个问题:

sudo apt-get install php7.0
[sudo] password for skys215: 
正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:

下列软件包有未满足的依赖关系:
 php7.0 : 冲突: php5 (< 5.6.16+dfsg-4~) 但是 5.5.9+dfsg-1ubuntu4.14 正要被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

使用命令

sudo apt-get -y purge php.*

删除所有以php开头的包即可。(注意该操作也会移除phpmyadmin,后面再安装一遍就好了)

在我的电脑会移除

  libapache2-mod-php5* php-gettext* php-pear* php-seclib* php-tcpdf* php5-cli*
  php5-common* php5-curl* php5-dev* php5-fpm* php5-gd* php5-imagick*
  php5-intl* php5-json* php5-mcrypt* php5-mysql* php5-readline* php5-sqlite*
  phpmyadmin* pkg-php-tools*

这些包。如果安装7.0后出现包缺失的问题,装回去就好了。

参考网页:
How To Upgrade to PHP 7 on Ubuntu 14.04

Polipo命令行使用方法

polipo是一款把socks协议转换成http/https协议的软件。
通过这款软件可以在命令行下使用shadowsocks的代理。

先装polipo
然后在命令行中输入polipo socksParentProxy=localhost:1080
1080为shadowsocks的本地端口。

之后可以在命令行中输入export http_proxy=http://plamenatv.free.bg/up.html来让本次会话使用shadowsocks的代理。
8123为默认的polipo端口。
设置完成之后,在当前会话中使用网络连接,会先经8123端口,polipo再把数据包丢给shadowsocks的1080端口,然后再到外部。

如果只是在个别命令使用代理,那么请自行查阅资料。
有些命令是使用--proxy参数来设置代理。

Mysql table doesn't exist

前段时间,在用着数据库的时候,突然就提示数据库不存在(Errno 1146 Table doesn't exist)。
然而怎么重启,数据表就是存在啊! 真是奇怪。
当初遇到这个问题是在公司,所以我赶紧换Linux系统继续开发。
之后也因为各种事情,以及尝试了一些小方法之后也没有解决,就这么忘记了。

过了两个月,我在做学校作业的时候又遇到了这个问题。
重新导了一遍数据库未果,于是又切换Linux继续工作。

就在今天,又遇到了这个问题。
我就下定决心解决。
在查阅了一些资料后,得到如下方法:

  1. 备份
  2. alter table tbl_name discard tablespace 删除表空间。
    但是,我在执行这句的时候,也报了这个错。

于是我直接重命名了ibd文件的后缀。(划掉)
于是我用drop table tbl_name删除了表。
虽然删除的时候也会报table doesn't exist 的错,但是用show tables这个命令查看表时,那个表却不见了。

  1. 从备份的数据库创建具有相同表结构的表。(还好我在服务器上也有这个库……)
  2. 把新生成的tbl_name.ibd文件用备份的同名ibd文件覆盖。此时,可能ibd文件会处于被占用状态。
    就解决了。

问题是解决了,但是还是不知道为什么引发了这个问题。
后续我会关注这个问题,留意这个问题是在什么情况下产生的。

2017-04-26 更新
今天在写代码的时候,突然发现删不了数据库。
搜索一番发现也没什么有效的解决方案。
看log后发现,它报的是“Too many open files”。
然后想起来我用Sequel Pro开了5个标签,我关掉一些标签之后,就正常了……