inotify-tools用法

2014年12月02日 14:40

一、介绍

    inotify-tools是为linux下inotify文件监控工具提供的一套C的开发接口函数库,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。Inotify-tools使用用c编写的,除了要求内核(Linux2.6.13开始)支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。

二、初试

1.查看内核是否支持
➜  ~  grep INOTIFY_USER /boot/config-$(uname -r)
CONFIG_INOTIFY_USER=y
 
2.安装
➜  ~ yum install inotify-tools
 
3.运行inotifywait
➜  ~  inotifywait -rm workspace
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
 
4. 触发事件, 查看结果
➜  ~  touch workspace/demo.py 
inotifywait输出
workspace/ CREATE demo.py
workspace/ OPEN demo.py
workspace/ ATTRIB demo.py
workspace/ CLOSE_WRITE,CLOSE demo.py

三、语法

inotifywait  [-hcmrq]  [-e  <event> ] [-t <seconds> ] [--format <fmt> ]
       [--timefmt <fmt> ] <file> [ ... ]

四、选项

-r, --recursive  监视一个目录下的所有子目录。
-e , --event     指定监视的事件。
-m, --monitor    接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-q, --quiet      指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
-h,--help        输出帮助信息
@<file>          排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
--fromfile     从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-d, --daemon   跟--monitor一样,除了是在后台运行,需要指定--outfile把事情输出到一个文件。也意味着使用了--syslog。
-o, --outfile  输出事情到一个文件而不是标准输出。
-s, --syslog   输出错误信息到系统日志
--exclude      正则匹配需要排除的文件,大小写敏感。
--excludei     正则匹配需要排除的文件,忽略大小写。
-t , --timeout  设置超时时间,如果为0,则无限期地执行下去。
-c, --csv     输出csv格式。
--timefmt     指定时间格式,用于--format选项中的%T格式。
--format      指定输出格式。
%w    表示发生事件的目录
%f    表示发生事件的文件
%e    表示发生的事件
%Xe   事件以“X"分隔
%T    使用由--timefmt定义的时间格式

五、输出

watched_filename EVENT_NAMES event_filename
  • watched_filename 监控文件
  • EVENT_NAMES 事件名
  • event_filename 事件对象文件

六、事件

access  文件读取
modify  文件更改。
attrib  文件属性更改,如权限,时间戳等。
close_write 以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。
close_nowrite 以只读模式打开的文件被关闭。
close  文件被关闭,不管它是如何打开的。
open   文件打开。
moved_to 一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。
moved_from 一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。
move    包括moved_to和 moved_from
move_self 文件或目录被移除,之后不再监听此文件或目录。
create  文件或目录创建
delete  文件或目录删除
delete_self  文件或目录移除,之后不再监听此文件或目录
unmount  文件系统取消挂载,之后不再监听此文件系统。
 
 
参考: https://www.centos.bz/2012/06/inotify-tools-introduction/
 

Tags: inotify;
评论(0) 阅读(2272)

rsync学习

2014年12月01日 15:53

一、示例

以下面两个目录为例子
src目录结构
➜  tree src
src
└── demo.py
dest目录结构
➜  tree dest 
dest
└── hello.py
 
1. 文件同步
➜  rsync -v src/demo.py dest
demo.py

sent 85 bytes  received 35 bytes  240.00 bytes/sec
total size is 0  speedup is 0.00
 
2. 目录同步
➜  rsync -av src/  dest
sending incremental file list
./
demo.py

sent 118 bytes  received 38 bytes  312.00 bytes/sec
total size is 0  speedup is 0.00
 
3. 远程目录同步
➜  rsync -av src/  wyq@localhost:~/dest
wyq@localhost's password: 
sending incremental file list
./
demo.py

sent 118 bytes  received 38 bytes  34.67 bytes/sec
total size is 0  speedup is 0.00

二、介绍

    rsync(remote sync)远程同步工具. 使用rsync算法,只传送两个文件不同的部分, 而不是每次都整份传送,因此速度相当快. 运行Rsync服务器的机器也叫备份服务,一个Rsync服务器可同时备份多个客户端的数据; 也可以多个Rsync服务器备份一个客户端的数据。
    rsync服务器打开873端口, 等待对方Rsync连接。连接时,Rsync server会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
    rsync支持大多数linux系统,windows也有相应版本,比较知名的有cwRsync和Sync2NAS。

三、基本特点

1.可以镜像保存整个目录树和文件系统;
2.可以很容易做到保持原来文件的权限、时间、软硬链接等;
3.无须特殊权限即可安装;
4.优化的流程,文件传输效率高;
5.可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接;
6.支持匿名传输。

四、语法

本地:  rsync [OPTION...] SRC... [DEST]

Access via remote shell(ssh)
  获取: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  推送: rsync [OPTION...] SRC... [USER@]HOST:DEST

Access via rsync daemon:(rsync服务器)
  Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
 
* ":"   分隔符就启动这种模式
* "::"  分隔符启动daemon模式
* 传输方式有两种:rsync-daemon、ssh. daemon方式缺乏灵活性;ssh方式,灵活,速度快,安全性高,但是cpu消耗高.一般用ssh.

五、选项

一般都使用azv选项
 
-v, --verbose 详细模式
-a, archive  归档模式,表示以递归方式传输文件,并保持所有文件属性
-r, --recursive 对子目录以递归方式处理
-z, --compress 传输时对数据进行压缩
-b, --backup 创建备份,存在同名文件,将老的重新命名为~filename. 可以使用--suffix指定不同的备份文件前缀.
-l, --links 保留软链接
-L, --copy-links  像对待常规文件一样处理软链接
-e, --rsh=COMMAND 指定使用rsh, ssh方式进行数据同步
--force 强制删除目录,即使不为空
-u, --update  仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
--size-only 当决定是否要备份文件时,仅仅察看文件大小而不考虑文件时间
-I, --ignore-times 不跳过那些有同样的时间和长度的文件
 
-t, --time  保持文件时间信息
-o, --owner 保持文件属主信息
-p, --perms 保持文件权限
-g, --group 保持文件属组信息
-q, --quiet 精简输出模式
-c, --checksum 打开校验模式,强制对文件传输进行校验
--progress 显示数据镜像同步的过程
--delete   以rsync服务器端为基础进行数据镜像同步,保持与rsync服务器目录完全一致.
--delete-excluded  同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
--exclude=PATTERN  排除不需要传输的文件类型
--partial  保留因故没有完全传输的文件,以加快随后的再次传输
--port=PORT 指定其它rsync服务器端口
--password-file=FILE 从FILE中得到密码
--bwlimit=KBPS 限制I/O带宽,KBytes per second

六、优点与缺点

优点
安全、备份迅速、增量备份,可以解决实时性要求不高的需求.
 
缺点
    rsync需要扫描所有文件后进行对比,然后进行查量传输,如果文件很大,扫描文件非常耗时,而且发生变化的文件往往是很少一部分,因此比较低效.
    rsync不能实时监测,两次触发动作会有时间差,导致服务器和客户端数据出现不一致。
 

Tags: rsync;
评论(0) 阅读(2059)

第一个jetty程序

2014年11月21日 17:36

  • 下载
  • 新建root目录
解压之后在webapps下新建root目录
  • 新建index.jsp文件
在root目录中新建index.jsp文件
<html>
<body>
<%
    out.println("hello world")
%>
</body>
</html>
  • 启动
进入控制台运行
java -jar start.jar
 
在windows下可能出现下面错误,原因是执行java命令时优先使用windows自带的java,但是lib却使用我们配置的classpath.
org.apache.jasper.JasperException: PWC6345: There is an error in invoking javac.  A full JDK (not just JRE) is required
at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:378)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:119)
at org.apache.jasper.compiler.Jsr199JavaCompiler.compile(Jsr199JavaCompiler.java:208)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:384)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:453)
....
 
解决办法
C:\Program" "Files\Java\jdk1.7.0_60\bin\java -jar start.jar
  • 访问
http://localhost:8080 即可看到hello word
 

Tags: jetty
评论(0) 阅读(2046)

Waiting for table metadata lock解锁

2014年11月20日 16:53

在用alter修改mysql表结构时,可能出现一直在执行中. 这个时候可能就是因为锁表了.
  • 查看锁表 
show processlist 
Id User Host db Command Time State Info
3367062 root 192.168.10.114:61503 pkPlatform Sleep 5444 \N
3572758 root 192.168.10.116:51713 pkPlatform Sleep 9348 \N
...
  • 锁表提示
State子段出现: Waiting for table metadata lock表明存在锁表
  • 解锁
kill 3631200  --(3631200为Id字段值)
 

评论(0) 阅读(4005)

安装增强功能出现make[2]: *** [/tmp/vbox.0/regops.o]错误

2014年11月14日 15:15

fedora运行在virtualbox(版本4.3.12)之上,在安装增强功能时出现下面错误
Verifying archive integrity... All good.
Uncompressing VirtualBox 4.3.12 Guest Additions for Linux............
VirtualBox Guest Additions installer
Removing installed version 4.3.12 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
Removing existing VirtualBox non-DKMS kernel modules       [  确定  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  确定  ]
Building the shared folder support module                  [失败]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
Doing non-kernel setup of the Guest Additions              [  确定  ]
Installing the Window System drivers
Installing X.Org Server 1.14 modules                       [  确定  ]
Setting up the Window System to use the Guest Additions    [  确定  ]
You may need to restart the hal service and the Window System (or just restart
the guest system) to enable the Guest Additions.

Installing graphics libraries and desktop services componen[  确定  ]
Press Return to close this window...
 
打开日志文件发现下面提示
make[2]: *** [/tmp/vbox.0/regops.o] 错误 1
make[1]: *** [_module_/tmp/vbox.0] 错误 2
make: *** [vboxsf] 错误 2
 
从virtualbox官网找到的一段解释
this has to do with a new version of GCC or kernel in Fedora and the fix was to update to a newer version of VirtualBox,
 but that can be problematic right now on a Windows host. I would try the 4.3.16 guest additions and see if that fixes this.
 If that fails then you need to see if 4.3.16 works in the host. Read the issues though https://forums.virtualbox.org/viewtopic.php?f=6&t=63556
大致意思是由于使用新版本gcc或者kernel,而guest additions并不支持. 解决办法是使用4.3.16版本的增强功能.
 
下载地址
 
下载之后将它挂载到系统中,重新安装增强功能,提示正常.
 

Tags: fedora
评论(0) 阅读(2428)

git仓库与裸仓库

2014年11月14日 11:32

创建仓库

git init 本地仓库,包含.git目录和工作目录
[wyq@localhost blog.git]$ git init
重新初始化现存的 Git 版本库于 /home/wyq/workspace/blog.git/.git/
[wyq@localhost blog.git]$ ls -a
.  ..  .git

创建裸仓库

git init --bare 裸仓库,只有.git目录下的内容.
[wyq@localhost blog.git]$ git init --bare
初始化空的 Git 版本库于 /home/wyq/workspace/blog.git/
[wyq@localhost blog.git]$ ls -a
.   branches  description  hooks  objects
..  config    HEAD         info   refs
适合作为服务器仓库.

相互转换

git clone --bare 从仓库导出bare仓库
git clone 从bare仓库导出仓库
 
如果服务仓库以git init仓健,当用户向它提交代码时,会出现
Writing objects: 100% (3/3), 236 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To /home/wyq/workspace/blog.git
 ! [remote rejected] master -> master (branch is currently checked out)
解决办法是使用git clone --bare 克隆出.git内容作为服务器仓库.
 

Tags: git;bare
评论(0) 阅读(2744)

如何给在用的nginx添加新模块?

2014年11月13日 11:29

有一个在用的nginx,以yum方法安装的,怎样在不改动配置的情况下,为它添加模块.
以添加spdy模块为例.

编译新模块

预编译
./configure  --prefix=/etc/nginx \
   --sbin-path=/usr/sbin \
   --conf-path=/etc/nginx/nginx.conf \
   --pid-path=/run/nginx.pid  \
   --error-log-path=/var/log/nginx/error.log \
   --with-http_spdy_module \
   --with-http_ssl_module \
   --with-ipv6 
--sbin-path, --pid—path, --conf—path,--erro—path三个参数是设定默认配置路径.
如果旧的nginx不是以/usr/local/nginx为安装路径,则需要指定上面参数,可以在旧nginx的nginx.conf文件中取到.
 
编译
make之后复制

验证新nginx是否可用

验证编译后的nginx是否可以使用已有的配置
./obj/nginx -t

使用新nginx

备份 cp /usr/sbin/nginx /usr/sbin/nginx-bak
替换 cp ./obj/nginx /usr/sbin/nginx
ok了
 

评论(5) 阅读(2063)

nginx启用spdy支持

2014年11月13日 10:48

安装nginx

预编译时加入spdy模块,spdy强制使用ssl,需要同时编入ssl模块
./configure --with-http_ssl_module --with-http_spdy_module
 
make 编译之后输出下面信息,nginx默认安装到/usr/local/nginx目录
[wyq@localhost nginx-1.6.2]$ make
make -f objs/Makefile
make[1]: 进入目录“/home/wyq/nginx-1.6.2”
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g  -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
....
make[1]: 离开目录“/home/wyq/nginx-1.6.2” make -f objs/Makefile manpage make[1]: 进入目录“/home/wyq/nginx-1.6.2” sed -e "s|%%PREFIX%%|/usr/local/nginx|" \ -e "s|%%PID_PATH%%|/usr/local/nginx/logs/nginx.pid|" \ -e "s|%%CONF_PATH%%|/usr/local/nginx/conf/nginx.conf|" \ -e "s|%%ERROR_LOG_PATH%%|/usr/local/nginx/logs/error.log|" \ < man/nginx.8 > objs/nginx.8 make[1]: 离开目录“/home/wyq/nginx-1.6.2”

make install 安装

准备数字证书

使用下面命令,生成自己的证书
openssl genrsa -des3 -out openssl.key 1024  
openssl req -new -x509 -key openssl.key -out openssl.crt -days 3650  
openssl rsa -in openssl.key -out openssl_nopass.key  
详细参考
http://yongqing.is-programmer.com/posts/68856.html
或者用我的证书,证书密码:word

添加配置

server{
    ...
    listen 443 ssl spdy;
    ssl_certificate /home/wyq/ssl/openssl.crt;
    ssl_certificate_key /home/wyq/ssl/openssl_nopass.key;
    ...
}

启动nginx

./sbin/nginx

查看spdy启动情况

使用chrome浏览器访问https://localhost,并打开 chrome://net-internals/#spdy 看到下面内容,表示spdy已经开启
Host Proxy ID Protocol Negotiated Active streams Unclaimed pushed Max Initiated Pushed Pushed and claimed Abandoned Received frames Secure Sent settings Received settings Send window Receive window Unacked received data Error
localhost:443 direct:// 65438 spdy/3.1 0 0 100 1 0 0 0 2 true true true 2147483647 10485760 612 0
 

Tags: spdy;ssl;
评论(0) 阅读(1509)

SSL数字证书生成方法

2014年11月13日 09:31

安装openssl

yum install openssl

生成密钥

openssl genrsa -des3 -out openssl.key 1024  
[wyq@localhost ssl]$ openssl genrsa -des3 -out openssl.key 1024
Generating RSA private key, 1024 bit long modulus
..............++++++
...............++++++
e is 65537 (0x10001)
Enter pass phrase for openssl.key:  (输入密码)
Verifying - Enter pass phrase for openssl.key: (确认输入输入密码)

生成证书

openssl req -new -x509 -key openssl.key -out openssl.crt -days 3650  
[wyq@localhost ssl]$ openssl req -new -x509 -key openssl.key -out openssl.crt -days 3650
Enter pass phrase for openssl.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn (国家)
State or Province Name (full name) []:hubei (省份)
Locality Name (eg, city) [Default City]:wuhan (城市)
Organization Name (eg, company) [Default Company Ltd]:aa (公司)
Organizational Unit Name (eg, section) []:it (部门)
Common Name (eg, your name or your server's hostname) []:wyq (名字)
Email Address []:562798392@qq.com (邮件地址)

不用密码的密钥

openssl rsa -in openssl.key -out openssl_nopass.key  
[wyq@localhost ssl]$ openssl rsa -in openssl.key -out openssl_nopass.key 
Enter pass phrase for openssl.key: (输入上面设定的密码)
writing RSA key

开启nginx的ssl

server{
    ....
    listen 443 ssl;
    ssl_certificate /home/wyq/ssl/openssl.crt;
    ssl_certificate_key /home/wyq/ssl/openssl_nopass.key;
    ....
}
访问https://localhost 出现"Welcome to nginx ...",好了,配置成功.
 
 

Tags: openssl;数字证书;
评论(0) 阅读(1636)

debian安装nginx 1.6方法

2014年11月10日 15:46

安装

  • apt-get upgrade更新系统。由于nginx 1.6会用到最新包,最好先更新系统。
  • 添加dotdeb源
打开/etc/apt/sources.list在头部添加下面两行
deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all
  • 运行apt-get install nginx升级nginx
     默认不会覆盖已有的nginx配置
  • nginx -s reload重启gninx

可能出现缺少公钥错误

  • 运行apt-get update出现提示
Reading package lists... Done
W: GPG error: http://packages.dotdeb.org stable Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E9C74FEEA2098A6E
  • 解决办法:
运行下面两个命令
gpg --keyserver keys.gnupg.net --recv-key A2098A6E
gpg -a --export A2098A6E | apt-key add -
命令中的"A2098A6E",是错误提示"E9C74FEEA2098A6E"的后8位
 

Tags: debian;nginx;dotdeb
评论(0) 阅读(892)