虚拟机的内存昂贵,买一台内存少的机器然后配置 swap 文件可以省不少钱,当然前提是对虚拟机的性能要求不高。

参见这篇文章:
https://support.rackspace.com/how-to/create-a-linux-swap-file/

用下面的命令初始化 swap 文件,并且把该文件权限修改成为 600。

fallocate -l 4GB /tmp/4GB.swap
mkswap /tmp/4GB.swap
chmod 600 /tmp/4GB.swap

使用 swapon 这个命令可以直接把 swap 文件挂载,但是写到 fstab 文件里是最省事的,所以修改 /etc/fstab 文件,然后添加一行

/tmp/4GB.swap  none  swap  sw 0  0

重启服务器,使用 top 命令会看到系统多出了 4GB 的 swap 内存。

首先确保已经安装了ncurses,然后使用以下其中一个命令(32或者64位自行挑选)

ln -s /lib64/libncurses.so.5 /usr/lib/libtinfo.so.5
ln -s /usr/lib/libtinfo.so.5 /usr/lib/libtinfo.so

最开始尝试使用crontab来担任进程down掉之后自动检查以及重启的工作,但是不知道是什么原因,在crontab中设置的自动重启线程并不好用,事实上,根本就不会自动运行检测的脚本,这个之后有时间再查。

急于解决当前的需求,在google一段时间后发现linux下大多都使用daemontools来管理服务进程,于是着手研究。daemontools使用起来并不复杂,在debian/ubuntu当前的发行版本中就已经有daemontools可以直接安装了。

使用apt-get来安装

apt-get install daemontools daemontools-run

如果你不是debian发行版,而恰好碰到supervise not run的错误提示,则表示你的服务并没有打开,你需要运行以下命令来启动service的监视服务。

/etc/init.d/svscan start

添加配置文件
/etc/service目录下建立一个新的目录名称,用于存放你的进程的运行脚本(该脚本文件名称为:run)。所以,假设你的service名称为ume,一个完整的创建好的service目录应该为/etc/service/ume,并且在该目录下有一个可执行的脚本文件名称为:/etc/service/ume/run,请注意检查该脚本文件权限,必须要有可执行权,如果没有可执行权,使用chmod +x /etc/service/ume/run命令来添加执行权。

脚本文件范例

#!/bin/sh
PID_FILE=/var/lock/ume-sc.pid
[ -f $PID_FILE ] && rm $PID_FILE

DATE=`date +%Y-%m-%d_%H-%M-%S`
LOG_FILENAME=/var/log/ume-sc-$DATE.log
echo $LOG_FILENAME > /var/lock/ume-sc.logname
exec /usr/local/bin/ume-sc --config-file=/usr/local/etc/ume-sc.conf > $LOG_FILENAME 2>&1

脚本说明

  • 除了exec命令之外,其它的命令都很容易搞清楚,输出的日志放到了/var/log/ume-sc.log文件中,然后错误日志放到了/var/log/ume-sc-err.log文件中
  • exec的命令的含义是使用之后的命令来替换掉当前的shell脚本的进程,而不再启动一个新的进程(注:这个命令的最后是没有&符号的,也就是说,这个命令是直接在后台运行,不需要额外的后台运行指示)。

注:若不用exec来执行命令则无法使用svc -du来重启进程的。

进程管理

  • 使用svc -u /etc/service/ume来启动你的进程,或者你也可以使用svc -u /etc/service/*来启动所有的进程
  • 使用svc -du /etc/service/ume来重新启动你的进程,对于所有的进程格式同上
  • 使用svc -d /etc/service/ume来停止进程
  • 使用svstat /etc/service/*来查看所有的被监视的进程的状态,特别是uptime是非常有用的,若uptime很短就得考虑是不是进程有经常崩溃的可能

总结:使用daemontools来保证进程运行是非常方便的,svc使用supervise命令来监视目标进程是否有在线,若目标进程掉线则会在5秒钟之内启动一个新的进程,而要完成这一个操作只需要写一个简单的run脚本放到对应的/etc/service目录下,若使用CMakeLists.txt来编译程序,还可以直接把对应的run文件拷贝到/etc/service目录下,简单则是最高效的。

安装

apt-get install iptables

使用日志

使用日志可以很快的排查问题,特别有一些协议访问被BLOCK掉的时候,使用如下的命令

iptables -A INPUT -j LOG --log-prefix "HELLO_"

然后使用以下命令来查看日志

tail -f /var/log/syslog

设置基本规则

下面这句将会设置所有的INPUT包都被DROP掉(忽略掉),添加本规则前一定要记住先添加SSH对应的端口号ACCEPT的规则,不然SSH将直接断开

iptables -P INPUT DROP

清除所有的规则

iptables -F
iptables -X
iptables -Z

添加基本的防火墙设置

#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT  (注意:如果22端口未加入允许规则,SSH链接会直接断开。)
iptables -A FORWARD -j REJECT

屏蔽IP地址

#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP

保存iptables的配置

iptables-save > /etc/iptables.rules

恢复iptables的配置

iptables-restore < /etc/iptables.rules

xargs命令使用-i参数后搭配{}定位参数,例如:

find . | grep mp4$ | xargs -i ls {}

死活链接不到std::string之流的符号的时候,需要增加一个Application.mk文件,至少有以下这一行内容:

APP_STL := gnustl_static

如果上传的文件超过了Nginx的限制,那么会出现:Nginx出现“413 Request Entity Too Large”错误,这时需要修改/etc/nginx/nginx.conf文件,增加以下配置

client_max_body_size 10M;

同时需要修改php.ini文件,修改或增加以下配置

post_max_size = 10M
upload_max_filesize = 10M

1. 修改/etc/sysctl.conf增加

fs.file-max=102400

2. 然后执行

sudo sysctl -p

3. 修改/etc/security/limits.conf增加

* soft nofile 102400
* hard nofile 102400

4. 修改/etc/pam.d/login保证以下语句存在

session required /lib/security/pam_limits.so

5. 在.profile中增加

ulimit -HSn 102400

6. 退出然后再重新登录,使用ulimit -n来查看当前允许打开的最大的文件数量

首先参考这篇文章:http://jaqque.sbih.org/kplug/apt-pinning.html
基本步骤:
1. 修改/etc/apt/sources.list,复制增加testing及unstable的deb源,类似如下

#Stable
deb http://ftp.us.debian.org/debian stable main non-free contrib
deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
 
#Testing
deb http://ftp.us.debian.org/debian testing main non-free contrib
deb http://non-us.debian.org/debian-non-US testing/non-US main contrib non-free
 
#Unstable
deb http://ftp.us.debian.org/debian unstable main non-free contrib
deb http://non-us.debian.org/debian-non-US unstable/non-US main contrib non-free

2. 创建/etc/apt/preferences文件,加入以下内容

Package: *
Pin: release a=stable
Pin-Priority: 700
 
Package: *
Pin: release a=testing
Pin-Priority: 650
 
Package: *
Pin: release a=unstable
Pin-Priority: 600

3. 最后使用sudo apt-get update更新源
4. 安装使用sudo apt-get -t unstable install 来安装,当然也可以使用apt-cache来查找包

废话在前

接触ios编程好长一段时间,Xcode也基本上用熟,刚开始接触Xcode的时候惊叹于其c++代码提示既然可以如此准确,一段时间后发现原来其使用了llvm(wiki:http://zh.wikipedia.org/wiki/LLVM, website:http://llvm.org)的虚拟机编译技术作为语法分析器,而因为是编译后再分析代码(区别于别的C++代码提示器只是简单扫描代码而并不编译),于是其代码提示异常准确。这也正好是苹果从2005年就开始赞助的一个开源编译器项目,而使用llvm作为中间层的clang编译器(wiki:http://zh.wikipedia.org/wiki/Clang)已经展示出了良好的性能并大有取代gcc编译器的趋势。事实上,在freebsd操作系统上,gcc已经被clang取代了。但是搜寻于互联网上,貌似只有Xcode的IDE对clang的前端代码分析支持得最好,不过Xcode只能在MacOS下运行,而其却不是开源项目。自从Borland没落后,我就对被一家公司所控制的工具,语言持有敬而远之的态度,特别是那些非开源的东西,因为只有开源社区维护的项目才能保持活力,而不会是因为公司的一项决策就导致自己几年的技术积累付之东流。

可是怎么办?clang是开源的,用clang作为c++编译器也完全没有问题,但是上哪里去找一个支持clang前端分析的开发环境去呢?vim有一个clang的代码分析插件。好吧,我承认好长一段时间我在Linux服务器上开发软件都是直接用vim在完全没有语法提示的情况下写代码,但,毕竟不方便,有时候一个小函数名称不记得了,还得跑去http://www.cplusplus.com或者http://boost.org上去翻文档,其实vim的clang代码分析插件也有使用过,但是因为当时没有仔细研究,代码提示的速度一直不够理想,直到前几天翻开clang插件的文档看了个遍,才发现原来可以使用python+libclang的方式来进行代码分析,而在网上也公认这种方法的代码提示速度是最快最简单的。

要使用起vim+clang插件得有几个条件。1、vim支持python脚本,但大多数Linux发行版下的vim编译后是不带python支持的,这个得自行下载vim的源代码打开python支持开关重新编译一遍vim(这个时间不长,五分钟可以编译完成);2、需要有libclang。libclang在当前的debian的stable软件库中是找不着的,我的解决办法是直接把debian的apt指向unstable库,然后可以直接安装clang3.1及libclang;3、需要有python2.6-dev安装,否则编译出来的vim的python支持是不会被打开的。

步骤(注,首先请自行切换debian的apt库至unstable版本并更新系统,不过在未来的debian稳定版本中应该不再需要这么做):

1、安装python2.6-dev, clang, libclang

sudo apt-get install python2.6-dev clang libclang

2、下载最新版本的vim源代码并编译支持python脚本

cd
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2
tar xf vim-7.3.tar.bz2
cd vim73
./configure --with-features=huge --enable-pythoninterp=yes
make
sudo make install
sudo mv /usr/bin/vi /usr/bin/vi-bak
sudo ln -s /usr/local/bin/vim /usr/bin/vi

3、配置~/.vimrc文件增加

let g:clang_user_options="-fexceptions"
let g:clang_use_library=1
highlight Pmenu ctermfg=black ctermbg=yellow

4、安装vim的clang插件clang_complete。注:该步骤要用到git,若没有请自行执行sudo apt-get install git安装

cd
git clone https://github.com/Rip-Rip/clang_complete.git
cd clang_complete
make && make install
mkdir ~/.vim
cp -R * ~/.vim/

5、在工程根目录下编辑.clang_complete文件,并且加入(当然这个也可以写在.vimrc中的let g:clang_user_options=”-fexceptions -I/usr/include -I/usr/local/include”这句中)

-I/usr/include
-I/usr/local/include

6、使用vim打开工程目录下的c++文件,编辑将会出现代码提示,使用命令:copen将可以查看clang的分析错误提示

总结:

使用vim的clang_complete插件将会大大提高编程的效率,而且对于开发环境的部署是很简单,在Windows,Linux,Macos下基本上都按上述步骤即可(其实最开始我是在Windows下的Cygwin里配置,vim同样也需要自行编译以打开python支持开关)。对于我经常要login到远程的服务器上做调试,这样的开发环境应该是最适合我的。