日志
linux中的程序执行时透过标准输出和错误输出我们能够观测到程序的运行状态
当遇到后台执行的程序或内核自身来说就不能将运行状态信息输出到屏幕了
他们会切断与终端主控制台的连接,即使输出到屏幕 我们也不能24小时的盯着屏幕.
为了让管理员能随时查看程序运行的历史与当前状态,linux引入了日志服务
它可以收集任何服务产生的日志,并且存储成文件,以备管理员随时查看
日志分为三大组件
klogd
kernel log daemon
专门收集内核产生的日志
syslogd
system log daemon
专门收集应用程序或服务产生的日志
logger
日志工具,可以手动写出各个对象和级别的日志信息
日志服务的启动和关闭
service syslog restart
日志服务的配置文件
server : /etc/sysconfig/syslog
client : /etc/syslog.conf
/etc/syslog.conf 的格式
AAAA.BBBB CCCC
其中AAAA代表产生日志的对象,BBBB代表产生的日志级别,CCCC代表日志的存放位置
系统定义了很多对象
authpriv 与安全验证有关的信息
cron 包含at cron定时任务产生的日志
daemon 后台进程的信息
kern 内核产生的信息
lpr 打印系统产生的信息
mail mail系统产生的信息
news 新闻系统产生的信息
syslog 日志服务本身产生的信息
user 一般用户产生的信息
uucp UUCP子系统产生的信息
localN 保留给其他应用程序使用的 N = 0-7 共8个
日志级别
debug 除错信息,开发人员使用
info 正常信息
notice 稍微需要注意的信息
warn 警告信息
err 错误信息
crit (critical) 危急的错误信息
alert 特别留意的报警信息
emerg (emergency) 紧急的错误信息
级别的写法
err 代表等于或高于; err相当于 err+crit+alert+emerg
=err 代表恰好等于; =err相当于 只有 err 本身
!err 代表取反; !err相当于 debug+info+notice+warn+crit+alert+emerg
存储位置的写法
/var/log/messages 直接存储在文件中
username 发送给登录的用户
@[hostname | IP] 发送给某台主机
对象和级别都可以用*来代表所有 *.* 所有对象的所有等级
存储日志的格式
date time hostname app(name)[pid]:messages
集中管理日志
服务器端配置 /etc/sysconfig/syslog
# Options to syslogd
# -m 0 disables 'MARK' messages.
# -r enables logging from remote machines
# -x disables DNS lookups on messages recieved with -r
# See syslogd(8) for more details
SYSLOGD_OPTIONS="-m 0 -r -x"
客户端配置 /etc/syslog.conf
*.* @10.10.10.254
既保存到本地又保存到服务器上
*.* /var/log/messages
*.* @10.10.10.254
定时任务
如果你希望服务器每天夜里去把某个目录备份,当然你不能每天夜里爬起来登录服务器上去操作
更多时候系统管理员都在使用计划任务,计划任务在linux里提供两种,一种at,一种cron
定时服务AT
at队列
用来存储尚未执行的任务,一旦执行了就从队列中将任务删除
队列的保存位置/var/spool/at/
at服务
用来检测和执行任务,每间隔1一分钟就会检查队列中是否有到时的任务.
at工具
用来添加,查看,删除定时任务的工具
at服务的启动和停止
service atd restart
at 参数
-l 查看任务列队
-d 删除任务
建立任务
[root@gw ~]# date
2009年 05月 29日 星期五 18:23:36 CST
[root@gw ~]# at 23:30
at> mkdir /root/2330_dir
at> <EOT>
job 1 at 2009-05-29 23:30
[root@gw ~]# at 23:40
at> touch /root/2330_dir/2340_file
at> <EOT>
job 2 at 2009-05-29 23:40
[root@gw ~]#
查看任务
jobID datetime class owner
a:at的任务 b:batch的任务
batch: when the load average drops below 0.8
[root@gw ~]# batch 23:50
at> rm -rf /root/2330_dir/2340_fil
at> <EOT>
job 4 at 2009-05-29 23:50
[root@gw ~]# at -l
1 2009-05-29 23:30 a root
2 2009-05-29 23:40 a root
4 2009-05-29 23:50 b root
[root@gw ~]# cd /var/spool/at/
[root@gw at]# ls
a00001013c4442 a00002013c444c b00004013c4456 spool
[root@gw at]#
查看任务内容
[root@gw at]# at -c 4
rm -rf /root/2330_dir/2340_fil
at的控制方法:
/etc/at.allow
/etc/at.deny
1.如果at.allow存在,则只有设定在文件里的使用者才能使用at
2.如果at.deny存在,则除了文件里的使用者都可以使用at
3.如果两个文件都存在,则遵循只有at.allow的情况.
4.如果两个文件都不存在,则只有root可以使用at
atrun
当某些因素导致at任务没执行时,可以手动执行 atrun
计划任务cron
at任务之能执行一次,若希望每周执行任务则at无法满足,此时应该使用cron
cron胜任周期性任务
cron的启动关闭
service crond restart
cron格式
min hour day mon week commands
min: 分 00-59
hour: 时 00-23
day: 日 1-31
mon: 月 1-12
week: 周 0-7 0和7都是周日
command:要执行的任务
使用方法
1,单一时间 00 11 * * * cmd
2,多个时间 00 9,18,22 * * * cmd
3,连续时间 00 9-18 * * * cmd 9-18点
4,所有时间 * * * * * cmd
5,间隔时间 */5 * * * * cmd 每5分钟
添加计划任务
crontab -e 添加
crontab -l 查看
crontab -r 删除
crontab -u username 查看某个用户的计划任务
cron的使用控制
/etc/cron.allow
/etc/cron.deny
1.如果cron.allow存在,则只有设定在文件里的使用者才能使用cron
2.如果cron.deny存在,则除了文件里的使用者都可以使用cron
3.如果两个文件都存在,则遵循只有cron.allow的情况.
4.如果两个文件都不存在,则只有root可以使用cron
系统自带的计划任务
# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
其中 root 是 user栏位,指明由哪个用户来执行
run_parts 后面必须接目录 会执行目录中每一个执行文件 按文件名的顺序
linux网络
网络接口名称
以太 标识 ethN
光纤 标识 fddiN
PPP 标识 pppN
环回 标识 lo 在IPC进程间通信及没有网络时使用
网卡的状态
mii-tool
查看网卡的信息
ifconfig [ -a | interface ]
不带-a则只查看已经启动的网卡,-a 则所有网卡
[root@gw cron.daily]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:BF:AC:86
inet addr:10.10.10.254 Bcast:10.10.10.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2332 errors:0 dropped:0 overruns:0 frame:0
TX packets:1851 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:201708 (196.9 KiB) TX bytes:233403 (227.9 KiB)
Interrupt:177 Base address:0x1400
Link encap: 网卡位于OSI模型中的名称
HWaddr : 网卡的物理地址
inet addr:Bcast:Mask: 配置的IP 广播 掩码
MTU:Metric:最大传输单元 和 默认的路由成本(跳数)
RX 接收
TX 发送
collisions:碰撞次数
txqueuelen:发送队列的长度
Frame Errors: An incorrect CRC and a non-integer number of bytes are received. This is usually the result of collisions or a bad Ethernet device.
错误的CRC效验数据,或一个非整数的字节数,这个错误通常是CSMA/CD碰撞或设备损坏引起
FIFO and Overrun Errors: The number of times that the NIC was unable of handing data to its memory buffers because the data rate the capabilities of the hardware. This is usually a sign of excessive traffic.
网卡的buffer溢出,通常是出了网卡的负荷传输数据引起的错误.
Carrier Errors: Errors are caused by the NIC card losing its link connection to the hub or switch. Check for faulty cabling or faulty interfaces on the NIC and networking equipment
物理连接错误,一般是网卡接口或与连接线,或者连接的交换机的错误
网卡的启用与停用
# ifconfig eth0 down
# ifconfig eth0 up
service network restart
网卡的配置文件
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/network-scripts/ifcfg-lo
/etc/sysconfig/network-scripts/ifcfg-eth1
[root@gw ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HWADDR=00:0c:29:bf:ac:86
IPADDR=10.10.10.254
NETMASK=255.255.255.0
TYPE=Ethernet
[root@gw ~]# vim /usr/share/doc/initscripts-8.45.25/sysconfig.txt
配置网络的GUI工具
system-config-network
IP别名
原则上,一个网卡一个IP,但有时候只有一个网卡时又要使用个IP.
此时可以使用IP别名的方法,将一个网卡绑定多个IP
ifconfig eth0:1 IP/mask
主机名:
# hostname
修改主机名
/etc/sysconfig/network
/etc/hosts
hostname host_name
DNS的客户端的设置
[root@gw ~]# cat /etc/resolv.conf
search uplooking.com # 当解析一个主机名时,自动在此域中搜索主机
nameserver 127.0.0.1 # 解析域名的服务器DNS地址 可以三个
[root@gw ~]#
/etc/hosts
10.10.10.10 gw.uplooking.com
解析主机的简易DNS文件
解析的顺序
顺序由 /etc/nsswitch.conf 中定义
hosts: files dns
linux路由
路由是TCP/IP网络中用来定义到达某一个网络的路径.
存储路由的信息的表叫路由表,linux的路由表是由kernel维护的.内核维护的路由表在内存中
service network restart 会自动更新路由表
设置默认网关的有效值
都包含GATEWAY哪个默认网关值最高
/etc/sysconfig/network
/etc/sysconfig/network-scripts/ifcfg-eth0
加载顺序 network --> ifcfg-eth0 --> ifcfg-eth1 最后加载的网卡则是默认网关
[root@gw ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 10.10.10.254 0.0.0.0 UG 0 0 0 eth0
[root@gw ~]#
Destination 路由的目的地
Gateway 该路由的网关位置
Genmask 目的地址的掩码
Flags 标记
Metric 路由成本
Ref 到达目的网络的其他路由参考数,非内核提供的路由
Use 环回时使用的这条路由次数
Iface 到达目的网络要从哪个网卡出发
更改路由表
route {add | del} {-net | -host} target [ netmask NETMASK ] [gw GATEWAY]
[root@gw ~]# route add -net 202.106.10.0/24 gw 10.10.10.1
[root@gw ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
202.106.10.0 10.10.10.1 255.255.255.0 UG 0 0 0 eth0
[root@gw ~]# route del -net 202.106.10.0/24 gw 10.10.10.1
更改默认网关
route add default gw 10.10.10.10
三次握手和四次握手
客户端状态 服务器端状态
LISTEN (被动打开)
主动打开 SYN_SENT ---syn j---------> SYN_RCVD
ESTABLISHED <--syn k +ack j+1-
---ack k+1 -----> ESTABLISHED
主动关闭 FIN_WAIT_1 ---fin m---------> CLOSE_WAIT(被动关闭)
FIN_WAIT_2 <--ack m+1--------
TIME_WAIT <--fin n---------- LAST_ACK
---ack n+1-------> CLOSED
也就是TCP/IP设计者本来是这么设计的
主要有两个原因
1。防止上一次连接中的包,迷路后重新出现,影响新连接
(经过2MSL(最大分段周期),上一次连接中所有的重复包都会消失)
2。可靠的关闭TCP连接
在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以
主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
TIME_WAIT 并不会占用很大资源的,除非受到攻击。
还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态
CLOSED: 这个没什么好说的了,表示初始状态。
LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听状态,可以接受连接了。
SYN_RCVD: 这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED:这个容易理解了,表示连接已经建立了。
FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。
FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。
TIME_WAIT: 表示收到了对方的FIN报文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。
CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。
CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。
LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。
tcpdump
-i eth0
-p arp icmp tcp udp
[ src | det ]port 80
-nn 以数字方式显示IP和端口(不做解析)
使用tcpdump抓包 查看三次握手 四次握手过程
# tcpdump -i eth0 -p tcp port 80 -nn -t
IP 125.34.40.173.2096 > 118.102.27.18.80: S 3684006233:3684006233(0) win 65535 <mss 1452,nop,wscale 2,nop,nop,timestamp 0 0,nop,nop,sackOK>
IP 118.102.27.18.80 > 125.34.40.173.2096: S 2985962741:2985962741(0) ack 3684006234 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 7>
IP 125.34.40.173.2096 > 118.102.27.18.80: . ack 1 win 64240
IP 118.102.27.18.80 > 125.34.40.173.2096: F 1:1(0) ack 1 win 46
IP 125.34.40.173.2096 > 118.102.27.18.80: . ack 2 win 64240
IP 125.34.40.173.2096 > 118.102.27.18.80: F 1:1(0) ack 2 win 64240
IP 118.102.27.18.80 > 125.34.40.173.2096: . ack 2 win 46