首页 > 代码库 > Linux系统管理常用命令

Linux系统管理常用命令

Linux系统管理常用命令

分类: Linux2011-01-10 18:26 1538人阅读 评论(0) 收藏 举报

linuxcommandservicenginxuserunix

目录(?)[+]

 

1. 时间date

1)显示当前时间: date .//Wed Jul 29 11:05:11 CST 2009 
2)date修改时间:date -s 
date 修改时间2007-08-29 14:41 date -s 14:36:30   //时间为14点36分30秒
date 082914362007 //时间为08月29日14点36分2007年
date 082914362007.30 //时间为08月29日14点36分2007年30秒,注意秒前面有一点
3)按字符串方式修改时间 
可以只修改日期,不修改时间,输入: date -s 2009-07-28 
只修改时间,输入:date -s 15:32:00 
同时修改日期时间,注意要加双引号,日期与时间之间有一空格, 

输入:date -s "2009-07-2815:32:00" 

2. 解压缩命令

Tar解压缩:

 -c或--create   建立新的备份文件:建立tar
  -C<目的目录>或--directory=<目的目录>   切换到指定的目录。
  -d或--diff或--compare   对比备份文件内和文件系统上的文件的差异。
  -f<备份文件>或--file=<备份文件>   指定备份文件。  -g或--listed-incremental   处理GNU格式的大量备份。

-j bzip压缩
  -p或--same-permissions   用原来的文件权限还原文件。
  -r或--append   新增文件到已存在的备份文件的结尾部分。
  -t或--list   列出备份文件的内容。
  -T<范本文件>或--files-from=<范本文件>   指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
  -x或--extract或--get  从备份文件中还原文件。解压tar文件
  -z或--gzip或--ungzip   通过gzip指令处理备份文件。
 -v或--verbose   显示指令执行过程。

解压:
tar -zvxf httpd-2.2.11.tar.gz /* 解压.tar.gz格式的文件 */
tar xvf wordpress.tar /* 解压tar格式的文件 */
tar -tvf myfile.tar /* 查看tar文件中包含的文件 */
tar xjf www.tar.bz2 /*解压tar.bz2格式*/

压缩:

tar cftoole.tar tool /* 把tool目录打包为toole.tar文件 */
tar cfz vpser.tar.gz tool /* 把tool目录打包且压缩为vpser.tar.gz文件,因为.tar文件几乎是没有压缩过的,MT的.tar.gz文件解压成.tar文件后差不多是10MB */
tar jcvf /var/bak/www.tar.bz2 /var/www/ /*创建.tar.bz2文件,压缩率高*/


gzip -d ge.tar.gz /* 解压.tar.gz文件为.tar文件 */
unzip phpbb.zip /* 解压zip文件,windows下要压缩出一个.tar.gz格式的文件还是有点麻烦的 */

A、 问题
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error exit delayed from previous errors
解决办法:
tar包压缩的时候用cvf参数,解压的时候用xvf参数
或压缩的时候用czvf参数,解压的时候用xzvf参数
bz 包遇到了,就把z参数换成相应j参数

3. 列出当前目录的文件树

列出当前目录的文件树
find . -print 2>/dev/null|awk ‘!/\.$/ {for (i=1;i<NF;i++){d=length($i);if( d < 5 && i != 1)d=5;printf("%"d"s","|")}print"---"$NF}‘ FS=‘/‘

4. 查看用户所在哪些终端

who | awk ‘{print $1 "\t" $6}‘

5. Ubuntu中激活root帐号

Ubuntu 中的 root 帐号默认是被禁用了的。如果你想要使用 root的权限来干些事情,就需要 sudo 指令。因此需要激活 Ubuntu 中的root 帐号。
在Ubuntu中激活root帐号的过程如下:
       1. 在终端执行sudo passwd root 指令后,系统将会提示你设置一个新的root帐号密码。
       2. 点击System -> Preferences -> Login Window 菜单,并切换到Security 选项页,然后选中其下的“Allow local systemadministrator login”选项。
执行上述两步后,你便可以使用 root 帐号登录 Ubuntu 系统了。
如果要再次禁用 root 帐号,那么可以执行 sudo passwd -l root。 

6. LINUX查看硬件配置

# uname -a                    # 查看内核/操作系统/CPU信息 
# head -n 1 /etc/issue   # 查看操作系统版本 
# cat /proc/cpuinfo         # 查看CPU信息 
# hostname                   # 查看计算机名 
# lspci -tv                        # 列出所有PCI设备 
# lsusb -tv                      # 列出所有USB设备 
# lsmod                          # 列出加载的内核模块 
# env                               # 查看环境变量资源

# free -m                       # 查看内存使用量和交换区使用量 
# df -h                            # 查看各分区使用情况 
# du -sh <目录名>       # 查看指定目录的大小 
# grep MemTotal /proc/meminfo   # 查看内存总量 
# grep MemFree /proc/meminfo    # 查看空闲内存量
# uptime                        # 查看系统运行时间、用户数、负载 
# cat /proc/loadavg       # 查看系统负载磁盘和分区

# mount | column -t      # 查看挂接的分区状态 
# fdisk -l                        # 查看所有分区 
# swapon -s                  # 查看所有交换分区 
# hdparm -i /dev/hda   # 查看磁盘参数(仅适用于IDE设备) 
# dmesg | grep IDE     # 查看启动时IDE设备检测状况网络

# ifconfig                       # 查看所有网络接口的属性 
# iptables -L                 # 查看防火墙设置 
# route -n                     # 查看路由表 
# netstat -lntp               # 查看所有监听端口 
# netstat -antp              # 查看所有已经建立的连接 
# netstat -s                   # 查看网络统计信息进程

# ps -ef                        # 查看所有进程 
# top                             # 实时显示进程状态用户
# w                                # 查看活动用户 
# id <用户名>             # 查看指定用户信息 
# last                            # 查看用户登录日志 
# cut -d: -f1 /etc/passwd   # 查看系统所有用户 
# cut -d: -f1 /etc/group    # 查看系统所有组 
# crontab -l                  # 查看当前用户的计划任务服务

# chkconfig --list         # 列出所有系统服务 
# chkconfig --list | grep on    # 列出所有启动的系统服务程序

# rpm-qa                # 查看所有安装的软件包

7. cpu内核数量

1)方法1:
     1,processor会从0开始记数 继续下去多个cpu
     2,flags如果有 ht 说明支持超线程技术
     3,判断物理CPU的个数可以查看physicalid 的值,相同则为同一个物理 CPU

2)方法2:
    逻辑cpu的个数是processor的个数:
     #cat /proc/cpuinfo | grep "processor" | wc -l
     物理个数是physicalid的个数
     #cat /proc/cpuinfo | grep "physical id" | sort |uniq | wc -l
3)
     很多人都知道,直接敲 cat/proc/cpuinfo 可以看到详细的cpu信息.
     信息里会分processor0 -n, 如果你认为n就是cpu真实核数的话, 就大错特错了.
     我们知道intel有超线程技术(HT), 它可以在逻辑上分一倍数量的cpu出来.所以, 光看processor数量是不准的.
     真实的核数,应该是 cpucores 这个参数值.
     物理cpu数量,可以数不重复的physical id 有几个。

 

8. linux重启命令

      linux下一些常用的关机/重启命令有shutdown、halt、reboot、及init,它们都可以达到重启系统的目的。
1 shutdown
      shutdown命令安全地将系统关机。有些用户会使用直接断掉电源的方式来关闭linux,这是十分危险的。因为linux与windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失﹐使系统处于不稳定的状态﹐甚至在有的系统中会损坏硬件设备。
      而在系统关机前使用shutdown命令﹐系统管理员会通知所有登录的用户系统将要关闭。并且login指令会被冻结﹐即新的用户不能再登录。直接关机或者延迟一定的时间才关机都是可能的﹐还可能重启。这是由所有进程〔process〕都会收到系统所送达的信号〔signal〕决定的。这让像vi之类的程序有时间储存目前正在编辑的文档﹐而像处理邮件〔mail〕和新闻〔news〕的程序则可以正常地离开等等。
      shutdown执行它的工作是送信号〔signal〕给init程序﹐要求它改变runlevel。Runlevel 0被用来停机〔halt〕﹐runlevel 6是用来重新激活〔reboot〕系统﹐而runlevel 1则是被用来让系统进入管理工作可以进行的状态﹔这是预设的﹐假定没有-h也没有-r参数给shutdown。要想了解在停机〔halt〕或者重新开机〔reboot〕过程中做了哪些动作﹐你可以在这个文件/etc/inittab里看到这些runlevels相关的资料。
  shutdown 参数说明:
  [-t] 在改变到其它runlevel之前﹐告诉init多久以后关机。
  [-r] 重启计算器。
  [-k] 并不真正关机﹐只是送警告信号给每位登录者〔login〕。
  [-h] 关机后关闭电源〔halt〕。
  [-n] 不用init﹐而是自己来关机。不鼓励使用这个选项﹐而且该选项所产生的后果往往不总是你所预期得到的。
  [-c] cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数﹐但是可以输入一个用来解释的讯息﹐而这信息将会送到每位使用者。
  [-f] 在重启计算器〔reboot〕时忽略fsck。
       [-F] 在重启计算器〔reboot〕时强迫fsck。
  [-time] 设定关机〔shutdown〕前的时间。  
2halt----最简单的关机命令
  其实halt就是调用shutdown -h。halt执行时﹐杀死应用进程﹐执行sync系统调用﹐文件系统写操作完成后就会停止内核。
  参数说明:
  [-n] 防止sync系统调用﹐它用在用fsck修补根分区之后﹐以阻止内核用老版本的超级块〔superblock〕覆盖修补过的超级块。
  [-w] 并不是真正的重启或关机﹐只是写wtmp〔/var/log/wtmp〕纪录。
  [-d] 不写wtmp纪录〔已包含在选项[-n]中〕。
  [-f] 没有调用shutdown而强制关机或重启。
  [-i] 关机〔或重启〕前﹐关掉所有的网络接口。
  [-p] 该选项为缺省选项。就是关机时调用poweroff。
   
3reboot
      reboot的工作过程差不多跟halt一样﹐不过它是引发主机重启﹐而halt是关机。它的参数与halt相差不多。
4 init

     init是所有进程的祖先﹐它的进程号始终为1﹐所以发送TERM信号给init会终止所有的用户进程﹑守护进程等。shutdown就是使用这种机制。

     init定义了8个运行级别(runlevel), init 0为关机﹐init 1为重启。关于init可以长篇大论﹐这里就不再叙述。另外还有telinit命令可以改变init的运行级别﹐比如﹐telinit-iS可使系统进入单用户模式﹐并且得不到使用shutdown时的信息和等待时间。

shutdown -r -t 0 (0就是立即关机,如果设置为7, 则是7秒钟之后关机)

9. Ubuntu切换文本模式或图形模式

1) .  如果你厌烦了窗口模式那么可以按如下方式以控制台形式登录ubuntu。
        在终端执行:
       $ echo "false" | sudo tee /etc/X11/default-display-manager
       或者直接修改相应文件,将已有内容替换为"false"
      上述执行完后当你再次进入系统时就将以控制台形式登录。
2) . 如果你后悔了或者不习惯命令行的形式,那么可以执行相反的操作恢复X Window登录
       执行:
      $  echo "/usr/sbin/gdm" | sudo tee/etc/X11/default-display-manager
      因为我用的是ubuntu8.04,默认的是窗口样式是gnome,所以填的是gdm,你可根据需要填kdm,xdm等
3) . 如果你热衷于文本和窗口模式切换,下面方法可能对你有用先了解一点:文本模式下可以使用一个或者多个虚拟控制台(终端),虚拟控制台允许多次登录到linux(每一次登       录都称为一个会话),如果你使用的不是图形界面,但希望同时使用若干交互程序,则通过该方法多次登录很有用的。linux支持多达63个虚拟控制台,但只能配置和使用6个       虚拟控制台(如果不运行X11,则可以使用7个)。
      如果上面的一些话你不太懂,则按照下面所述试试,可能对你有帮助。
      当你选择以文本模式启动后,在登录系统前(输入用户名和密码前),此时按alt+F2,接着alt+F3...,一直到alt+F7,此时你会发现屏幕上只有一处在变,就是tty1,tty2...tty6...,并且每一个都会提示你输入用户名和密码,这下估计你清楚了多次登录的意思。
     接下来,如果你希望从文本模式进入X Window,只需执行startx,想从X Window中返回文本模式则安ctrl+alt+FN(N=1,2,3...6),如果再次希望从文本模式进入X Window则安         alt+F7。
      附注:如果你登录文本模式后并未开多个虚拟控制台,而是直接从tty1进入的X Window,那么你返回tty1模式后可以通过ctrl+c终止X Window server,从而进入                       文本控制。
4). 命令行模式直接进入桌面模式:#startx
5). 进入安全模式:f2
6). ctrl+alt+F3(N=1,2,3...6)进入图形:
        先/etc/init.d/gdmstop然后 startx
         否则出现serveris already active for display 0

10.  Ubuntu下修改分辨率

方法1

第一步,打开/etc/X11/xorg.conf,不过在打开之前记得先备份一份呀!

用sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf_backup可以产生一个名为xorg.conf_backup的备份。 
第二步,搜索“Section”,按Ctrl+F即可,其实和Windows系统没太大差别,找到“Section"Monitor" ”代码段。如下所示:
Section "Monitor" 
Identifier "Generic Monitor" 
Option "DPMS" 
HorizSync 30-82(修改屏幕分辨率的位置)
VertRefresh 50-75(修改屏幕分辨率的位置,可以调整成显卡支持的最大值,比如我的设置为50-85)
放置modline的位置
End Section 
第三步,进入终端,输入命令gtf 1024 768 85,输出一句modeline,把这句话加入到Section "Monitor" 代码段。
第四步,假如还需要诸如1280*1024或更高的分辨率,除按照以上步骤设置外,还需要在“Section "Screen"”代码段下找名为“SubSection"Display"”代码段,示例如下:
SubSection "Display" 
Depth 16 
Modes "1280x1024" "1024x768" "832x624""800x600" "720x400" "640x480"  
EndSubSection 
SubSection "Display" 
Depth 24 
Modes "1280x1024" "1024x768" "832x624""800x600" "720x400" "640x480" 
EndSubSection 
在Modes行增加您所需要的分辨率,并以空格分隔。

方法2
VitrualBox2.2.2下安装的Ubuntu9.04默认分辨率只有800x600,非常小,看起来很不舒服(全屏也是这个大小,周围全是黑色)。 
解决方法如下: 
1). 加载VitrualBox的GuestAdditions镜像。 
2). sudo sh /media/cdrom/VBoxLinuxAdditions-x86.run 
3). 重启 
      至此应该可以调到1280x800(全屏即可更改到合适的分辨率),如果还不行就执行如下操作。 
4). sudo gedit /etc/X11/xorg.conf 
添加 Driver "vboxvideo" 
Section "Device" 
Identifier "Configured Video Device" 
Driver "vboxvideo" 
EndSection 
5). sudo displayconfig-gtk 
选驱动为 “vboxvideo”; 
选显示器型号,选分辨率。。 
6). 重启

11.  理解LinuxLoad_average负载

         负载均值在uptime 或者 top 命令中可以看到,它们可能会显示成这个样子:
      load average: 0.09, 0.05,0.01
     很多人会这样理解负载均值:三个数分别代表不同时间段的系统平均负载(一分钟、五 分钟、以及十五分钟),它们的数字当然是越小越好。数字越高,说明服务器的负载越大,这也可能是服务器出现某种问题的信号。
  而事实不完全如此,是什么因素构成了负载均值的大小,以及如何区分它们目前的状况是 “好”还是“糟糕”?什么时候应该注意哪些不正常的数值?
  回答这些问题之前,首先需要了解下这些数值背后的些知识。我们先用最简单的例子说明,一台只配备一块单核处理器的服务器。
1. 行车过桥:
  一只单核的处理器可以形象得比喻成一条单车道。设想下,你现在需要收取这条道路的过桥费 - 忙于处理那些将要过桥的车辆。你首先当然需要了解些信息,例如车辆的载重、以及还有多少车辆正在等待过桥。如果前面没有车辆在等待,那么你可以告诉后面的司机通过。如果车辆众多,那么需要告知他们可能需要稍等一会。
  因此,需要些特定的代号表示目前的车流情况,例如:
  0.00 表示目前桥面上没有任何的车流。实际上这种情况与 0.00 和 1.00 之间是相同的,总而言之很通畅,过往的车辆可以丝毫不用等待的通过。
  1.00 表示刚好是在这座桥的承受范围内。这种情况不算糟糕,只是车流会有些堵,不过这种情况可能会造成交通越来越慢。
  >1.00 超过1.00,那么说明这座桥已经超出负荷,交通严重的拥堵。那么情况有多糟糕?例如 2.00 的情况说明车流已经超出了桥所能承受的一倍,那么将有多余过桥一倍的车辆正在焦急的等待。
       3.00 的话情况就更不妙了,说明这座桥基本上已经快承受不了,还有超出桥负载两倍多的车辆正在等待。
    上面的情况和处理器的负载情况非常相似。一辆汽车的过桥时间就好比是处理器处理某线程的实际时间。Unix 系统定义的进程运行时长为所有处理器内核的处理时间加上线程 在队列中等待的时间。
  和收过桥费的管理员一样,你当然希望你的汽车(操作)不会被焦急的等待。所以,理想状态下,都希望负载平均值小于 1.00 。当然不排除部分峰值会超过1.00,但长此以往保持这个状态,就说明会有问题,这时候你应该会很焦急。
  所以你说的理想负荷为 1.00 ?
  嗯,这种情况其实并不完全正确。负荷 1.00 说明系统已经没有剩余的资源了。在实际情况中 ,有经验的系统管理员都会将这条线划在 0.70
  1) 需要进行调查法则: 如果长期你的系统负载在0.70 上下,那么你需要在事情变得更糟糕之前,花些时间了解其原因。
  2) 现在就要修复法则:1.00 。如果你的服务器系统负载长期徘徊于 1.00,那么就应该马上解决这个问题。否则,你将半夜接到你上司的电话,这可不是件令人愉快的事情。
  3)凌晨三点半锻炼身体法则:5.00。如果你的服务器负载超过了 5.00 这个数字,那么你将失去你的睡眠,还得在会议中说明这情况发生的原因,总之千万不要让它发生。
2.那么多个处理器呢?我的均值是 3.00,但是系统运行正常!
  哇喔,你有四个处理器的主机?那么它的负载均值在 3.00 是很正常的。
  在多处理器系统中,负载均值是基于内核的数量决定的。以 100% 负载计算,1.00 表示单个处理器,而 2.00 则说明有两个双处理器,那么 4.00 就说明主机具有四个处理器。
  回到我们上面有关车辆过桥的比喻。1.00 我说过是“一条单车道的道路”。那么在单车道 1.00 情况中,说明这桥梁已经被车塞满了。而在双处理器系统中,这意味着多出了一倍的负载,也就是说还有 50% 的剩余系统资源 - 因为还有另外条车道可以通行。
  所以,单处理器已经在负载的情况下,双处理器的负载满额的情况是 2.00,它还有一倍的资源可以利用。
3.多核与多处理器
  我们来讨论下多核心处理器与多处理器的区别。从性能的角度上理解,一台主机拥有多核心的处理器与另台拥有同样数目的处理性能基本上可以认为是相差无几。当然实际情况会复杂得多,不同数量的缓存、处理器的频率等因素都可能造成性能的差异。
  但即便这些因素造成的实际性能稍有不同,其实系统还是以处理器的核心数量计算负载均值 。这使我们有了两个新的法则:
  1) 有多少核心即为有多少负荷法则: 在多核处理中,你的系统均值不应该高于处理器核心的总数量。
  2) 核心的核心法则: 核心分布在分别几个单个物理处理中并不重要,其实两颗四核的处理器等于四个双核处理器等于八个单处理器。所以,它应该有八个处理器内核。
  审视我们自己
  让我们再来看看 uptime 的输出
  $ uptime
  23:05 up 14 days, 6:08, 7 users, load averages: 0.65 0.42 0.36
  这是个双核处理器,从结果也说明有很多的空闲资源。实际情况是即便它的峰值会到 1.7,我也从来没有考虑过它的负载问题。
  那么,怎么会有三个数字的确让人困扰。我们知道,0.65、0.42、0.36 分别说明上一分钟、最后五分钟以及最后十五分钟的系统负载均值。那么这又带来了一个问题:
  我们以哪个数字为准?一分钟?五分钟?还是十五分钟?
  其实对于这些数字我们已经谈论了很多,我认为你应该着眼于五分钟或者十五分钟的平均数值。坦白讲,如果前一分钟的负载情况是 1.00,那么仍可以说明认定服务器情况还是正常的。 但是如果十五分钟的数值仍然保持在 1.00,那么就值得注意了(根据我的经验,这时候你应该增加的处理器数量了)。
  那么我如何得知我的系统装备了多少核心的处理器?
  在Linux 下,可以使用
  cat /proc/cpuinfo
  获取你系统上的每个处理器的信息。如果你只想得到数字,那么就使用下面的命令:
  grep ‘model name‘ /proc/cpuinfo | wc -l
  Popularity: 11% [?]
  以上就是Linux系统Load average负载的内容。

12.  查看Apache的请求数

       在Linux下查看Apache的负载情况,以前也说过,最简单有有效的方式就是查看ApacheServer Status(如何开启Apache Server Status点这里),在没有开启Apache Server Status的情况下,或安装的是其他的WebServer,比如Nginx的时候,下面的命令就体现出作用了。
  ps -ef|grep httpd|wc -l命令
  #ps -ef|grep httpd|wc -l
  1388
         ps -ef |grep -c httpd 
  统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。这里的进程名不一定是httpd,有的是apache之类。视具体情况而定。
  表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整,我这组服务器中每台的峰值曾达到过2002。
  netstat -nat|grep -i “80″|wc -l命令
  #netstat -nat|grep -i “80″|wc -l
  4341
  netstat -an会打印系统当前网络链接状态,而grep -i “80″是用来提取与80端口有关的连接的, wc -l进行连接数统计。
  最终返回的数字就是当前所有80端口的请求总数。
  netstat -na|grep ESTABLISHED|wc -l命令
  #netstat -na|grep ESTABLISHED|wc -l
  376
  netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。然后wc -l统计。
  最终返回的数字就是当前所有80端口的已建立连接的总数。
  netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}’命令
  #netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}’
  FIN_WAIT_1 286
  FIN_WAIT_2 960
  SYN_SENT 3
  LAST_ACK 32
  CLOSING 1
  CLOSED 36
  SYN_RCVD 144
  TIME_WAIT 2520
  ESTABLISHED 352
  这条语句是在张宴那边看到,据说是从新浪互动社区事业部技术总监王老大那儿获得的,非常不错。返回参数的说明如下:
  SYN_RECV表示正在等待处理的请求数;
  ESTABLISHED表示正常数据传输状态;
  TIME_WAIT表示处理完毕,等待超时结束的请求数。

13.   Linux下如何编译并运行C程序

    GCC是Linux操作系统下一个非常重要的源代码编译工具,有着许多重要的选项,支持许多不同语言的编译,如C、C++、Ada、Fortran、Objective、Perl、Python、Ruby以及Java等,甚至Linux的许多内核和许多其他自由软件以及开放源码应用程序都是用C语言编写并经gcc编译而成的.
1 . 编译单个源文件
    [例如]在屏幕上打印"Hello,Linux."

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. int main(int argc,char **argv)  
  4. {  
  5.     printf("Hello,Linux.\n");  
  6.     exit(0);  
  7. }  

1)将源文件保存为hello.c,
2)开始进行编译: $gcc -o hello hello.c
      编译成功完成后,在当前路径下,生成一个名为hello的文件
3)执行:  $./hello
    在屏幕上,你将会看到打印结果:Hello,Linux.
    说明:在默认情况下,编译成功完成后,会在当前路径下,生成一个名为a.out的文件,然后执行$./a.out便可打印结果,但通常可以通过选项-o来指定自己的可执行程序名称;
2.编译多个源文件
3.使用外部函数库
4.使用共享函数库和静态函数库
5.gcc选项详细描述
 GCC
最基本的用法是gcc [options][filenames]
  其中options就是编译器所需要的参数,filenames给出相关的文件名称。
  -c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
  -o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
  -g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
  -O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
  -O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
  -Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
  A)#include <myinc.h>
  B)#include “myinc.h”

  其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。

6 执行过程
     Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。

1)代码a.c

  1. #include <stdio.h>  
  2. int main()  
  3. {  
  4. printf("hello\n");  
  5. }  

2)预编译过程:
  这个过程处理宏定义和include,并做语法检查。
  可以看到预编译后,代码从5行扩展到了854行。
  gcc -E a.c -o a.i
  cat a.c | wc -l
  5
  cat a.i | wc -l
  854
3)编译过程:
  这个阶段,生成汇编代码。
  gcc -S a.i -o a.s
  cat a.s | wc -l
  59
4)汇编过程:
  这个阶段,生成目标代码。
  此过程生成ELF格式的目标代码。
  gcc -c a.s -o a.o
  file a.o
  a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV),not stripped
5)链接过程:
  链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。
  gcc a.o -o a
6)程序运行:
  ./a
  hello

14.   apt-get使用

apt-get使用source.list文件进行软件包管理。如果您想了解关于如何编辑和更新source.list中的条目的信息,请参阅SourcesList 

1)引言 
       “起初GNU/Linux系统中只有.tar.gz。用户必须自己编译他们想使用的每一个程序。在Debian出现之後,人们认为有必要在系统中添加一种机制用来管理安装在计算机上的软件包。人们将这套系统称为dpkg。至此着名的‘package’首次在GNU/Linux上出现。不久之後红帽子也开始着手建立自己的包管理系统‘rpm’。 
      “GNU/Linux的创造者们很快又陷入了新的窘境。他们希望通过一种快捷、实用而且高效的方式来安装软件包。这些软件包可以自动处理相互之间的依赖关系,并且在升级过程中维护他们的配置文件。Debian又一次充当了开路先锋的角色。她首创了APT(AdvancedPackaging Tool)。这一工具後来被Conectiva移植到红帽子系统中用于对rpm包的管理。在其他一些发行版中我们也能看到她的身影。” 
        "同时,apt是一个很完整和先进的软件包管理程序,使用它可以让你,又简单,又准确的找到你要的的软件包, 并且安装或卸载都很简洁。 它还可以让你的所有软件都更新到最新状态,而且也可以用来对ubuntu进行升级。" 
       "apt是需要用命令来操作的软件,不过现在也出现了很多有图形的软件,比如Synaptic,Kynaptic 和Adept。" 
 2)命令 
下面将要介绍的所有命令都需要sudo!使用时请将“packagename”和“string”替换成您想要安装或者查找的程序。 
apt-get update——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令。此外您需要定期运行这一命令以确保您的软件包列表是最新的。 
apt-get install packagename——安装一个新软件包(参见下文的aptitude) 
apt-get remove packagename——卸载一个已安装的软件包(保留配置文件) 
apt-get --purge remove packagename——卸载一个已安装的软件包(删除配置文件) 
dpkg --force-all --purge packagename 有些软件很难卸载,而且还阻止了别的软件的应用,就可以用这个,不过有点冒险。 
apt-get autoclean apt会把已装或已卸的软件都备份在硬盘上,所以如果需要空间的话,可以让这个命令来删除你已经删掉的软件 
apt-get clean 这个命令会把安装的软件的备份也删除,不过这样不会影响软件的使用的。 
apt-get upgrade——更新所有已安装的软件包 
apt-get dist-upgrade——将系统升级到新版本 
apt-cache search string——在软件包列表中搜索字符串 


dpkg -l package-name-pattern——列出所有与模式相匹配的软件包。如果您不知道软件包的全名,您可以使用“*package-name-pattern*”。 
aptitude——详细查看已安装或可用的软件包。与apt-get类似,aptitude可以通过命令行方式调用,但仅限于某些命令——最常见的有安装和卸载命令。由于aptitude比apt-get了解更多信息,可以说它更适合用来进行安装和卸载。 
apt-cache showpkg pkgs——显示软件包信息。 
apt-cache dumpavail——打印可用软件包列表。 
apt-cache show pkgs——显示软件包记录,类似于dpkg–print-avail。 
apt-cache pkgnames——打印软件包列表中所有软件包的名称。 
dpkg -S file——这个文件属于哪个已安装软件包。 
dpkg -L package——列出软件包中的所有文件。 
apt-file search filename——查找包含特定文件的软件包(不一定是已安装的),这些文件的文件名中含有指定的字符串。apt-file是一个独立的软件包。您必须先使用apt-getinstall来安装它,然後运行apt-fileupdate。如果apt-filesearch filename输出的内容太多,您可以尝试使用apt-filesearch filename | grep -w filename(只显示指定字符串作为完整的单词出现在其中的那些文件名)或者类似方法,例如:apt-filesearch filename | grep /bin/(只显示位于诸如/bin或/usr/bin这些文件夹中的文件,如果您要查找的是某个特定的执行文件的话,这样做是有帮助的)。 
*apt-get autoclean——定期运行这个命令来清除那些已经卸载的软件包的.deb文件。通过这种方式,您可以释放大量的磁盘空间。如果您的需求十分迫切,可以使用apt-getclean以释放更多空间。这个命令会将已安装软件包裹的.deb文件一并删除。大多数情况下您不会再用到这些.debs文件,因此如果您为磁盘空间不足而感到焦头烂额,这个办法也许值得一试。 

15.   wget下载

如:wgethttp://soft.deepvps/web/nginx/nginx-0.8.0.tar.gz
/*下载远程服务器上的文件到自己的服务器,连上传都省了,服务器不是100M就是1000M的带宽,下载一个2-3兆的MT还不是几十秒的事 */
wget -c http://soft.deepvps/web/nginx/nginx-0.8.0.tar.gz
/* 继续下载上次未下载完的文件*/
1. 介绍
wget是在Linux下开发的开放源代码的软件,作者是HrvojeNiksic,后来被移植到包括Windows在内的各个平台上。它有以下功能和特点:
(1)支持断点下传功能;这一点,也是网络蚂蚁和FlashGet当年最大的卖点,现在,Wget也可以使用此功能,那些网络不是太好的用户可以放心了;
(2)同时支持FTP和HTTP下载方式;尽管现在大部分软件可以使用HTTP方式下载,但是,有些时候,仍然需要使用FTP方式下载软件;
(3)支持代理服务器;对安全强度很高的系统而言,一般不会将自己的系统直接暴露在互联网上,所以,支持代理是下载软件必须有的功能;
(4)设置方便简单;可能,习惯图形界面的用户已经不是太习惯命令行了,但是,命令行在设置上其实有更多的优点,最少,鼠标可以少点很多次,也不要担心是否错点鼠标;
(5)程序小,完全免费;程序小可以考虑不计,因为现在的硬盘实在太大了;完全免费就不得不考虑了,即使网络上有很多所谓的免费软件,但是,这些软件的广告却不是我们喜欢的;
2. 下载参数
下载参数定义下载重复次数、保存文件名等。
  -t,--tries=NUMBER是否下载次数(0表示无穷次)
  -O--output-document=FILE保存下载日志到文件FILE
  -nc,--no-clobber 不要覆盖已经存在的文件
  -N,--timestamping只下载比本地新的文件
  -T,--timeout=SECONDS设置超时时间
  -Y,--proxy=on/off关闭代理
  例:下载的首页并将下载过程中的的输入信息保存到test.htm文件中
  wget -Otest.html

3.下载例子
wget虽然功能强大,但是使用起来还是比较简单的,基本的语法是:wget[参数列表] URL。下面就结合具体的例子来说明一下wget的用法。
1)、下载整个http或者ftp站点:wgethttp://place.your.url/here
这个命令可以将http://place.your.url/here首页下载下来。使用-x会强制建立服务器上一模一样的目录,如果使用-nd参数,那么服务器上下载的所有内容都会加到本地当前目录。
2)递归下载 :wget -rhttp://place.your.url/here
这 个命令会按照递归的方法,下载服务器上所有的目录和文件,实质就是下载整个网站。这个命令一定要小心使用,因为在下载的时候,被下载网站指向的所有地址同 样会被下载,因此,如果这个网站引用了其他网站,那么被引用的网站也会被下载下来!基于这个原因,这个参数不常用。可以用-lnumber参数来指定下载的层次。例如只下载两层,那么使用-l2。
3)制作镜像站点,那么可以使用-m参数,例如:wget -mhttp://place.your.url/here
这时wget会自动判断合适的参数来制作镜像站点。此时,wget会登录到服务器上,读入robots.txt并按robots.txt的规定来执行。
4)、断点续传。
当文件特别大或者网络特别慢的时候,往往一个文件还没有下载完,连接就已经被切断,此时就需要断点续传。wget的断点续传是自动的,只需要使用-c参数,例如:
wget -c http://the.url.of/incomplete/file
使用断点续传要求服务器支持断点续传。-t参数表示重试次数,例如需要重试100次,那么就写-t 100,如果设成-t 0,那么表示无穷次重试,直到连接成功。-T参数表示超时等待时间,例如-T 120,表示等待120秒连接不上就算超时。
5)、批量下载。
如果有多个文件需要下载,那么可以生成一个文件,把每个文件的URL写一行,例如生成文件download.txt,然后用命令:wget -idownload.txt
这样就会把download.txt里面列出的每个URL都下载下来。(如果列的是文件就下载文件,如果列的是网站,那么下载首页)
6)、选择性的下载。
可以指定让wget只下载一类文件,或者不下载什么文件。例如:
wget -m –reject=gif http://target.web.site/subdirectory
表示下载http://target.web.site/subdirectory,但是忽略gif文件。–accept=LIST可以接受的文件类型,–reject=LIST拒绝接受的文件类型。
7)、密码和认证。
wget只能处理利用用户名/密码方式限制访问的网站,可以利用两个参数:
–http-user=USER设置HTTP用户
–http-passwd=PASS设置HTTP密码
对于需要证书做认证的网站,就只能利用其他下载工具了,例如curl。
8)、利用代理服务器进行下载。
如果用户的网络需要经过代理服务器,那么可以让wget通过代理服务器进行文件的下载。此时需要在当前用户的目录下创建一个.wgetrc文件。文件中可以设置代理服务器:
http-proxy = 111.111.111.111:8080
ftp-proxy = 111.111.111.111:8080
分别表示http的代理服务器和ftp的代理服务器。如果代理服务器需要密码则使用:
–proxy-user=USER设置代理用户
–proxy-passwd=PASS设置代理密码
这两个参数。
使用参数–proxy=on/off使用或者关闭代理。
wget还有很多有用的功能,需要用户去挖掘。

附录:
命令格式:
wget [参数列表][目标软件、网页的网址]

-V,–version 显示软件版本号然后退出;
-h,–help显示软件帮助信息;
-e,–execute=COMMAND 执行一个“.wgetrc”命令

-o,–output-file=FILE 将软件输出信息保存到文件;
-a,–append-output=FILE将软件输出信息追加到文件;
-d,–debug显示输出信息;
-q,–quiet 不显示输出信息;
-i,–input-file=FILE 从文件中取得URL;

-t,–tries=NUMBER 是否下载次数(0表示无穷次)
-O –output-document=FILE下载文件保存为别的文件名
-nc, –no-clobber 不要覆盖已经存在的文件
-N,–timestamping只下载比本地新的文件
-T,–timeout=SECONDS 设置超时时间
-Y,–proxy=on/off 关闭代理

-nd,–no-directories 不建立目录
-x,–force-directories 强制建立目录

–http-user=USER设置HTTP用户
–http-passwd=PASS设置HTTP密码
–proxy-user=USER设置代理用户
–proxy-passwd=PASS设置代理密码

-r,–recursive 下载整个网站、目录(小心使用)
-l,–level=NUMBER 下载层次

-A,–accept=LIST 可以接受的文件类型
-R,–reject=LIST拒绝接受的文件类型
-D,–domains=LIST可以接受的域名
–exclude-domains=LIST拒绝的域名
-L,–relative 下载关联链接
–follow-ftp 只下载FTP链接
-H,–span-hosts 可以下载外面的主机
-I,–include-directories=LIST允许的目录
-X,–exclude-directories=LIST 拒绝的目录

16.   Top:管理执行中的程序

执行top指令可显示目前正在系统中执行的程序,并通过它所提供的互动式界面,用热键加以管理。

(1)  一个屏幕下的进程:$top –b
(2)   控制刷新频率:$top –d 3.3
(3)   线程信息:$top –H
(4)   某个用户的进程:$ top –u root
(5)   最耗时的进程:$top 然后使用hotkey‘S’(计算进程的总时间)hotkey ‘T’(按时间排序)

17.   ps 进程管理

1). 常用

ps -aux                           /*ps 进程状态查询命令*/
ps axww                           所有终端机下执行的进程
ps –aux | less –S           可以逐步查看所有进程,可以使用Hotkey‘q’ 退出。

2) .ps命令输出字段的含义

USER,进程所有者的用户名。
PID,进程号,可以唯一标识该进程。
%CPU,进程自最近一次刷新以来所占用的CPU时间和总时间的百分比。
%MEM,进程使用内存的百分比。
VSZ,进程使用的虚拟内存大小,以K为单位。
RSS,进程占用的物理内存的总数量,以K为单位。
TTY,进程相关的终端名。
STAT,进程状态,用(R–运行或准备运行;S–睡眠状态;I–空闲;Z–冻结;D–不间断睡眠;W-进程没有驻留页;T停止或跟踪。)这些字母来表示。
START,进程开始运行时间。
TIME,进程使用的总CPU时间。
COMMAND,被执行的命令行。

3). 和别的命令结合使用

ps -aux| grep nginx /*在所有进程中,查找nginx的进程*/

kill1234 /*1234为进程ID,即ps-aux 中的PID*/

killallnginx /*killall 通过程序的名字,直接杀死所有进程,nginx为进程名*/

4) ps手册

manps 查看ps命令的使用情况

 

18.  lsof 列出当前系统打开文件

       lsof(listopen files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 如1进程:
COMMAND   PID      USER  FD      TYPE     DEVICE     SIZE      NODE      NAME
init                    1        root        txt        REG       3,3         38432      1763452  /sbin/init

      每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。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) 套接字。 

常用的参数列表: 
lsof filename 显示打开指定 文件的所有进程
lsof  -a 表示两个参数都必须满足时才显示结果
lsof  -c string  显示COMMAND列中包含指定字符的进程所有打开的文件
lsof  -u username 显示所属user进程打开的文件
lsof  -g gid 显示归属gid的进程情况
lsof  +d /DIR/ 显示目录下被进程打开的文件
lsof  +D /DIR/ 同上,但是会搜索目录下的所有目录,时间相对较长
lsof  -d FD 显示指定文件描述符的进程
lsof  -n 不将IP转换为hostname,缺省是不加上-n参数
lsof  -i 用以显示符合条件的进程情况
lsof  -i[46] [protocol][@hostname|hostaddr][:service|port]
          46 --> IPv4 or IPv6
          protocol --> TCP or UDP
          hostname --> Internet host name
          hostaddr --> IPv4地址
          service --> /etc/service中的 servicename (可以不只一个)
          port --> 端口号 (可以不只一个)
例如: 查看22端口现在运行的情况

# lsof-i :22

COMMAND PIDUSER   FD   TYPE DEVICE SIZE NODE NAME

sshd  1409 root    3u  IPv6   5678      TCP *:ssh (LISTEN)

查看所属root用户进程所打开的文件类型为txt的文件:

# lsof-a -u root -d txt

COMMAND  PID USER  FD      TYPE DEVICE   SIZE    NODE NAME

init     1    root txt       REG   3,3   38432 1763452 /sbin/init

mingetty 1632root txt       REG    3,3   143661763337 /sbin/mingetty

mingetty 1633root txt       REG    3,3   143661763337 /sbin/mingetty

lsof使用实例

一、查找谁在使用文件系统
在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:

# lsof /GTES11/

COMMAND PIDUSER   FD   TYPE DEVICE SIZE NODE NAME

bash  4208 root  cwd    DIR    3,1 4096   2 /GTES11/

vim    4230 root  cwd    DIR    3,14096    2 /GTES11/

  在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。

19.  tcpdump倾倒网络传输数据

执行tcpdump指令可列出经过指定网络界面的数据包文件头,在Linux操作系统中,你必须是系统管理员基于包的流量记录分析工具,使用标准的BPF表达式过滤信息,能对大多数协议的包结构进行解析

常用参数:

Tcpdump–i <interface> -p –q -n
    -i  <网卡号 >   使用指定的网络截面送出数据包。

例如 linux:

tcpdump–i eth0 –pqn arp
   -n   不把主机的网络地址转换成名字。也就是不行域名反解析
   -p   不让网络界面进入混杂模式。
   -q   快速输出,仅列出少数的传输协议信息。

-w packet.file   把数据包数据写入指定的文件:packet.file。
 -r  packet.file   从指定的文件packet.file读取数据包数据。

了解网络环境,确定网关ip,猜测网络netmask,首先关注arp包,然后逐步展开分析:

tcpdump–i eth0 –pqn arp

tcpdump–i eth0 –pqn udp

确定网络可达性,通过网络包做更精确的分析

Ping …(大家都会)

tcpdump–i eth0 –pqn  icmp

tcpdump–i eth0 –pqn  icmp src 192.168.0.xx

tcpdump–i eth0 –pqn  icmp dst 192.168.1.xx

普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
# tcpdump 
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns:udp50
11:58:47.974331 0:10:7b:8:3a:56> 1:80:c2:0:0:0 802.1d ui/C len=43
                       0000 0000 0080 0000 1007 cf08 09000000
                       0e80 0000 902b 4695 0980 8701 00140002
                       000f0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
                       ffff 0060 0004 ffff ffff ffff ffffffff
                       0452 ffff ffff 0000 e85b 6d85 40080002
                       0640 4d41 5354 4552 5f57 4542 00000000
                       0000 00

基本上tcpdump总的的输出格式为:系统时间来源主机.端口>目标主机.端口数据包参数

(1)想要截获所有210.27.48.1的主机收到的和发出的所有的数据包:

#tcpdumphost 210.27.48.1

(2)想要截获主机210.27.48.1和主机210.27.48.2210.27.48.3的通信,使用命令

 :(在命令行中适用括号时,一定要)

  #tcpdump host210.27.48.1 and /(210.27.48.2 or 210.27.48.3 /)

(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

  #tcpdump iphost 210.27.48.1 and! 210.27.48.2

(4) 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:

#tcpdumptcpport 23 host 210.27.48.1

(1)   对本机的udp123端口进行监视123ntp的服务端口
# tcpdump udpport 123

(2)   统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
#tcpdump -i eth0 src host hostname

(3)   下面的命令可以监视所有送到主机hostname的数据包:
#tcpdump -i eth0 dst host hostname

(4)   我们还可以监视通过指定网关的数据包:
#tcpdump -i eth0gateway Gatewayname

(5)   如果你还想监视编址到指定端口的TCPUDP数据包,那么执行以下命令:
#tcpdump -i eth0host hostname and port 80

 

下面我们介绍几种典型的tcpdump命令的输出信息

(1) 数据链路层头信息
使用命令#tcpdump-e host ice
ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条
命令的输出结果如下所示:
21:50:12.847509eth0 <8:0:20:79:5b:46 0:90:27:58:af:1aip 60: h219.33357 > ice.telnet0:0(0) ack 22535 win 8760 (DF)
  分析:

21:50:12是显示的时间,

847509是ID号,

eth0<表示从网络接口eth0接受该数据包,

eth0>表示从网络接口设备发送数据包,

8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包.

0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE .ip 是表明该数据包是IP数据包,

60 是数据包的长度,

h219.33357> ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口.

ack22535表明对序列号是222535的包进行响应. win8760表明发送窗口的大小是8760.

(2) ARP包的TCPDUMP输出信息

   使用命令#tcpdump arp 

或者#tcpdump –i eht0 –pnq arp
   得到的输出结果是:
  22:32:42.802509eth0 > arpwho-has route tell ice (0:90:27:58:af:1a)
  22:32:42.802902eth0 < arpreply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
  分析:

22:32:42是时间戳,

802509是ID号,

eth0>表明从主机发出该数据包,

arp表明是ARP请求包,

who-hasroute tell ice表明是主机ICE请求主机ROUTE的MAC地址。

0:90:27:58:af:1a是主机ICE的MAC地址。

(3) TCP包的输出信息
   用TCPDUMP捕获的TCP包的一般输出信息是:
  src> dst: flags data-seqno ackwindow urgent options
  src> dst:表明从源地址到目的地址,

flags是TCP包中的标志信息,S是SYN标志, F(FIN), P (PUSH) , R (RST) "." (没有标记);

data-seqno是数据包中的数据的顺序号,

ack是下次期望的顺序号,

window是接收缓存的窗口大小,

urgent表明数据包中是否有紧急指针.
Options是选项.

(4) UDP包的输出信息
   用TCPDUMP捕获的UDP包的一般输出信息是:
  route.port1> ice.port2: udplenth
  UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机
ICE的port2端口,类型是UDP,包的长度是lenth

 

20.  linuxvmstat命令详解  

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。他是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。通常使用vmstat 5 5(表示在5秒时间内进行5次采样)命令测试。将得到一个数据汇总他能够反映真正的系统情况。
#vmstat 5 5
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b   swpd   free   buff cache   si   so   bi    bo   in    cs us sy id wa
1 0 62792   3460   9116 88092    6   30   189   89 1061   569 17 28 54 2
0 0 62792   3400   9124 88092    0    00   14 884   434 4 14 81 0
0 0 62792   3400   9132 88092    0    00   14 877   424 4 15 81 0
1 0 62792   3400   9140 88092    0    00   14 868   418 6 20 74 0
1 0 62792   3400   9148 88092    0    00   15 847   400 9 25 67 0
Linux 内存监控vmstat命令输出分成六个部分:


(1)进程procs: 
r:在运行队列中等待的进程数。
b:在等待io的进程数 。

(2)Linux 内存监控内存memoy: 
swpd:现时可用的交换内存(单位KB)。 
free:空闲的内存(单位KB)。
buff: 缓冲去中的内存数(单位:KB)。
cache:被用来做为高速缓存的内存数(单位:KB)。


(3) Linux 内存监控swap交换页面 
si: 从磁盘交换到内存的交换页数量,单位:KB/秒。
so: 从内存交换到磁盘的交换页数量,单位:KB/秒。


(4)Linux 内存监控 io块设备:
bi: 发送到块设备的块数,单位:块/秒。
bo: 从块设备接收到的块数,单位:块/秒。

(5)Linux 内存监控system系统: 
in: 每秒的中断数,包括时钟中断。
cs: 每秒的环境(上下文)转换次数。


(6)Linux 内存监控cpu中央处理器:
cs:用户进程使用的时间。以百分比表示。
sy:系统进程使用的时间。以百分比表示。
id:中央处理器的空闲时间。以百分比表示。