启动vim打开多个文件并分屏显示:
vim -on file1 file2
o为小写字母,上下分,n是分屏的个数,后面是待打开的文件
vim -On file1 file2
O为大写字母,左右分,n是分屏的个数,后面是待打开的文件
在已经打开的vim中对文件进行分屏
对光标所在的窗口进行上下分屏
:sp
ctrl + w s
对光标所在的窗口进行左右分屏
:vsp
ctrl + w v
不同窗口间的移动
移动到光标左边的窗口
ctrl + w h
ctrl + w
移动到光标上边的窗口
ctrl + w k
ctrl + w ↑
移动到光标下边的窗口
ctrl + w j
ctrl + w ↓
关闭当前窗口
ctrl + w c
ctrl + w q
:q
使用vim时无意间触碰到q键,左下角出现“recording”这个标识,觉得好奇,遂在网上查了一下,然后这是vim的一个强大功能。他可以录制一个宏(Macro),在开始记录后,会记录你所有的键盘输入,包括在insert模式下的输入、正常模式下使用的各种命令等。
具体使用:
第一步:在正常模式下(非insert模式、非visual模式)按下q键盘
第二步:选择a-z或0-9中任意一个作为缓冲器的名字,准备开始录制宏
第三步:正常的操作,此次所有的操作都会被记录在上一步中定义的缓冲器中
第四步:在非insert模式下输入q停止宏的录制
第五步:使用@ + 第二步中定义的缓冲器的名字即可。
例如想把下面的文字
line1
line-2
line3-1
l4
变成如下的文字
System.out.println(line1);
System.out.println(line1);
System.out.println(line-2);
System.out.println(line3-1);
System.out.println(L4);
观察可以发现他们的规律,在每行文字的开头添加“System.out.println(”,结尾添加“);”就变成下面的信息了。下面简单介绍一下如何使用recording来完成这样的操作。
首先把光标移动line1上,输入qt,准备开始录制,缓冲器的名字为t,录制的动作为:shift + ^ 回到行首、按下i键进入insert模式、输入“System.out.println(”、按下esc键回到正常模式、shift + $ 回到行尾部、按下i键进入insert模式、输入“);”按下esc键回到正常模式,按下q停止录制。然后把光标移动到下面一行的任意位置输入 @ + t 即可。
recording还可以和查询结合起来使用,例如想把一个文件中含有特定字符串的行注释,可以通过这样的宏来实现。在正常模式下输入/search string + enter、shift + ^、i、#、esc、shift + $。
让定制的宏自动执行多次的方法是先输入一个数字,然后在输入@ + 缓冲器的名字。 例如 100@t,表示执行100次。
使用linux的少不了玩命令行,掌握一下快捷键可以让你做事达到事半功倍的效果。用的最多的应该是属于Tab键,功能是自动补齐。主要用在命令本身名字和进入目录查看文件,有了它就不需要一字一字的输出命令的完整名字,只要输入前面几个字符,然后Tab一下就可以了,如果存在多个它会全部提示出来;进入一个很深的目录时候,使用Tab也能快速进入。下面列举一些我常用的组合快捷键。
- ctrl + a 回到命令行的行首
- ctrl + e 回到命令行的行尾
- ctrl + c 取消当前行输入的命令,并重新到下一行
- ctrl + r 出现命令历史记录搜索提示,输入字符后会自动匹配命令
- ctrl + b 向后退一个字符,相当于向左方向键
- ctrl + f 向前进一个字符,相当于向右方向键
- alt + b 向后跳一个字
- alt + f 向前进一个字
- ctrl + p 向上翻以前的输入命令,相当于向上方向键
- ctrl + n 向下翻以前的输入命令,相当于向下方向键
- ctrl + w 从光标位置向后删除一个字
- ctrl + y 粘贴最后一个删除的字
- ctrl + d 删除当前光标位置的一个字符
- ctrl + u 从光标当前位置删除所有字符至行首
- ctrl + k 从光标当前位置删除所有字符至行尾,相当于长按ctrl + d
玩过Linux的人应该都知道,如果想让一个程序在后台运行,只要在执行命令的末尾加上一个&符号就可以了。但是这种方式不是很保险,有些程序当你登出终端后它就会停止。那么如何让一个程序真正永远在后台执行呢。答案就是使用 nohub 命令,格式为:
nohup 执行程序的命令 &
如果程序有输出,它会试着把输出写入执行上述命令的当前文件夹下的 nohup.out 文件中,当写入失败,就会写当前用户的$HOME目录下的nohup.out 中。
linux下可以通过配置crontab来定时执行任务,执行体可以是一条系统命令或自己写的一个脚本,同时可以指派用户来执行。配置crontab有两种方法。
方法1、使用crontab命令,例如添加一个新的或编辑已有的,使用:
crontab -e
就可以进入配置文件。此时配置crontab的执行者是当前登入用户,如果当前用户是root,需要为其他用户配置,可以使用
crontab -e -u 用户名
或
su 用户名
crontab -e
这种方法有一个缺点,就是当前系统中配置的crontab不在一个配置文件中,让管理员不方便查询系统到底有多少个crontab。
方法2、直接在/etc/crontab文件中添加,不过需要是root身份。打开文件,应该会看到类似下面的信息
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
要添加新的crontab,只需要在文件最后增加即可。注意这里面需要指定用户名;而方法1中则不需要,如果指定了,它会认为是命令的一部分,从而可能导致crontab执行失败。
如果服务器都是有root来管理,建议添加crontab使用方法2,这样系统中的所有计划任务都在一起,一目了然。
有时候从编辑器里面复制粘贴代码到vim中,代码格式会完全乱套。其原因是vim开启了smartindent(智能缩减)或autoindent(自动对齐)模式。为了保持代码的格式,在粘贴前可以先停止上面的两种模式,命令为:
set nosmartindent
set noautoindent
上述命令是在vim的阅读模式先输入冒号(:),然后分别执行即可。为了一个粘贴搞出这么多事来,确实是麻烦。不过还有一个更加简单的方法,用命令开始粘贴模式,即:
开启
set paste
关闭
set nopaste
或
set paste!
由于粘贴模式和上面的smartindent、autoindent模式是互斥的,而smartindent是不可少的,所以粘贴完后使用上面的两条命令之一来关闭粘贴模式。
另外还可以通过绑定自定义快捷键的方式来快速切换,例如将下属配置加入到.vimrc中
方式1:
set pastetoggle=<F4>
方式2:
:map <F8> :set paste
:map <F9> :set nopaste
注意:方式1在阅读和编辑模式下都可以使用,对粘贴模式开启和关闭进行切换;方式2是在阅读模式下使用,按下相应的快捷键就相当于执行后面定义的命令。
rsync是linux下一款用于同步文件的优秀软件,window下也可以使用它,不过名字为cwRsync。本文主要介绍的是使用window作为rsync的服务端,linux为客户端的使用方法。
cwRsync也分为客户端很服务端,下载地址:http://sourceforge.net/projects/sereds/files/cwRsync/4.0.5/,window是作为服务端,所以下载名为cwRsyncServer_4.0.5_Installer.zip的文件。下载后解压安装,按照向导一步一步下去即可,安装最后需要输入一个系统账号和密码,这个账号是用于运行cwRsync服务的,必须有管理员权限。
安装完成后,在安装的根目录下有一个名为rsyncd.conf文件,即是配置文件。修改后的内容如下:
use chroot = false
strict modes = false
hosts allow = *
log file = rsyncd.log
# 如果没有uid,gid 的设置linux客户端会提示
# invalid uid nobody 错误
uid = 0
gid = 0
# 指定tcp 端口,默认是873
# port = 1122
# 定义模块,可以定义多个
[test]
# 模块对应系统目录,需要使用/cygdrive + 盘符
path = /cygdrive/c/work
# 用于认证模块的用户名
auth users = testuser
# 存放认证密码文件,存放于etc下的testuser.pas中
# 文件名可以随便取,内容为用户名:密码,例如“testuser:123”
secrets file = etc/testuser.pas
read only = false
transfer logging = yes
启动服务:运行 — services.msc,在打开的“服务”管理器中找到RsyncServer并启动,也可以使用在命令行的方式来启动和关闭。
启动服务
net start RsyncServer
停止服务
net stop RsyncServer
在linux下使用如下命名即可进行同步了
同步linux下文件夹到window中,
rsync -vzrtp --progress --delete \
--password-file=/xxx/rsyncd.secrets \
/home/linuxdir/ rsync://testuser@10.211.55.3:/test/
同步window下文件夹到linux中
rsync -vzrtp --progress --delete \
--password-file=/xxx/rsyncd.secrets \
rsync://testuser@10.211.55.3:/test/ /home/linuxdir/
注意需要在用户名前使用“rsync://”,否则会提示“connect to host xxx port 22: Connection refused”;密码文件的内容只有密码,不需要用户名,且文件的owner为root,权限为600;如果使用非默认端口需要在ip的冒号后指定端口;端口后是服务配置中定义的模块名字。
当出现rsync: chown “” failed: Invalid argument (22)错误时,是因为参数中有o,即保留文件的owner信息,而window服务端无法完成chown操作,解决办法是去掉参数o。另外有些可能还会出现rsync: chgrp “” failed: Invalid argument (22),原因类似,只要去掉参数中的g即可。
相关资源链接:
http://blog.csdn.net/gguxxing008/article/details/7018924
http://bbs.ywlm.net/thread-915-1-1.html
mac下通过软件parallels desktop虚拟安装了一个win xp。parallels desktop就是和vmware,virtualbox类似的虚拟机软件,在mac下parallels desktop功能超强大。在虚拟机中通过共享的方式很容易访问到mac下的硬盘,但我遇到的问题是需要把mac下的某个程序文件夹复制到win xp下,而且程序修改都是在mac下进行的,最开始的做法是修改程序后去win下面手动拷贝,程序还是在增加修改中,所以这真不是一个好办法。后来发现在finder中也可以看到win xp的硬盘,当然也可以访问,方法是打开finder后,使用command+向上方向键一直到最顶层目录就可以看到。进一步发现win xp的硬盘是挂载在/private/tmp目录下的,通过命令mount可以看到类型下面的信息:
vfstool@prlufs0 on /private/tmp/96967/C (prlufs, nodev, noexec, nosuid, synchronous, mounted by yangyz)
上述数字96967是不固定,重启虚拟机后就变化了,那到底代表是什么呢?观察任务管理器,发现原来它就是进程“prl_vm_app”的pid号。知道了其中的奥秘,那事情就好办了,写一个shell脚本,使用rsync来让它同步文件夹的内容,这样就可以做到自动处理了。简单代码如下:
#/bin/bash
pid=$(ps aux | grep prl_vm_app | grep -v "grep" | awk -F" " '{print $2}')
src=/Users/xxxx/macdir/
dest=/tmp/${pid}/C/windir/
while true
do
if [ -d "$dest" ]
then
rsync -vzrtopg --progress --exclude-from=exclude.list $src $dest
fi
sleep 3
done
访问网站提示500错误,通过查看日志,获得错误信息为:
2012/12/06 16:10:52 [alert] 11679#0: *9189 1024
worker_connections are not enough while connecting to upstream,
client: 127.0.0.1, server: xxx.netingcn.com,
request: "GET / HTTP/1.0", upstream: "http://127.0.0.1:80/", host: "xxx.netingcn.com"
对于上述错误网上很多人提到,大部分情况是在生产环境中由于并发太多造成的。解决办法就是修改配置文件中的worker_connections值,将其调大。但是今天在本机的nginx中配置一个proxy,完全没有外界的访问的情况也提示上述错误,试着修改worker_connections也没有解决问题。proxy配置大致如下:
server {
listen 80;
server_name yyy.netingcn.com;
location / {
root /var/www/netingcn.com;
index index.html index.php;
}
}
server {
listen 80;
server_name xxx.netingcn.com;
location / {
proxy_pass http://yyy.netingcn.com/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}
原本的目的是想把所有请求xxx.netingcn.com代理到yyy.netingcn.com,也许你会纳闷,干嘛要这么麻烦,直接在第一个的server_name中添加xxx.netingcn.com不就完事。这里只是一个举例,由于正式环境下有特殊情况,不能那么配置,所有才会想到用proxy的方式。
上述配置造成的500错误可以肯定排除是worker_connections太小的原因,仔细配置,发现“proxy_set_header Host $http_host;”这个才是罪魁祸首,因为它造成死循环了,当请求xxx时,由于proxy到yyy,本来nginx是交给server yyy,来处理的,但是header里面的host还是xxx,nginx根据配置里面的server_name,找到 xxx,因此就显示了死循环,也就会报前面提到的那个错了。问题已经定位到了,解决就很简单,直接去掉proxy_set_header Host $http_host;这行配置就行了。
最近升级php memcached扩展到2.1.0,由于依赖libmemcached库,先前安装的版本是1.0.2,编译时候出错,需要更高版本的libmemcached,所以重新下载最新版本的libmemcached编译安装。不幸的时编译libmemcached 1.0.14时候保存,大致错误信息为:
libmemcached/auto.cc: In function 'memcached_return_t text_incr_decr(memcached_server_st*, bool, const char*, size_t, uint64_t, bool)':
libmemcached/auto.cc:73: error: expected `)' before 'PRIu64'
In file included from ./libmemcached/common.h:72,
from ./libmemcached/csl/common.h:40,
from libmemcached/csl/context.cc:38:
google查询了一下,原因是GCC的版本低了,所以只好升级GCC了,好在有yum,一条命令就搞定,命令如下:
yum install gcc44 gcc44-c++ libstdc++44-devel
把下面内容加入到/etc/bashrc中
export CC=/usr/bin/gcc44
export CXX=/usr/bin/g++44
退出终端然后重新登陆,编译、安装都通过了,同时也顺利升级memcached扩展。