Nethogs 是一个终端下的网络流量监控工具,它的特别之处在于可以显示每个进程的带宽占用情况,这样可以更直观获取网络使用情况。它支持 IPv4 和 IPv6 协议、支持本地网卡及 PPP 链接。

有些时候服务器莫名其妙的向外发送大量的包,占用大量带宽,导致其他服务器受到影响。那么在流量异常的情况下,如何查看每个进程使用的带宽呢?可以使用nethogs工具来查看。

当然还有一些其他宽带分析工具,需要的同学可以多了解了解,有个帖子 http://os.51cto.com/art/201404/435279.htm 做了介绍。按应用分析还是比较常见,所以我一般使用nethogs,关于nethogs的安装下面做下说明:

1、下载
地址: http://sourceforge.net/projects/nethogs/files/nethogs/
下载安装包:nethogs-0.8.0.tar.gz (38.0 kB)

2、安装

yum install ncurses*
tar -zxvf nethogs-0.8.0.tar.gz
cd nethogs
make && make install

如果报错如下:

[[email protected] nethogs]# make && make install
g++ -g -Wall -Wextra -c packet.cpp
g++ -g -Wall -Wextra -c connection.cpp
g++ -g -Wall -Wextra -c process.cpp
g++ -g -Wall -Wextra -c refresh.cpp
refresh.cpp:9: warning: unused parameter ‘i’
cc -g -Wall -Wextra -c decpcap.c
decpcap.c:7:18: error: pcap.h: No such file or directory
In file included from decpcap.c:8:
decpcap.h:34: error: expected specifier-qualifier-list before ‘pcap_t’
decpcap.c:14: error: expected ‘)’ before ‘*’ token
decpcap.c: In function ‘dp_open_offline’:
decpcap.c:48: error: ‘pcap_t’ undeclared (first use in this function)
decpcap.c:48: error: (Each undeclared identifier is reported only once
decpcap.c:48: error: for each function it appears in.)
decpcap.c:48: error: ‘temp’ undeclared (first use in this function)
decpcap.c:48: warning: implicit declaration of function ‘pcap_open_offline’
decpcap.c:55: warning: implicit declaration of function ‘dp_fillhandle’
decpcap.c: In function ‘dp_open_live’:
decpcap.c:60: error: ‘pcap_t’ undeclared (first use in this function)
decpcap.c:60: error: ‘temp’ undeclared (first use in this function)
decpcap.c:60: warning: implicit declaration of function ‘pcap_open_live’
decpcap.c: In function ‘dp_addcb’:
decpcap.c:74: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c: In function ‘dp_parse_tcp’:
decpcap.c:84: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:86: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:87: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c: In function ‘dp_parse_ip’:
decpcap.c:99: error: dereferencing pointer to incomplete type
decpcap.c:103: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:105: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:106: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c: In function ‘dp_parse_ip6’:
decpcap.c:126: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:128: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:129: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c: In function ‘dp_parse_ethernet’:
decpcap.c:150: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:152: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:153: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c: In function ‘dp_parse_ppp’:
decpcap.c:196: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:198: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:199: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c: In function ‘dp_parse_linux_cooked’:
decpcap.c:238: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:240: error: ‘struct dp_handle’ has no member named ‘callback’
decpcap.c:241: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c: In function ‘dp_pcap_callback’:
decpcap.c:270: error: ‘struct dp_handle’ has no member named ‘userdata_size’
decpcap.c:271: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c:271: error: ‘struct dp_handle’ has no member named ‘userdata_size’
decpcap.c:273: error: ‘struct dp_handle’ has no member named ‘linktype’
decpcap.c:274: error: ‘DLT_EN10MB’ undeclared (first use in this function)
decpcap.c:277: error: ‘DLT_PPP’ undeclared (first use in this function)
decpcap.c:280: error: ‘DLT_LINUX_SLL’ undeclared (first use in this function)
decpcap.c:283: error: ‘DLT_RAW’ undeclared (first use in this function)
decpcap.c:284: error: ‘DLT_NULL’ undeclared (first use in this function)
decpcap.c:289: error: ‘struct dp_handle’ has no member named ‘linktype’
decpcap.c: In function ‘dp_dispatch’:
decpcap.c:296: error: ‘struct dp_handle’ has no member named ‘userdata’
decpcap.c:297: error: ‘struct dp_handle’ has no member named ‘userdata_size’
decpcap.c:298: warning: implicit declaration of function ‘pcap_dispatch’
decpcap.c:298: error: ‘struct dp_handle’ has no member named ‘pcap_handle’
decpcap.c: In function ‘dp_setnonblock’:
decpcap.c:302: warning: implicit declaration of function ‘pcap_setnonblock’
decpcap.c:302: error: ‘struct dp_handle’ has no member named ‘pcap_handle’
decpcap.c: In function ‘dp_geterr’:
decpcap.c:307: warning: implicit declaration of function ‘pcap_geterr’
decpcap.c:307: error: ‘struct dp_handle’ has no member named ‘pcap_handle’
make: * [decpcap.o] Error 1

执行命令

yum install libpcap-dev* libncurses5-dev*

然后再重新编译安装,如下:

[[email protected] nethogs]# make && make install
cc -g -Wall -Wextra -c decpcap.c
decpcap.c: In function ‘dp_open_live’:
decpcap.c:60: warning: passing argument 5 of ‘pcap_open_live’ discards qualifiers from pointer
/usr/include/pcap/pcap.h:349: note: expected ‘char ’ but argument is of type ‘const char
g++ -g -Wall -Wextra -c cui.cpp -DVERSION=/”0/” -DSUBVERSION=/”8/” -DMINORVERSION=/”0/”
g++ -g -Wall -Wextra -c inode2prog.cpp
g++ -g -Wall -Wextra -c conninode.cpp
g++ -c -o devices.o devices.cpp
g++ -g -Wall -Wextra nethogs.cpp packet.o connection.o process.o refresh.o decpcap.o cui.o inodee.o devices.o -o nethogs -lpcap -lm -lncurses -DVERSION=/”0/” -DSUBVERSION=/”8/” -DMINORVERSION=
g++ -g -Wall -Wextra decpcap_test.cpp decpcap.o -o decpcap_test -lpcap -lm
install -d -m 755 /usr/local/sbin
install -m 755 nethogs /usr/local/sbin
install -d -m 755 /usr/local/share/man/man8/
install -m 644 nethogs.8 /usr/local/share/man/man8/

这样已经算是成功安装完成,输入命令 nethogs 即可查看应用的宽带占用情况。
下图是我开启了2个命令窗口做的测试:
图片

Shapefile是上个世纪90年代的数据格式,但是由于它开放易用至今仍然倍受欢迎,最近与shapefile编码相关的问题此起彼伏连绵不绝,整理下几个高频问题共享之。

为什么我的shapefile在ArcGIS 10.3中打开乱码?

原因

这个问题的根本原因就是读取文件使用的编码类型和文件实际存储的编码类型不一致。

Shapefile文件的头文件(dBase Header)中,一般会包含shapefile使用的编码类型的信息,这个信息成为 LDID ( Language Driver ID),这样在使用应用程序打开 shapefile 的时候,应用程序就知道用何种编码类型去正确读取它,而不会发生乱码。 在 ArcGIS Desktop 生产的 shapefile 数据中通常会包含这项信息。在Shapefile的子文件中,有时我们还会发现同名 *.cpg 文件,文件中也存储了编码信息,用记事本打开,看到例如 utf-8。

二者被ArcGIS 识别的优先顺序是,LDID 优先于 CPG文件。也就是如果头文件中没有约定读shapefile的编码类型时,如果这时刚好有个CPG文件,那么ArcGIS就会使用这里的编码类型读取。

我们知道 shapefile 是个开放格式,只要你了解了数据规范,完全可以脱离ArcGIS自己生产出来。在Windows中文语言设置下,假设你自己写代码或者使用第三方的程序生产了shapefile,例如MapGIS,默认使用 CP936(GBK)编码存储,但是无论粗心大意还是有意为之没有在数据头文件中约定“我用了936!”。如果是 ArcGIS 10.2 和之前的版本,那么没问题,ArcGIS 默认就是以这种方式识别,没有乱码。可是拿到 ArcGIS 10.2.1 ,ArcGIS 10.2.2,ArcGIS 10.3.x 这几个版本中发现乱!码!了!在缺失 LDID 和 CPG时,这几个版本默认使用 UTF-8 来读取 shapefile,这样必然乱码了。

解决方法

在shapefile子文件旁边创建个记事本,修改为同名的CPG文件,文本内容oem或者936

这里写图片描述

这里写图片描述

这样 ArcGIS 10.2.1 、10.2.10.3.x 在读取的时候,就知道你的数据是这种编码类型存储的,从而按照正确的方式读取。

这里写图片描述

为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?低版本中不是至少可以存储4个汉字吗?

原因

这个问题仍然与编码类型有关。

ArcGIS 10.2 以及更早的版本,ArcGIS写shapefile的时候,遇到中文默认使用Windows当前语言 字符集编码(也称 代码页/CodePage/OEM CodePage),例如中文一般使用的是 CodePage 936(GBK)

ArcGIS 10.2.1 以及之后的版本,ArcGIS写shapefile的时候,默认使用的是 UTF-8 编码类型。

这两种编码类型存储汉字所使用的字节数是不相同的,上面的关键字中我也给出了 wiki 的链接,有兴趣点进去看看详情。简言之,shapefile自身的限制是字段为9个字节,CP936编码下汉字通常为双字节存储,因此可以存储 9/2=4 个汉字;UTF-8 编码下汉字至少需要3个字节存储,因此最多只能存储 9/3=3 个汉字了。

这里写图片描述

举个例子,在Python命令行中,我们求一下 Unicode字符串的长度就可以真相大白。

这里写图片描述

解决方法

Perfect Solution

使用地理数据库,放弃shapefile,避免各种截断问题,这也是存储地理数据的康庄大道。

但是,shapefile的拥趸说“我的需求是恢复以前存储4个汉字的shapefile,我不想用地理数据库,我希望得到老版本的shapefile的结果,我不在乎shapefile的编码类型是什么 ……bla bla……”好吧,挤一挤方法还是有的。

Workaround

这里还有个注意事项:
如果你用的刚好是 10.2.110.2.2 这两个版本,那么要打补丁后以下设置才生效。以前写过另外一篇,详情点 这里
如果你用的是 10.3.x ,那么直接向下进行。

  1. 打开注册表,定位到 ‘My Computer/HKEY_CURRENT_USER/Software/ESRI/Desktop 10.x
  2. 创建项 ‘Common‘, 接着在其下创建 ‘CodePage’ 项, 添加 ‘字符串’,名称: dbfDefault,健值:oem(或者 936)

    这里写图片描述

这样ArcGIS Desktop读写shapefile的默认方式就将是Windows当前语言 OEM CodePage 936

我如何检测当前shapefile使用了什么编码类型?

shapfile本身是个开放格式,当然我们有很多种途径查看shapefile的内部,读者中不乏代码大牛,只要了解数据规范应该方法多多。

我这里就分享一种通过 python 查看编码类型的简单的方法,使用python中的 struct模块 可以处理二进制数据,从而探测下 shapefile 的子文件 dbf 的头文件中的 LDID 信息是什么。

python代码示例:

#-*-coding:utf-8 -*-
__author__ = 'kikita'

import struct

dbf = u'D:/ExportShapefiles/中文字段.dbf'
dat = open(dbf, 'rb').read(30)[29:]
id = struct.unpack('B', dat)[0]

print(id, hex(id))

例如,得到这样的打印结果: (77, '0x4d') 通过这样的 ID 到 编码表 中查到就是 CodelPage 936。

这里写图片描述

当然如果有你更好的方法,博主求分享,可以直接在评论区里贴出来,共同讨论。

上面是三个最常被问到的问题,这三个问题通了,那么好多shapefile读写乱码问题就迎刃而解了。

通常一般的企业都会设置备份文件服务器或者共享文件,但是很容易勿删文件。windiws server 提供了一个卷影副本功能。

详细的知识点不做介绍,实地演示下如何使用。

一、配置

(1)共享与存储(管理工具)

卷影副本项若打绿勾,表示已经启用卷影副本。


(2)选择磁盘点击右键属性


(3)启用与禁用卷影副本


(4)立即创建与设置创建计划



(5)测试:执行立即创建卷影副本。


(6)删除新建文档


二、还原

(1)找到共享问卷,选择卷影副本创建日期。


(2)

打开:可以预览目录

复制:复制到新的目录下还原

还原:直接替换现有的目录

(3)测试下打开预览,选择需要恢复的文件。


通常一般的企业都会设置备份文件服务器或者共享文件,但是很容易勿删文件。windiws server 提供了一个卷影副本功能。

详细的知识点不做介绍,实地演示下如何使用。

一、配置

(1)共享与存储(管理工具)

卷影副本项若打绿勾,表示已经启用卷影副本。


(2)选择磁盘点击右键属性


(3)启用与禁用卷影副本


(4)立即创建与设置创建计划



(5)测试:执行立即创建卷影副本。


(6)删除新建文档


二、还原

(1)找到共享问卷,选择卷影副本创建日期。


(2)

打开:可以预览目录

复制:复制到新的目录下还原

还原:直接替换现有的目录

(3)测试下打开预览,选择需要恢复的文件。


ERP服务器每天备份与每月1号备份数据。备份到本机。从备份安全机制来说这是远远不够的。故能否定期备份数据文件到另外一台服务器呢?(异地备份)
windows server 提供了server backup的功能,那就来试试吧!

一、安装windows server backup
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
二、进行设置一次备份或者制定备份计划
输入wbadmin.msc
A服务器数据
这里写图片描述
B服务器
这里写图片描述

A服务器数据—备份—>B服务器数据

(1)一次备份:每次手工执行备份,过程类似备份计划,在此不再截图过程。
(2)备份计划
设置备份计划:
整个服务器:备份所有数据库数据,运用程序和系统状态
或自定义卷 文件用于备份
这里写图片描述
本次以备份制定文件夹:添加目录
这里写图片描述
备份频率与定时备份
这里写图片描述
存储位置:
本次备份到网络共享
这里写图片描述
选择共享文件夹
这里写图片描述
注册备份计划:
需要输入目标服务器账号密码:
这里写图片描述
这里写图片描述
这里写图片描述
三、恢复
点击恢复:
这里写图片描述
指定恢复文件夹
这里写图片描述
选择服务器
这里写图片描述
选择备份日期
这里写图片描述
这里写图片描述
选择需要恢复的文件:
因为存在多次循环备份,故选择时间点
这里写图片描述
这里写图片描述

这里写图片描述
这里写图片描述
查看恢复数据:
这里写图片描述

总结:容易出现访问目标数据库的时候出现:凭据无效或者未知的用户名或密码错误。
建议:(1)尽量在域环境下进行,用域管理员账号和密码进行
(2)共享文件夹设置管理员或者管理组共享
(3)在工作组环境下,若实在无法访问,就在两个服务器中新建一样账号和密码并归属管理员组权限。