posts - 167,  comments - 30,  trackbacks - 0

1. 什么是寻址空间

寻址空间一般指的是CPU对于内存寻址的能力。通俗地说,就是能最多用到多少内存的一个问题

 

2. 我们经常听说32位操作系统最多能用4G内存。大部分情况下,这个上限都达不到。例如我的机器,虽然是4G物理内存,但实际上识别的只有3G。有的朋友说是可以识别到3.2G或者3.5G不等,我想这跟人品是没有什么关系的

image

 

那么,这剩下的1个G左右的内存不是浪费了吗?可不是嘛,太心痛了。所有很多朋友都用一个软件将这部分内存转换为硬盘用

http://blog.miniasp.com/post/2008/04/Useful-tools-Gavotte-Ramdisk.aspx

【备注】我自己还没有这么用,要想试用该功能的同学,自己需要慎重。如果你用的好,记得反馈一下给我,呵呵

 

3. 为什么说只能寻址到这个大小呢?我今天是要从程序的角度来解说一下

首先说什么是32位?32位是针对CPU的一个术语

对于程序员来说,这表示了我们在与计算机打交道的时候,能够使用的最大数字是2的32次方。这等于多少呢?

image

那么这个数字是什么为单位呢?bit ,也可以称为比特,或者位。这是计算机可以理解的东西。这个bit里面包含的值,只有两个,就是0和1

好了,那么这个bit怎么样能转换为GB呢,很简单:将它连续除以3次1024.

4294967296/1024/1024/1024

结果等于多少呢?

image

为什么除3次?第一次转换为KB,第二次转换为MB,第三次就转换为GB了

 

4. 那么64位的CPU的寻址空间可以到多大呢?

image

我算一算,可以到多少GB呢?

image

额的神啊,根据摩尔定律的计算,我想我的有生之年是不需要担心内存不够用的问题的

posted @ 2011-07-05 12:16 David1228 阅读(581) | 评论 (0)编辑 收藏

Iptables

感觉防火墙可能不能完美的保护主机,比如ping措施,这时,就需要使用iptables来进行配置。

使用Iptables的内置firewall机制,是通过kernel中的netfilter        模块实现的,Linux kernel使用netfilter对进出数据包进行过滤,netfilter由三个规则表组成,每个表又有许多内建的链组成。使用iptables命令可以对这些表链进行操作,如添加、删除、列出规则等。

Netfilter 规则表 --- filter nat managle

filter用于路由网络数据包。是默认的,也就是说如果没有指定-t参数,当创建一条新规则时,他默认存放到该表内。

INPUT 网络数据包流向服务器

OUTPUT 网络数据包从服务器流出

FORWARD 网络数据包经服务器路由

nat 用于NAT Net Address Translation 是一种IP地址转换方法

PREROUTING 网络数据包到达服务器时可以被修改

POSTROUTING 网络数据包在即将从服务器发出时可以被修改

managle 用于修改网络数据包的表

 

配置iptables

当数据包进入服务器时,Linux kernel会查找对应的链,直到找到一条规则与数据包匹配。如果该规则的targetACCEPT,就会跳过剩下的规则,数据包会继续被传送。如果该规则targetDROP,该数据包会被拦截掉,kernel不会在参考其他规则。

 

Note:如果从始至终都没有一条规则与数据包匹配,而且表末尾有没有drop all规则,那么该数据包会被acceptCisco则相反,在表末尾会因含deny all的规则。

1)     iptables命令选项

iptables [-t iptables ] command option parameter target

-A 在链尾添加一条规则

-C 将规则添加到用户定义链之前对其进行检查

-D 从链中删除一条规则

-E重命名用户定义的链,不改变链本身

-F 清空链,删除链上的所有规则

-I在链中插入一条规则

-L 列出某个链上的规则,如:iptables –L INPUT 列出INPUT链上的规则

-N 创建一个新链

-P 定义某个链的默认策略

-R替换链上的某条规则

-X 删除某个用户相关的链

-Z 将所有表的所有链的字节和数据包统计数器清零

2)     Iptables的命令参数

-p protocol

应用于数据包的协议类型,可以是TCP UDP ICMP ALL ! 也可以

当使用-p tcp时,还可使用其他可选项,一边允许进一步定义规则,选项如下:

-sport 允许指定匹配数据包源端口 port1:port2表示port1port2之间的所有端口

-dport目的端口,和sport雷同

当使用-p !udp 时,也有特殊的选项供使用

-sport-dport-p tcp相同,只不过用于UDP

使用-p icmp参数时,只有一个选项可用

-icmp-type 允许在过滤规则中指定icmp类型

-s source 指定数据包包的源地址,该参数后跟一个IP地址,一个带有sub-net mask的网络地址,或者一个主机名(不建议使用主机名)

-d destination 数据包的目的地址 -s

-j jump 用于指定一个target,告诉规则将该匹配的数据包发送到该targetTarget可以是ACCEPTDROPQUEIEPETURN。如果没有-j,那么不会对数据包进行任何操作,只是将计数器加1

-I in-interface 对于INPUT FOREARD PREROUTING链,指定数据包到达服务器时所使用的端口

-o out-interface 对于OUTPUT FORWARD POSTROUTING,该参数指定数据包离开服务器时使用的端口

3Iptables的命令target

创建规则最后一步是指定iptables对数据包的操作。只要某一规则匹配该数据包,就不会再有别的规则的操作。内建的target有:ACCEPT 允许数据包通过 ,到达目的地

DROP 拒绝数据包通过,丢弃该包

QUEUE 将数据包发送回到用户应用程序处理

RETURN 不再根据当前链的其他规则来检查数据包,而是直接返回,继续被发送到其目的地址,或下一个链。

2、示例:

允许www

Iptables –A INPUT –p tcp –dport 80 –j ACCEPT

该规则被调价到filter表的INPUT链,允许目的端口为80的数据包通过

在内部接口上允许DHCP

Iptables –A INPUT –I eth0 –p tcp - - sport - - dport 67 ACCEPT

 Iptables –A INPUT –I eth0 –p udp - - sport - - dport 67 ACCEPT

同时允许tcpudp协议

3、保存和修改iptables

使用iptables-save 可将现行的iptables规则保存

恢复iptables

使用iptables-restore可从配置文档恢复iptables表到现行iptables表。

posted @ 2011-06-30 18:59 David1228 阅读(370) | 评论 (0)编辑 收藏
我在本地将10G文件打包为zip,上传到linux下。之前所用的unzip解压不了这么大的文件。
[root@node30 images]# unzip ubuntu-8.04.4.zip
Archive:  ubuntu-8.04.4.zip
   skipping: ubuntu-8.04.4.img       need PK compat. v4.5 (can do v2.1)

网上找到解决方案通过p7zip工具能够实现大文件的解压缩。p7zip简介看最下面。

然后再官方网站:http://p7zip.sourceforge.net/ 中下载了针对linux的p7zip
下载之后后缀名是p7zip_9.20.1_src_all.tar.bz2,
通过命令tar -jxvf p7zip_9.20.1_src_all.tar.bz2 解压该文件,
然后执行 make 编译
在执行 make install 安装p7zip
OK!!!!
执行如下命令即可完成我这10G文件的解压缩。如下:
[root@node30 images]# 7za x ubuntu-8.04.4.zip

7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,4 CPUs)

Processing archive: ubuntu-8.04.4.zip

Extracting  ubuntu-8.04.4.img

Everything is Ok

Size:       10737418240
Compressed: 117455645


以下为网上转载回顾之用。
转载自:
http://www.cnblogs.com/fangbo/archive/2009/12/01/1614538.html

这么多年来,数据压缩对我们来说是非常有用的。无论是在邮件中发送的图片用的zip文件 还是在服务器压缩数据文件,我们都可以让下载更容易或者有效的节约磁盘空间。某些压缩格式有时允许我们以60%的比率(甚至更高)压缩文件。下面我将会给 大家演示如何用这些命令在Linux下面去压缩文件或者目录。我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。这几个是在Linux里面常用的压缩格式。

在我们探究这些用法之前,我想先跟大家分享一下使用不同压缩格式的经验。当然,我这里讲到的只是其中的一些用法,除我讲到的之外,他们还有更多的地 方值得我们探讨。我已经意识到我需要了解两到三种压缩格式,才能更好的使用他们。zip格式是第一个需要了解的格式。因为它实际上已成为压缩文件的标准选 择,而且它在windows上也能使用。我经常用zip格式压缩那些需要共享给windows用户的文件。如果只是共享给linux用户或者Mac用户, 那我偏向于选择tar.gz格式。

ZIP
zip可能是目前使用得最多的文档压缩格式。它最大的优点就是在不同的操作系统平台,比如Linux, Windows以及Mac OS,上使用。缺点就是支持的压缩率不是很高,而tar.gz和tar.gz2在压缩率方面做得非常好。闲话少说,我们步入正题吧:
我们可以使用下列的命令压缩一个目录:

# zip -r archive_name.zip directory_to_compress

下面是如果解压一个zip文档:

# unzip archive_name.zip

TAR
Tar是在Linux中使用得非常广泛的文档打包格式。它的好处就是它只消耗非常少的CPU以及时间去打包文件,他仅仅只是一个打包工具,并不负责压缩。下面是如何打包一个目录:

# tar -cvf archive_name.tar directory_to_compress

如何解包:

# tar -xvf archive_name.tar.gz

上面这个解包命令将会将文档解开在当前目录下面。当然,你也可以用这个命令来捏住解包的路径:

# tar -xvf archive_name.tar -C /tmp/extract_here/

TAR.GZ
这种格式是我使用得最多的压缩格式。它在压缩时不会占用太多CPU的,而且可以得到一个非常理想的压缩率。使用下面这种格式去压缩一个目录:

# tar -zcvf archive_name.tar.gz directory_to_compress

解压缩:

# tar -zxvf archive_name.tar.gz

上面这个解包命令将会将文档解开在当前目录下面。当然,你也可以用这个命令来捏住解包的路径:

# tar -zxvf archive_name.tar.gz -C /tmp/extract_here/

TAR.BZ2
这种压缩格式是我们提到的所有方式中压缩率最好的。当然,这也就意味着,它比前面的方式要占用更多的CPU与时间。这个就是你如何使用tar.bz2进行压缩。

# tar -jcvf archive_name.tar.bz2 directory_to_compress

上面这个解包命令将会将文档解开在当前目录下面。当然,你也可以用这个命令来捏住解包的路径:

# tar -jxvf archive_name.tar.bz2 -C /tmp/extract_here/

数据压缩是非常有用的,尤其是对于备份来说。所以,你现在应该考虑在你的备份脚本中使用你在这里学到的压缩方式备份你基本的规则文件以减小你备份文件的大小。

过段时间之后,你就会意识到,在压缩率与CPU占用时间上会有一个平衡,你也要学会如何去权衡什么时候你需要一个快但是压缩率低,什么时候需要一个压缩率高但是CPU点用高的压缩方式,然后你才能避免无谓的空间与时间。




-Zip 是一种高压缩比的存档格式 7z 的管理器,可惜只能用于 Windows 平台。其实7-zip也有linux版本的,只不过它不叫7-zip了,而是P7ZIP。


P7ZIP 的安装
在 Debian/Ubuntu 系统,可通过 sudo apt-get install p7zip 进行安装。
也可以从这里下载:http://p7zip.sourceforge.net/


P7ZIP 的使用
创建压缩包:7za a -t7z test.7z *,此命令将目录中的所有文件压缩到 test.7z 中。

解开压缩包:7za X test.7z,此命令用于将 test.7z 中的文件提取出来。可使用 -t 来指明压缩格式。


更多信息,执行命令:
7za –help


另外,解压文件建议用 X 而不是 e
7za X test.7z
用 e 会丢失目录结构的。

相关链接:
官方网站:http://p7zip.sourceforge.net/
论坛支持:http://sourceforge.net/forum/?group_id=111810
posted @ 2011-06-22 12:15 David1228 阅读(1546) | 评论 (0)编辑 收藏
     摘要: 最近通过做的项目中修改个bug,在jsp页面中潜入applet,通过applet来上传5-10G之间的文件。修改过程记录如下:JSP页面中                <div id="appletTemp">     &nb...  阅读全文
posted @ 2011-06-21 15:07 David1228 阅读(2230) | 评论 (0)编辑 收藏
HTML5高级程序设计思想,欢迎学习哦!
/Files/ldwblog/解读_HTML5.pdf
posted @ 2011-06-02 14:26 David1228 阅读(259) | 评论 (0)编辑 收藏
lsof -i:3306
  查看3306端口被谁占用
  lsof简介
   lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接 和硬件。所以如传输控制协议 (tcp) 和用户数据报协议 (udp) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因 为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
  lsof使用
  lsof输出信息含义
  在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
  command    pid      user   fd      type     device     size       node      name
  init       1         root cwd      dir       3,3       1024       2         /
  init       1         root rtd      dir       3,3       1024       2         /
  init       1         root txt      reg       3,3       38432      1763452 /sbin/init
  init       1         root mem      reg       3,3       106114     1091620 /lib/libdl-2.6.so
  init       1         root mem      reg       3,3       7560696    1091614 /lib/libc-2.6.so
  init       1         root mem      reg       3,3       79460      1091669 /lib/libselinux.so.1
  init       1         root mem      reg       3,3       223280     1091668 /lib/libsepol.so.1
  init       1         root mem      reg       3,3       564136     1091607 /lib/ld-2.6.so
  init       1         root 10u      fifo      0,15                  1309     /dev/initctl
  每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下:
  command:进程的名称
  pid:进程标识符
  user:进程所有者
  fd:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
  type:文件类型,如dir、reg等
  device:指定磁盘的名称
  size:文件的大小
  node:索引节点(文件在磁盘上的标识)
  name:打开文件的确切名称
  其中fd 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。
  txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用
  程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该
  文件被打开并处于读取/写入模式,而不是只读 ? 或只写 (w) 模式。同时还有大写 的w 表示该应用程序具有对整个文件的写
  锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,
  分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 fd 都是从 3 开始。
  与 fd 列相比,type 列则比较直观。文件和目录分别称为 reg 和 dir。而chr 和 blk,分别表示字符和块设备;
  或者 unix、fifo 和 ipv4,分别表示 unix 域套接字、先进先出 (fifo) 队列和网际协议 (ip) 套接字。
posted @ 2011-06-02 11:12 David1228 阅读(300) | 评论 (0)编辑 收藏
/Files/ldwblog/Xen管理手册.pdf

1. XEN Virtual Machine Migration

来自http://www.novell.com/

XEN迁移/保存/挂起都要保存虚拟机状态快照,只要对于该虚拟机的memorydeviceI/O statesnetwork connecitions and the contents of the virtual CPU registers.XEN有能力来保存所有这些信息到一个磁盘中,然后再所迁移的节点上重启该虚拟机。

1、 SAVE & RESTORE MIGRATION

当你保存或挂起虚拟机时,对应的虚拟机资源不会再分配着,会返回给domain0host server)。这些资源会被节点上运行着的虚拟机所使用。也就意味着保存或挂起的虚拟机的网络连接同样也丢失了。

 

虚拟机保存和恢复功能可以被用于很多用途包括测试、调试、迁移虚拟机、系统崩溃快速恢复。例如如果一个虚拟机宕机了,可以快速恢复到一个已知的工作状态。

 

 

热迁移:xm migrate

1、 首先检查目的服务器上是否有足够的资源来运行指定的虚拟机。

2、 执行虚拟机内存的初始拷贝,并将其传输到目的地服务器。

3、 每次连续迭代,初始拷贝之后,只有内存在内传输到目的地服务器过度中是变化的。

4、 当内存页变化足够低时或者剩余的页数传输并没有渐减当随着虚拟机被传输到目的地服务器最终的状态时。

5、 虚拟机控制器被传输到指定的主机服务器上。

你的环境中实现热迁移需检查如下:

1、 对于迁移两个XEN主机服务器的之间需正确的被配置。

2、 两个主机之间要有一个快速稳定的网络连接,两个服务器都必须在相同的第2层网络和IP子网,这样准许网络连接迁移到虚拟机。

3、 两个主机服务器通过共享存储方式来访问,强烈推荐指定虚拟机的磁盘镜像和配置文件要放到共享存储。

4、 在两台主机之间XEN版本相同。

对于迁移工作,现在执行一些初始设置。

1、 Edit xend the configuration file

Xend-config.sxp是主要的配置文件对于XEN daemonXEN守护进程)

Using a text editor such as vi or gedit open /etc/xen/xend-config.sxp.

详细检查该文件,确认下面这行没有被注释掉。

设置如下所示的值

(xend-relocation-server yes)
(xend-relocation-port 8002)
(xend-relocation-address ‘’)
(xend-relocation-hosts-allow ‘’)

         The xend-relocation-address操作允许你指定IP地址,XEN daemon监听迁移请求,保留空白设置表示让该服务器监听所有端口,The xend-relocation-hosts-allow 允许选项,限制哪些主机可以联系迁移请求的服务器,理想情况下你应该限制对服务器的访问,使用该选项,以提供更好的安全性。

         如果你的运行的服务器开放了防火墙,则你要确保你网卡指定IP上的8002端口被打开。

2、 Migrate a virtual machine

迁移虚拟机格式是非常简单的,xm migrate DomainId destHostID

Eg: xm migrate 1  10.0.0.56

可以在目的地服务器上执行xm list确认主机是否成功被迁移。

正规执行迁移命令是不带任何参数的,xm migrate

我们可以添加-live 选项执行迁移操作,xm migrate –live 1 10.0.0.56,此时是用的热方法,很好的测试方式是通过ping 虚拟机的IP地址,看看有多少包丢失了。

posted @ 2011-05-19 11:14 David1228 阅读(1382) | 评论 (0)编辑 收藏

下载
附录常用shell命令
本附录中列举了一些有用的s h e l l命令。这里并没有完全列出每个命令的各种选项,不过
对于理解该命令是足够了。
这些命令的其他一些例子散布于本书的各个部分。
basename
格式:
basename path
b a s e n a m e命令能够从路径中分离出文件名。通常用于s h e l l脚本中,请看下面的例子:
如果上面的语句是脚本m y s c r i p t中的一部分,那么它的输出应为:
myscript: give me a file
其中,$ 0是一个包含当前脚本全路径的特殊变量。
cat
格式:
cat options files
选项:
- v:显示控制字符。
c a t是最常用的文本文件显示命令。
$ cat myfile
上面的命令用于显示m y f i l e文件。
$ cat myfile myfile2 >>hold_file
上面的命令把两个文件( m y f i l e和m y f i l e 2 )合并到h o l d f i l e中。
在脚本中c a t命令还可以用于读入文件。
compress
格式:
compress options files
选项:
- v:显示压缩结果。
c o m p r e s s命令可以用来压缩文件。压缩后的文件名具有‘ . Z’后缀。还可以使用该命令解
压文件。
cp
格式:
cp options file1 file2
选项:
- i:在覆盖文件之前提示用户,由用户确认。
- p:保留权限模式和更改时间。
- r:拷贝相应的目录及其子目录。
要将文件m y f i l e拷贝到m y f i l e 1 . b a k,使用:
$ cp myfile1 myfile1.bak
要将文件g e t . p r d从/ u s r / l o c a l / s y b i n目录拷贝到/ u s r / l o c a l / b i n目录,使用:
要将/ l o g s目录下的所有文件及子目录拷贝到/ h o l d / l o g s目录中,使用:
$ cp -r /logs /hold/logs
diff
格式:
diff options file1 file2
选项:
- c:按照标准格式输出(见下面的例子)。
- I:忽略大小写。
我们使用c o m m命令中的例子,d i ff命令将显示两个文件中不一致的行。
d i ff命令显示出两个文件中的第2行和第3行,它们的第3列不一致。
dircmp
格式:
附录常用s h e l l命令351
下载
dircmp options directory1 directory2
选项:
- s:不显示相同的文件。
d i r c m p命令与d i ff命令十分相似—它比较并显示两个目录中的不同。
dirname
格式:
dirname pathname
该目录正好和b a s e n a m e相反,它返回路径部分:
du
格式:
du options directory
选项:
- a:显示每个文件的大小,不仅是整个目录所占用的空间。
- s:只显示总计。
d u显示的磁盘空间占用是以5 1 2字节的块来表示的。它主要用于显示目录所占用的空间。
在本例中, / v a r目录所占用的空间为1 4 9 2 9块(每块5 1 2字节)。
file
格式:
file filename
该命令用来确定文件的类型。
fuser
格式:
fuser options file
选项:
- k:杀死所有访问该文件或文件系统的进程。
352 附录常用s h e l l命令
下载
- u:显示访问该文件或文件系统的所有进程。
f u s e r命令可以显示访问某个文件或文件系统的所有进程。在有些系统上- u和- m选项可以
互换。还可以在i f语句中使用f u s e r命令。
要列出设备/ d e v / h d a 5上的所有活动进程,使用:
要杀死设备/ d e v / h d a 5上的所有进程,使用:
$ fuser -k /dev/hda5
要查看d o c p a r t文件是否被打开,有哪些进程在使用,可用:
有些系统上的f u s e r命令能够在列表中显示用户登录I D。如果你的系统不具有这样的功能,
可以按照f u s e r命令输出中末尾含有‘ e’的数字在ps -ef或ps xa命令的输出中用g r e p命令查找
相应的用户登录I D。
head
格式:
head -number files
h e a d命令可以显示相应文件的前1 0行。如果希望指定显示的行数,可以使用- n u m b e r选项。
例如:
$ head -1 myfile
只显示文件的第一行,而
$ head -30 logfile |more
则显示l o g f i l e文件的前3 0行。
logname
格式:
l o g n a m e
该命令可以显示当前所使用的登录用户名:
mkdir
格式:
mkdir options directory
选项:
附录常用s h e l l命令353
下载
- m:在创建目录时按照该选项的值设置访问权限。
上述命令创建了一个名为H O L D A R E A的目录。
more
格式:
more options files
该命令和p a g e及p g命令的功能相似,都能够分屏显示文件内容。
选项:
- c:不滚屏,而是通过覆盖来换页。
- d:在分页处显示提示。
- n:每屏显示n行。
$ more /etc/passwd
上面的命令显示p a s s w d文件
$ cat logfile |more
上面的命令显示l o g f i l e文件。
nl
格式:
nl options file
选项:
- I:行号每次增加n;缺省为1。
- p:在新的一页不重新计数。
n l命令可用于在文件中列行号,在打印源代码或列日志文件时很有用。
$ nl myscript
上面的命令将列出m y s c r i p t文件的行号。
$ nl myscript >hold_file
则将上面命令的输出重定向到h o l d f i l e文件中。
$ nl myscript | lpr
将上面命令的结果重定向到打印机。
printf
格式:
printf format arguments
该命令有点类似于a w k命令的p r i n t f函数,它将格式化文本送至标准输出。
其中,格式符f o r m a t包含三种类型的项,这里我们只讨论格式符:
%[- +]m.nx
354 附录常用s h e l l命令
下载
其中横杠-为从行首算起的起始位置。一般说来m表示域的宽度而n表示域的最大宽度。
‘%’后面可跟下列格式字符:
s:字符串。
c:字符。
d:数字。
x:1 6进制数。
o:1 0进制数。
p r i n t f命令本身并不会产生换行符,必须使用转义字符来实现这样的功能。下面是最常用
的转义字符:
\ a:响铃。
\ b:退格。
\ r:回车。
\ f:换页。
\ n:换行。
\ t:跳格。
$ printf "Howzat!\n"
H o w z a t !
上面的命令输出了一个字符串,使用\ n来换行。
上面的命令把1 6进制值转换为A S C I I字符+。
上面的命令从左起第1 0个字符的位置开始显示字符串。
pwd
格式:
p w d
显示当前的工作目录,可以用:
在上面的脚本中,使用了命令置换来获得当前目录。
rm
格式:
rm options files
选项:
附录常用s h e l l命令355
下载
- i:在删除文件之前给出提示(安全模式)。
- r:删除目录。
r m命令能够删除文件或目录。
上面的第二条命令能够删除/ v a r / s p o o l / t m p目录下的所有文件及子目录。
rmdir
格式:
rmdir options directory
选项:
- p:如果相应的目录为空目录,则删除该目录。
$ rmdir /var/spool/tmp/lp_HP
上面的命令将删除/ v a r / s p o o l / t m p目录下的l p H P目录。
script
格式:
script option file
- a:将输出附加在文件末尾。
可以使用s c r i p t命令记录当前会话。只要在命令行键入该命令即可。该命令在你退出当前
会话时结束。它可以将你的输入记录下来并附加到一个文件末尾。
$ script mylogin
将会启动s c r i p t命令并将所有会话内容记录在m y l o g i n文件中。
shutdown
格式:
s h u t d o w n
该命令将关闭系统。很多系统供应商都有自己特定的命令变体。
$ shutdown now
上面的命令将会立即关机。
$ shutdown -g60 -I6 -y
上面的命令将会在6 0秒之后关机,然后重新启动系统。
sleep
格式:
sleep number
该命令使系统等待相应的秒数。例如:
356 附录常用s h e l l命令
下载
$ sleep 10
意味着系统在1 0秒钟之内不进行任何操作。
strings
格式:
strings filename
该命令可以看二进制文件中所包含的文本。
touch
格式:
touch options filename
选项:
-t MMDDhhmm 创建一个具有相应月、日、时分时间戳的文件。
下面的命令能够以当前时间创建文件或更新已有文件的时间戳。
上面的命令以当前时间创建了一个名为m y f i l e的文件。
上面的命令以时间戳6月1 0日上午9 : 3 0创建了一个名为m y f i l e 2的空文件。
tty
格式:
t t y
可以使用t t y来报告所连接的设备或终端。
可以使用tty -s命令来确定脚本的标准输入。返回码为:
0:终端。
1:非终端。
uname
格式:
uname options
选项:
- a:显示所有信息。
- s:系统名。
- v:只显示操作系统版本或其发布日期。
附录常用s h e l l命令357
下载
要显示当前操作系统名及其他相关信息,可以用:
uncompress
格式:
uncompress files
可以使用该命令来恢复压缩文件。
$ uncompress myfile
上面的命令解压缩先前压缩的m y f i l e文件。注意,在解压缩时不必给出. Z后缀。
wait
格式:
wait process ID
该命令可以用来等待进程号为process ID的进程或所有的后台进程结束后,再执行当前脚
本。
下面的命令等待进程号为1 2 9 9的进程结束后再执行当前脚本:
$ wait 1299
下面的命令等待所有的后台进程结束后再执行当前脚本:
$ wait
wc
格式:
wc options file。s
选项:
- c:显示字符数。
- l:显示行数。
- w:显示单词数。
该命令能够统计文件中的字符数、单词数和行数。
在上面第一个例子中, w h o命令的输出通过管道传递给w c命令,该命令显示出如下的几
列:
行数、单词数、字符数
在上面的第二个例子中, w c命令只显示文件中所包含的行数。
358 附录常用s h e l l命令
下载
上面的脚本显示出变量VA R中所包含的字符串的长度。
whereis
格式:
whereis command_name
w h e r e i s命令能够给出系统命令的二进制文件及其在线手册的路径。
注意,在下面的例子中, w h e r e i s命令没有显示出相应命令的二进制文件路径,因为它们
是内建的s h e l l脚本,但是该命令给出了其在线手册的路径。
who
格式:
who options
选项:
- a:显示所有的结果。
- r:显示当前的运行级别(在L I N U X系统中应当使用r u n l e v e l命令)。
- s:列出用户名及时间域。
whoami 显示执行该命令的用户名。这不是w h o命令的一个选项,可以单独应用。
w h o命令可以显示当前有哪些用户登录到系统上。要显示当前登录的用户,可以用:
要显示自己的用户名,可以用:
附录常用s h e l l命令359
下载
posted @ 2011-05-17 10:11 David1228 阅读(302) | 评论 (0)编辑 收藏

软件系统的并发控制一般是通过加锁(有乐观锁和悲观锁两种)来实现,乐观锁是一种事后补救措施,是通过程序的逻辑控制版本来实现的,而悲观锁是事前的一种预防措施,它利用数据库的锁机制来实现。

虽然乐观锁能够提高系统的性能,但它是对发生冲突的访问进行事后的补救,应用在用户输入数据量很少的场合比较适合,但如果在企业ERP,用户与系统交互涉及大量数据在页面表单上录入,如果事后提交失败后才提示用户要重新录入是很不现实的,所以有必要进行事前控制,这就要采用悲观锁。

在多个客户端可能读取同一笔数据或同时更新一笔数据的情况下,防止同一个数据被修改而造成混乱,最简单的手段就是在读取时对数据进行锁定,其它客户端不能对同一笔数据进行更新的读取动作。

一个典型的倚赖数据库的悲观锁调用:
select * from account where name=”John” for update

这条 sql 语句锁定了 account 表中所有符合检索条件(name=”Erica”)的记录。本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修改这些记录。Hibernate 的悲观锁,也是基于数据库的锁机制实现。
下面的代码实现了对查询记录的加锁:
String hqlStr ="from TUser as user where user.name='John'";
Query query = session.createQuery(hqlStr);
query.setLockMode("user",LockMode.UPGRADE); // 加锁
List userList = query.list();// 执行查询,获取数据

query.setLockMode 对查询语句中,特定别名所对应的记录进行加锁(我们为TUser 类指定了一个别名 “user” ),这里也就是对返回的所有 user 记录进行加锁。
观察运行期 Hibernate 生成的 SQL 语句:
select tuser0_.id as id, tuser0_.name as name, tuser0_.group_id
as group_id, tuser0_.user_type as user_type, tuser0_.sex as sex
from t_user tuser0_ where (tuser0_.name='John' ) for update

这里 Hibernate 通过使用数据库的 for update 子句实现了悲观锁机制。
Hibernate 的加锁模式有:
LockMode.NONE : 无锁机制。
LockMode.WRITE : Hibernate 在 Insert 和 Update 记录的时候会自动获取。
LockMode.READ : Hibernate 在读取记录的时候会自动获取。
以上这三种锁机制一般由 Hibernate 内部使用,如 Hibernate 为了保证 Update过程中对象不会被外界修改,会在 save 方法实现中自动为目标对象加上 WRITE 锁。
LockMode.UPGRADE :利用数据库的 for update 子句加锁。
LockMode. UPGRADE_NOWAIT : Oracle 的特定实现,利用 Oracle 的 for update nowait 子句实现加锁。
上面这两种锁机制是我们在应用层较为常用的,加锁一般通过以下方法实现:
Criteria.setLockMode
Query.setLockMode
Session.lock

注意,只有在查询开始之前(也就是 Hiberate 生成 SQL 之前)设定加锁,才会真正通过数据库的锁机制进行加锁处理,否则,数据已经通过不包含 for update 子句的 Select SQL 加载进来,所谓数据库加锁也就无从谈起。

posted @ 2011-03-17 16:03 David1228 阅读(480) | 评论 (0)编辑 收藏

package com.sinovatech.unicom.efb.common;


import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

/**
 *
 * 目的:FTP文件类
 * <br/>
 *
 * FTP上传文件、下载文件
 *
 * *
 */
public class FTPUtil {
 private static final Log log = LogFactory.getLog(FTPUtil.class);

 public static int download(String ip,int port,String userName,String password,FileFilter filter,String localFilePath) throws SocketException, IOException{
  return download(ip, port, userName, password, null,filter, localFilePath);
 }
 
 public static int download(String ip,int port,String userName,String password,String ftpPath,FileFilter filter,String localFilePath) throws SocketException, IOException{
  FTPClient ftp = new FTPClient();
  int i=0;
   try {
    // 不为空连接 通过IP 和端口
    ftp.connect(ip, port);
    // 登陆
    if (ftp.login(userName, password)) {
     ftp.enterLocalPassiveMode();
     // 获取FTP登陆目录下的所有文件
     if(ftpPath!=null){
      if(!ftp.changeWorkingDirectory(ftpPath)){
       throw new RuntimeException("找不到该目录:"+ftpPath);
      }
     }
     FTPFile[] files = ftp.listFiles();
     for (FTPFile file : files) {
      String fileName = file.getName();
      if (filter.accept(fileName)) {
       BufferedOutputStream out = null;
       try {
        // IO流下载文件到本地
        out = new BufferedOutputStream(
          new FileOutputStream(new File(localFilePath
            ,fileName)));
        // 开始下载
        ftp.retrieveFile(file.getName(), out);
        log.info("下载文件:" + file.getName() + "到本地路径:"
          + localFilePath);
        i++;
       } finally {
        try {
         if (out != null) {
          out.close();
         }
        } catch (Exception e) {
         log.error("", e);
        }
       }
      }
     }
    } else {
     i = -1;
    }
   } finally {
    if(ftp != null&&ftp.isConnected()){
     try {
      log.info("关闭ftp连接");
      ftp.disconnect();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }
  return i;
 }
 
 public static int download(String ip,int port,String userName,String password,String ftpPath,final String fileName,String localFilePath)throws SocketException, IOException{
  
 
  return  download(ip, port, userName, password,ftpPath,new FileFilter(){

    public boolean accept(String fileName1) {
   
     return fileName.equalsIgnoreCase(fileName1);
    }
    
   }, localFilePath);
 
 }
 
 
 public static int download(String ip,int port,String userName,String password,final String fileName,String localFilePath)throws SocketException, IOException{
  return  download(ip, port, userName, password,null,fileName, localFilePath);
 }

 
 /**
  * ftp上传文件至服务器
  * @throws SocketException
  * @throws IOException
  */
 public static void uploadFile(String ip, int port, String userName, String password, String localFile)
       throws SocketException, IOException{
  log.info("上传本地文件: " + localFile);
  File file = new File(localFile);
  InputStream in = null;
  FTPClient ftpClient = null;
  if(file != null){
   try {
    ftpClient = new FTPClient();
    in = new FileInputStream(file);
    ftpClient.connect(ip,port);
    if(ftpClient.login(userName, password)){
     ftpClient.enterLocalPassiveMode();
     boolean flag= ftpClient.appendFile(file.getName(), in);
     log.info("上传文件成功:" + flag);
    }
   }catch (SocketException e) {
    log.error("ftp上传文件失败:", e);
    throw e;
   }catch (IOException e) {
    log.error("ftp上传文件失败:", e);
    throw e;
   } finally{
    if(in != null){
     try {
      in.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
    if(ftpClient != null){
     try {
      ftpClient.disconnect();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }
  }
 }
 
 
 public static void upload(String ip, int port, String userName, String password, String path,String remotePath)
 throws SocketException, IOException{
  upload(ip, port, userName, password, new File(path), remotePath);
 }
 
 /**
  * ftp上传文件至服务器
  * @throws SocketException
  * @throws IOException
  */
 public static void upload(String ip, int port, String userName, String password, File localFile,String remotePath)
       throws SocketException, IOException{
  log.info("上传本地文件: " + localFile.getName());
  InputStream in = null;
  FTPClient ftpClient = null;
  if(localFile != null){
   try {
    ftpClient = new FTPClient();
    in = new FileInputStream(localFile);
    ftpClient.connect(ip,port);
    if(ftpClient.login(userName, password)){
     ftpClient.enterLocalPassiveMode();
     if(remotePath!=null){
      if(!ftpClient.changeWorkingDirectory(remotePath)){
       ftpClient.makeDirectory(remotePath);
       ftpClient.changeWorkingDirectory(remotePath);
      }
     }
     boolean flag= ftpClient.storeFile(localFile.getName(), in);
     log.info("上传文件成功:" + flag);
    }
   }catch (SocketException e) {
    log.error("ftp上传文件失败:", e);
    throw e;
   }catch (IOException e) {
    log.error("ftp上传文件失败:", e);
    throw e;
   } finally{
    if(in != null){
     try {
      in.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
    if(ftpClient != null){
     try {
      ftpClient.disconnect();
     } catch (IOException e) {
      e.printStackTrace();
     }
    }
   }
  }
 }

}

posted @ 2011-01-21 12:01 David1228 阅读(2674) | 评论 (0)编辑 收藏
仅列出标题
共16页: First 上一页 5 6 7 8 9 10 11 12 13 下一页 Last 

<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

新闻分类

新闻档案

相册

收藏夹

Java

Linux知识相关

Spring相关

云计算/Linux/虚拟化技术/

友情博客

多线程并发编程

开源技术

持久层技术相关

搜索

  •  

积分与排名

  • 积分 - 354534
  • 排名 - 155

最新评论

阅读排行榜

评论排行榜