
暂无个人介绍
分布式监控系统ganglia 1.简介: ganglia是一款为HPC(高性能计算)集群而设计的可扩展的分布式监控系统,它可以监控和显示集群中cpu,内存,磁盘利用率,i/o负载,网络流量等情况 优点:良好的扩展性,负载开销低,支持高并发。广泛支持各种操作系统和cpu架构,支持虚拟机 2.组成: gmond:用于收集本节点的信息并发送到其他节点,同时也接收其他节点发送过来的数据,默认端口为8649 gmetad:运行在一个数据汇聚节点,定期检查每个节点的gmond进程,并从哪里获取数据,然后将数据 存储在本地rrd引擎中 webfrontend:基于web的图形化监控界面,和gmetad安装在一个节点上,读取数据,并通过rrdtool生成图表 3.工作原理 node:单台服务器 cluster:一个服务器集群 grid:表示一个网格,由多个集群组成 4.数据走向: gmond:收集本地的监控数据,发送到其他机器上。他们之间用udp协议通信,文件格式为xdl,传输方式支持单播点对点和多播传送 gmetad:周期性的到gmond节点或gmetad节点上获取数据。用tcp协议通信,文件格式为xml gmetad:将获取到的数据更新到rrds数据库中 通过web界面,从gmetad取数据,并且读取rrds数据库,生成图片显示出来 5.工作模式:单播和多播,默认采用多播 单播:监控节点发送本机数据到指定的一台或几台机器上,单播可以跨越不同的网段 多播:监控节点发送本机数据到同意网段内的所有机器上,同时也接收同一网段内所有机器发过来的监控数据。 环境:centos6.5 ganglia_gmetad 192.168.32.200 ganglia_gmond:192.168.32.202 6.ganglia的安装 yum安装 安装第三方源:epel ganglia安装飞卫两个部分:gmetad(管理端)和gmond(客户端) yum -y install ganglia-gmetad yum -y install ganglia-gmond 源码安装 安装依赖 服务器的安装 yum -y install expat expat-devel pcre pcre-devel zlib cairo-devel libxml2-devel devel libxml2-develpango-devel pango libpng-devel libpng freetype freetype-devel libart-lgpl-devel apr-devel yum -y install pango-devel yum -y install perl-ExtUtils-MakeMaker 安装apr,confuse,rrdtool tar zxvf apr-1.4.6.tar.gz cd apr-1.4.6 ./configure make && make install tar zxvf confuse-2.7.tar.gz cd confuse-2.7 ./configure CFLAGS=-fPIC --disable-nls make && make install tar zxvf rrdtool-1.4.7.tar.gz ./configure --disable-tcl --prefix=/usr/local/rrdtool cd rrdtool-1.4.7 make && make install tar zxvf ganglia-3.4.0.tar.gz cd ganglia-3.4.0 ./configure --prefix=/usr/local/ganglia --with-static-modules --enable-gexec --enable-status --with-gmetad --with-python=/usr --with-librrd=/usr/local/rrdtool/ --with-libexpat=/usr/ --with-libconfuse=/usr/local/ --with-libpcre=/usr/local/ make && make install cp gmetad.conf /usr/local/ganglia/etc/ cp gmetad.init /etc/init.d/gmetad cd /etc/init.d/ vim gmetad GMETAD=/usr/local/ganglia/sbin/gmetad chkconfig --add gmetad service gmetad start ip route add 239.2.11.71 dev eth1 [root@ganglia_gmetad gmetad]# /etc/init.d/gmetad status gmetad 已死,但是 subsys 被锁 解决办法 [root@ganglia_gmetad gmetad]# mkdir -p /var/lib/ganglia/rrds [root@ganglia_gmetad gmetad]# chown nobody:nobody /var/lib/ganglia/rrds/ [root@ganglia_gmetad gmetad]# /etc/init.d/gmetad start Starting GANGLIA gmetad: [确定] netstat -tunpl tcp 0 0 0.0.0.0:8651 0.0.0.0:* LISTEN 43524/gmetad tcp 0 0 0.0.0.0:8652 0.0.0.0:* LISTEN 43524/gmetad 安装ganglia的web yum -y install php-fpm vim /etc/httpd/conf/httpd.conf AddType application/x-httpd-php .php .phtml DirectoryIndex index.html index.php /etc/php-fpm start /etc/init.d/httpd start tar zxvf ganglia-web-3.5.7.tar.gz mv ganglia-web-3.5.7/conf_default.php /var/www/html/ganglia/ cd /var/www/html/ganglia/ cp conf_default.php conf.php mkdir /var/www/html/ganglia/dwoo/cache mkdir /var/www/html/ganglia/dwoo/compiled chmod 777 /var/www/html/ganglia/dwoo/cache chmod 777 /var/www/html/ganglia/dwoo/compiled vim conf.php $conf['gweb_confdir'] = "/var/www/html/ganglia"; #ganglia的web目录 $conf['gmetad_root'] = "/usr/local/ganglia"; #ganglia的安装目录 $conf['rrds'] = "/var/lib/ganglia/rrds"; #rrd数据库路径 $conf['dwoo_compiled_dir'] = "${conf['gweb_confdir']}/dwoo/compiled"; #需要777权限 $conf['dwoo_cache_dir'] = "${conf['gweb_confdir']}/dwoo/cache"; #需要777权限 $conf['rrdtool'] = "/usr/local/rrdtool/bin/rrdtool"; #rrdtool路径 $conf['graphdir']= $conf['gweb_root'] . '/graph.d'; #生成图形模板目录 $conf['ganglia_ip'] = "127.0.0.1"; #gmetad服务器的地址 $conf['ganglia_port'] = 8652; #gmetad服务器的交互式提供监控数据端口发布 浏览器访问http://192.168.32.200/ganglia/ 客户端配置 安装依赖 yum -y install expat expat-devel pcre pcre-devel zlib cairo-devel libxml2-devel devel libxml2-develpango-devel pango libpng-devel libpng freetype freetype-devel libart-lgpl-devel apr-devel yum -y install pango-devel yum -y install perl-ExtUtils-MakeMaker 安装apr,confuse,rrdtool tar zxvf apr-1.4.6.tar.gz cd apr-1.4.6 ./configure make && make install tar zxvf confuse-2.7.tar.gz cd confuse-2.7 ./configure CFLAGS=-fPIC --disable-nls make && make install tar zxvf rrdtool-1.4.7.tar.gz cd rrdtool-1.4.7 ./configure --disable-tcl --prefix=/usr/local/rrdtool make && make install tar zxvf ganglia-3.4.0.tar.gz cd ganglia-3.4.0 ./configure --prefix=/usr/local/gnaglia --enable-gexec --enable-status --with-python=/usr/ \ > --with-libapr=/usr/local/apr/bin/apr-1-config --with-libconfuse=/usr/local/ --with-gmetad-libexpat=/usr/ --with-libpcre=/usr/ cd gmond/ ./gmond -t >/usr/local/gnaglia/etc/gmond.conf cp gmond.init /etc/init.d/gmond vim /etc/init.d/gmond /usr/local/gnaglia/sbin/gmond chkconfig --add gmond /etc/init.d/gmond start ip route add 239.2.11.71 dev eth1 netstat -tunpl tcp 0 0 0.0.0.0:8649 0.0.0.0:* LISTEN 54754/gmond udp 0 0 239.2.11.71:8649 0.0.0.0:* 54754/gmond gmetad配置 vim /usr/local/ganglia/etc/gmetad.comf data_source "cluster" 192.168.32.202 #后面可以跟主机名 其他的配置都是默认的 /etc/init.d/gmetad restart gmond配置 cd /usr/local/gnaglia/etc vim gmond.conf cluster { name = "cluster" owner = "unspecified" latlong = "unspecified" url = "unspecified" } mcast_join = 239.2.11.71 port = 8650 ttl = 1 udp_recv_channel { mcast_join = 239.2.11.71 port = 8650 bind = 239.2.11.71 retry_bind = true } tcp_accept_channel { port = 8650 } /etc/init.d/gmond restart 本文转自 shouhou2581314 51CTO博客,原文链接:http://blog.51cto.com/thedream/1610313,如需转载请自行联系原作者
初探UNION和UNION ALL 首先我们过一遍二者的基本概念和使用方法,UNION和UNION ALL是将两个表或者多个表进行JOIN,当然表的数据类型必须相同,对于UNION而言它会去除重复值,而UNION ALL则会返回所有数据,这就是二者的区别和使用方法。下面我们来看一个简单的例子。 USE TSQL2012 GO--USE UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 2 UNION ALL SELECT 3--USE UNION SELECT 1 UNION SELECT 2 UNION SELECT 2 UNION SELECT 3 上述我们稍微讲解了下二者的基本使用,接下来我们来看看二者的性能比较。 进一步探讨UNION 和 UNION ALL性能问题 我们首先创建两个测试表Table1和Table2 USE TSQL2012 GO CREATE TABLE Table1 ( col VARCHAR(10) ) CREATE TABLE Table2 ( col VARCHAR(10) ) 在表Table1中插入如下测试数据 USE TSQL2012 GO INSERT INTO Table1 SELECT 'First'UNION ALL SELECT 'Second'UNION ALL SELECT 'Third'UNION ALL SELECT 'Fourth'UNION ALL SELECT 'Fifth' 在表Table2中插入如下测试数据 USE TSQL2012 GO INSERT INTO Table2 SELECT 'First'UNION ALL SELECT 'Third'UNION ALL SELECT 'Fifth' 我们查询下两个表插入的测试数据 USE TSQL2012 GO SELECT *FROM Table1 SELECT *FROM Table2 接着分别利用UNION和UNION ALL来查询数据比较二者性能开销 USE TSQL2012 GO--UNION ALL SELECT *FROM Table1 UNION ALL SELECT *FROM Table2--UNION SELECT *FROM Table1 UNION SELECT *FROM Table2 此时我们能够很明显的看到因为UNION要去除重复所以会进行DISTINCT Sort操作使得其性能要低于UNION ALL。到这里我们可以下个基本结论。 UNION VS UNION ALL性能分析结论:当使用UNION查询语句时类似会进行SELECT DISTINCT操作,除非我们非常明确要返回唯一不重复的值那就用UNION,否则使用UNION ALL会带来更好的性能,返回结果集更快。 是不是到此就完了呢,使用UNION和UNION ALL就这么简单么,那你就太天真了,我们继续往下看。 深入探讨UNION 和 UNION ALL(一) 我们声明一个表变量插入数据并利用UNION ALL来进行查询 USE TSQL2012 GO DECLARE @tempTable TABLE(col TEXT) INSERT INTO @tempTable(col) SELECT 'JeffckyWang'SELECT col FROM @tempTableUNION ALL SELECT 'Test UNION ALL' 此时对应返回合并结果集,恩,没毛病,我们接下来看看UNION USE TSQL2012 GO DECLARE @tempTable TABLE(col TEXT) INSERT INTO @tempTable(col) SELECT 'JeffckyWang'SELECT col FROM @tempTableUNION SELECT 'Test UNION ALL' 此时毛病就出来了,说什么数据类型text不可比,不能将其用作UNIN、INTERSERCT或EXCEPT等运算符的操作数,这是什么意思,不太懂。在我们讲解UNION和UNION ALL的性能问题时,我们已经标出UNION的查询计划,UNION会进行DISTINCT Sort操作,这说明什么呢?实际上它内部会进行自动排序同时移除重复的数据,此时数据类型为TEXT所以无法对TEXT类型进行排序,换句话说UNION不支持TEXT类型。所以到这里我们可以给出一个结论。 当利用UNION进行查询时,如果查询列中有TEXT数据类型时,此时会发生错误,因为UNION内部会自动对数据进行排序,而TEXT是无法进行排序的,所以UNION不支持TEXT数据类型。 好了到了这里,我们才算是给出第一个需要注意的地方,下面我们再来看一个。 深入探讨UNION和UNION ALL(二) 当我们对两个表进行UNION ALL时,此时我们如果有这样一个需求,需要使用UNION ALL前后的表是进行排序的,那么此时我们应该如何做呢?下面我们创建测试表看看。 USE TSQL2012 GO CREATE TABLE Table1 (ID INT, Col1 VARCHAR(100)); CREATE TABLE Table2 (ID INT, Col1 VARCHAR(100)); GO INSERT INTO Table1 (ID, Col1) SELECT 1, 'Col1-t1'UNION ALL SELECT 2, 'Col2-t1'UNION ALL SELECT 3, 'Col3-t1'; INSERT INTO Table2 (ID, Col1) SELECT 3, 'Col1-t2'UNION ALL SELECT 2, 'Col2-t2'UNION ALL SELECT 1, 'Col3-t2'; GO 此时我们查询上述Table1和Table2数据如下: 我们的需求是利用UNION ALL将Table1和Table2合并时,其顺序分别是1,2,3和1,2,3。对于UNION查询我们就不用讨论,内部会自行排序,如下则是利用UNION对数据进行排序的结果: 当我们进行UNION ALL时呢 USE TSQL2012 GO SELECT ID, Col1 FROM dbo.Table1 UNION ALL SELECT ID, Col1 FROM dbo.Table2 GO 显然满足不了我们的需求,在Table2表中的数据我们需要的是1,2,3。那么我们对Table2中的ID进行ORDER BY结果会如何呢? USE TSQL2012 GO SELECT ID, Col1 FROM dbo.Table1 UNION ALL SELECT ID, Col1 FROM dbo.Table2 ORDER BY ID GO 使用UNION ALL通过对Table2表上的ID进行ORDER BY此时得到的结果和上述UNION查询的结果很类似,但是还是没有得到我们的结果。上述对于两个结果集进行合并后的排序也可以进行如下查询: USE TSQL2012 GO SELECT * FROM (SELECT ID, Col1 FROM dbo.Table1 UNION ALL SELECT ID, Col1 FROM dbo.Table2) as t ORDER BY ID 对于查询我们能够自定义常量列,我们接下来添加一个额外的常量列,先对其常量列进行排序,然后对ID进行ORDER BY呢,结果又会是怎样的呢? USE TSQL2012 GO SELECT ID, Col1, 'addtionalcol1' AS addtionalCol FROM dbo.Table1 UNION ALL SELECT ID, Col1, 'addtionalCol2' AS addtionalColFROM dbo.Table2 ORDER BY addtionalCol, ID GO 到这里算是基本完成我们的需求,貌似需要额外添加一个列,虽然效果不是太好。 本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1926499,如需转载请自行联系原作者
mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要, 只需要知道结果,既然是索引那这个数据结构最后是排好序;就像新华字典他的目录就是按照a,b,c..这样排好序的; 所以你在找东西的时候才快,比如你找 “中” 这个字的解释,你肯定就会定位到目录的 z 开头部分; 组合索引可以这样理解,比如(a,b,c),abc都是排好序的,在任意一段a的下面b都是排好序的,任何一段b下面c都是排好序的; 组合索引的生效原则是 从前往后依次使用生效,如果中间某个索引没有使用,那么断点前面的索引部分起作用,断点后面的索引没有起作用; 比如 where a=3 and b=45 and c=5 .... 这种三个索引顺序使用中间没有断点,全部发挥作用;where a=3 and c=5... 这种情况下b就是断点,a发挥了效果,c没有效果where b=3 and c=4... 这种情况下a就是断点,在a后面的索引都没有发挥作用,这种写法联合索引没有发挥任何效果;where b=45 and a=3 and c=5 .... 这个跟第一个一样,全部发挥作用,abc只要用上了就行,跟写的顺序无关 (a,b,c) 三个列上加了联合索引(是联合索引 不是在每个列上单独加索引) 还需注意, (a,b,c)多列索引和 (a,c,b)是不一样的,看上面的图也看得出来关系顺序是不一样的; 分析几个实际例子来加强理解; 分析句子中使用的索引情况 (0) select * from mytable where a=3 and b=5 and c=4; abc三个索引都在where条件里面用到了,而且都发挥了作用 (1) select * from mytable where c=4 and b=6 and a=3; 这条语句列出来只想说明 mysql没有那么笨,where里面的条件顺序在查询之前会被mysql自动优化,效果跟上一句一样 (2) select * from mytable where a=3 and c=7; a用到索引,b没有用,所以c是没有用到索引效果的 (3) select * from mytable where a=3 and b>7 and c=3; a用到了,b也用到了,c没有用到,这个地方b是范围值,也算断点,只不过自身用到了索引 (4) select * from mytable where b=3 and c=4; 因为a索引没有使用,所以这里 bc都没有用上索引效果 (5) select * from mytable where a>4 and b=7 and c=9; a用到了 b没有使用,c没有使用 (6) select * from mytable where a=3 order by b; a用到了索引,b在结果排序中也用到了索引的效果,前面说了,a下面任意一段的b是排好序的 (7) select * from mytable where a=3 order by c; a用到了索引,但是这个地方c没有发挥排序效果,因为中间断点了,使用 explain 可以看到 filesort (8) select * from mytable where b=3 order by a; b没有用到索引,排序中a也没有发挥索引效果 本文转自 wangergui 51CTO博客,原文链接:http://blog.51cto.com/wangergui/1904048,如需转载请自行联系原作者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 一:配置好repo仓库,IP地址, [root@linux-node1 yum.repos.d]# ll total 28 -rw-r--r--. 1 root root 1664 Dec 9 2015 CentOS-Base.repo -rw-r--r--. 1 root root 1309 Dec 9 2015 CentOS-CR.repo -rw-r--r--. 1 root root 649 Dec 9 2015 CentOS-Debuginfo.repo -rw-r--r--. 1 root root 290 Dec 9 2015 CentOS-fasttrack.repo -rw-r--r--. 1 root root 630 Dec 9 2015 CentOS-Media.repo -rw-r--r--. 1 root root 1331 Dec 9 2015 CentOS-Sources.repo -rw-r--r--. 1 root root 1952 Dec 9 2015 CentOS-Vault.repo #使用阿里云的epel源 [root@linux-node1 yum.repos.d]# wget https://mirrors.aliyun.com/repo/epel-7.repo Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 115.28.122.210, 112.124.140.210 Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|115.28.122.210|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 1084 (1.1K) [application/octet-stream] Saving to: ‘epel-7.repo’ 100%[========================================================================================================================================================================>] 1,084 --.-K/s in 0s 2017-02-21 09:28:26 (82.2 MB/s) - ‘epel-7.repo’ saved [1084/1084] [root@linux-node1 yum.repos.d]# ls CentOS-Base.repo CentOS-CR.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Sources.repo CentOS-Vault.repo epel-7.repo [root@linux-node1 yum.repos.d]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:e6:8c:cc brd ff:ff:ff:ff:ff:ff inet 192.168.56.11/24 brd 192.168.56.255 scope global eth0 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fee6:8ccc/64 scope link valid_lft forever preferred_lft forever 二:yum安装cobbler 1 [root@linux-node1 yum.repos.d]# yum install httpd dhcp tftp xinetd bind bind-chroot caching-nameserver cobbler cobbler-web python-ctypes 三:关闭防火墙 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [root@linux-node1 yum.repos.d]# systemctl stop firewalld [root@linux-node1 yum.repos.d]# chkconfig firewalld off Note: Forwarding request to 'systemctl disable firewalld.service'. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service. [root@linux-node1 yum.repos.d]# getenforce Enforcing [root@linux-node1 yum.repos.d]# setenforce 0 #临时生效 [root@linux-node1 yum.repos.d]# getenforce Permissive [root@linux-node1 yum.repos.d]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: permissive Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Max kernel policy version: 28 #编辑配置文件,把SELINUX修改成disabled,永久生效,需要重启OS [root@linux-node1 yum.repos.d]# vim /etc/sysconfig/selinux 四:启动服务并检查 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@linux-node1 yum.repos.d]# systemctl start httpd [root@linux-node1 yum.repos.d]# systemctl start cobblerd [root@linux-node1 yum.repos.d]# systemctl start xinetd [root@linux-node1 yum.repos.d]# netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1687/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2182/master tcp 0 0 127.0.0.1:25151 0.0.0.0:* LISTEN 3985/python2 tcp6 0 0 :::80 :::* LISTEN 3956/httpd tcp6 0 0 :::22 :::* LISTEN 1687/sshd tcp6 0 0 ::1:25 :::* LISTEN 2182/master tcp6 0 0 :::443 :::* LISTEN 3956/httpd 五:配置cobbler, 执行cobbler check命令后,会出现提示,告知需要修改的地方,按照说明修改即可: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@linux-node1 yum.repos.d]# cobbler check The following are potential configuration items that you may want to fix: 1 : The 'server' field in /etc/cobbler/settings must be set to something other than localhost, or kickstarting features will not work. This should be a resolvable hostname or IP for the boot server as reachable by all machines that will use it. 2 : For PXE to be functional, the 'next_server' field in /etc/cobbler/settings must be set to something other than 127.0.0.1, and should match the IP of the boot server on the PXE network. 3 : SELinux is enabled. Please review the following wiki page for details on ensuring cobbler works correctly in your SELinux environment: https://github.com/cobbler/cobbler/wiki/Selinux 4 : change 'disable' to 'no' in /etc/xinetd.d/tftp 5 : some network boot-loaders are missing from /var/lib/cobbler/loaders, you may run 'cobbler get-loaders' to download them, or, if you only want to handle x86/x86_64 netbooting, you may ensure that you have installed a *recent* version of the syslinux package installed and can ignore this message entirely. Files in this directory, should you want to support all architectures, should include pxelinux.0, menu.c32, elilo.efi, and yaboot. The 'cobbler get-loaders' command is the easiest way to resolve these requirements. 6 : enable and start rsyncd.service with systemctl 7 : debmirror package is not installed, it will be required to manage debian deployments and repositories 8 : ksvalidator was not found, install pykickstart 9 : The default password used by the sample templates for newly installed machines (default_password_crypted in /etc/cobbler/settings) is still set to 'cobbler' and should be changed, try: "openssl passwd -1 -salt 'random-phrase-here' 'your-password-here'" to generate new one 10 : fencing tools were not found, and are required to use the (optional) power management features. install cman or fence-agents to use them Restart cobblerd and then run 'cobbler sync' to apply changes. 5.1 下面开始对上面的步骤提示进行修改, 1、对/etc/cobbler/setting中,修改server行,改成 1 server: 192.168.56.11 2、修改‘next_server’ 1 next_server: 192.168.56.11 3、关闭selinux,需要重启系统 4、修改tftp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@linux-node1 yum.repos.d]# vim /etc/xinetd.d/tftp # default: off # description: The tftp server serves files using the trivial file transfer \ # protocol. The tftp protocol is often used to boot diskless \ # workstations, download configuration files to network-aware printers, \ # and to start the installation process for some operating systems. service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 } 5、执行命令cobbler get-loaders,他会自动下载相关的启动引导文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@linux-node1 yum.repos.d]# cobbler get-loaders task started: 2017-02-21_101556_get_loaders task started (id=Download Bootloader Content, time=Tue Feb 21 10:15:56 2017) downloading https://cobbler.github.io/loaders/README to /var/lib/cobbler/loaders/README downloading https://cobbler.github.io/loaders/COPYING.elilo to /var/lib/cobbler/loaders/COPYING.elilo downloading https://cobbler.github.io/loaders/COPYING.yaboot to /var/lib/cobbler/loaders/COPYING.yaboot downloading https://cobbler.github.io/loaders/COPYING.syslinux to /var/lib/cobbler/loaders/COPYING.syslinux downloading https://cobbler.github.io/loaders/elilo-3.8-ia64.efi to /var/lib/cobbler/loaders/elilo-ia64.efi downloading https://cobbler.github.io/loaders/yaboot-1.3.17 to /var/lib/cobbler/loaders/yaboot downloading https://cobbler.github.io/loaders/pxelinux.0-3.86 to /var/lib/cobbler/loaders/pxelinux.0 downloading https://cobbler.github.io/loaders/menu.c32-3.86 to /var/lib/cobbler/loaders/menu.c32 downloading https://cobbler.github.io/loaders/grub-0.97-x86.efi to /var/lib/cobbler/loaders/grub-x86.efi downloading https://cobbler.github.io/loaders/grub-0.97-x86_64.efi to /var/lib/cobbler/loaders/grub-x86_64.efi *** TASK COMPLETE *** 6、启动服务rsyncd.service 1 systemctl start rsyncd 7、安装pykickstart 1 yum install pykickstart -y 8、生成新的密码,默认的过于简单,命令:openssl passwd -1 -salt 'random-phrase-here' 'your-password-here' 1 2 [root@linux-node1 yum.repos.d]# openssl passwd -1 -salt '123' '123456' $1$123$7mft0jKnzzvAdU4t0unTG1 把这个新生成的密钥,写入setting配置文件中的对应位置上 1 default_password_crypted: "$1$123$7mft0jKnzzvAdU4t0unTG1" 9、安装fence-agents 1 yum install fence-agents 10、可以不用管它 当然也可以安装这个服务,安装完毕后,需要修改配置文件 1 2 3 4 5 wget yum localinstall debmirror-20090807-1.el5.noarch.rpm vim /etc/debmirror.conf #将23和25行注释掉 23 #@dists=”sid”; 25 #@arches=”i386″; 上面所有的步骤操作完毕后,重启cobbler,然后执行“cobbler sync” 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [root@linux-node1 ~]# systemctl restart cobblerd [root@linux-node1 ~]# [root@linux-node1 ~]# [root@linux-node1 ~]# cobbler sync task started: 2017-02-21_104452_sync task started (id=Sync, time=Tue Feb 21 10:44:52 2017) running pre-sync triggers cleaning trees removing: /var/lib/tftpboot/pxelinux.cfg/default removing: /var/lib/tftpboot/grub/images removing: /var/lib/tftpboot/grub/grub-x86.efi removing: /var/lib/tftpboot/grub/grub-x86_64.efi removing: /var/lib/tftpboot/grub/efidefault removing: /var/lib/tftpboot/s390x/profile_list copying bootloaders trying hardlink /var/lib/cobbler/loaders/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0 copying: /var/lib/cobbler/loaders/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0 trying hardlink /var/lib/cobbler/loaders/menu.c32 -> /var/lib/tftpboot/menu.c32 copying: /var/lib/cobbler/loaders/menu.c32 -> /var/lib/tftpboot/menu.c32 trying hardlink /var/lib/cobbler/loaders/yaboot -> /var/lib/tftpboot/yaboot copying: /var/lib/cobbler/loaders/yaboot -> /var/lib/tftpboot/yaboot trying hardlink /usr/share/syslinux/memdisk -> /var/lib/tftpboot/memdisk copying: /usr/share/syslinux/memdisk -> /var/lib/tftpboot/memdisk trying hardlink /var/lib/cobbler/loaders/grub-x86.efi -> /var/lib/tftpboot/grub/grub-x86.efi trying hardlink /var/lib/cobbler/loaders/grub-x86_64.efi -> /var/lib/tftpboot/grub/grub-x86_64.efi copying distros to tftpboot copying images generating PXE configuration files generating PXE menu structure rendering TFTPD files generating /etc/xinetd.d/tftp cleaning link caches running post-sync triggers running python triggers from /var/lib/cobbler/triggers/sync/post/* running python trigger cobbler.modules.sync_post_restart_services running shell triggers from /var/lib/cobbler/triggers/sync/post/* running python triggers from /var/lib/cobbler/triggers/change/* running python trigger cobbler.modules.scm_track running shell triggers from /var/lib/cobbler/triggers/change/* *** TASK COMPLETE *** [root@linux-node1 ~]# cobbler check The following are potential configuration items that you may want to fix: 1 : debmirror package is not installed, it will be required to manage debian deployments and repositories Restart cobblerd and then run 'cobbler sync' to apply changes. 六:DHCP配置 我们可以配置cobbler,使用cobber来管理dhcp服务,修改一下配置文件: 1 2 3 4 [root@linux-node1 ~]# vim /etc/cobbler/settings # set to 1 to enable Cobbler's DHCP management features. # the choice of DHCP management engine is in /etc/cobbler/modules.conf manage_dhcp: 1 #这里从0改成1,启动dhcp管理服务 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [root@linux-node1 cobbler]# ls auth.conf cobbler_bash dhcp.template import_rsync_whitelist ldap mongodb.conf power reporting rsync.template settings users.conf version zone_templates cheetah_macros completions dnsmasq.template iso modules.conf named.template pxe rsync.exclude secondary.template tftpd.template users.digest zone.template [root@linux-node1 cobbler]# vim dhcp.template # ****************************************************************** # Cobbler managed dhcpd.conf file # # generated from cobbler dhcp.conf template ($date) # Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes # in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be # overwritten. # # ****************************************************************** ddns-update-style interim; allow booting; allow bootp; ignore client-updates; set vendorclass = option vendor-class-identifier; option pxe-system-type code 93 = unsigned integer 16; subnet 192.168.56.0 netmask 255.255.255.0 { option routers 192.168.56.2;#路由地址 option domain-name-servers 192.168.56.2;#dns地址 option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.56.100 192.168.56.254; default-lease-time 21600;#默认租期时间 max-lease-time 43200;#最大租期时间 next-server $next_server;#tftp地址 class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; if option pxe-system-type = 00:02 { filename "ia64/elilo.efi"; } else if option pxe-system-type = 00:06 { filename "grub/grub-x86.efi"; } else if option pxe-system-type = 00:07 { filename "grub/grub-x86_64.efi"; } else { filename "pxelinux.0"; } } } 执行cobbler sync 自动生成dhcp配置文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 [root@linux-node1 cobbler]# systemctl restart cobblerd [root@linux-node1 cobbler]# cobbler sync task started: 2017-02-21_105948_sync task started (id=Sync, time=Tue Feb 21 10:59:48 2017) running pre-sync triggers cleaning trees removing: /var/lib/tftpboot/pxelinux.cfg/default removing: /var/lib/tftpboot/grub/images removing: /var/lib/tftpboot/grub/grub-x86.efi removing: /var/lib/tftpboot/grub/grub-x86_64.efi removing: /var/lib/tftpboot/grub/efidefault removing: /var/lib/tftpboot/s390x/profile_list copying bootloaders trying hardlink /var/lib/cobbler/loaders/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0 copying: /var/lib/cobbler/loaders/pxelinux.0 -> /var/lib/tftpboot/pxelinux.0 trying hardlink /var/lib/cobbler/loaders/menu.c32 -> /var/lib/tftpboot/menu.c32 copying: /var/lib/cobbler/loaders/menu.c32 -> /var/lib/tftpboot/menu.c32 trying hardlink /var/lib/cobbler/loaders/yaboot -> /var/lib/tftpboot/yaboot copying: /var/lib/cobbler/loaders/yaboot -> /var/lib/tftpboot/yaboot trying hardlink /usr/share/syslinux/memdisk -> /var/lib/tftpboot/memdisk copying: /usr/share/syslinux/memdisk -> /var/lib/tftpboot/memdisk trying hardlink /var/lib/cobbler/loaders/grub-x86.efi -> /var/lib/tftpboot/grub/grub-x86.efi trying hardlink /var/lib/cobbler/loaders/grub-x86_64.efi -> /var/lib/tftpboot/grub/grub-x86_64.efi copying distros to tftpboot copying images generating PXE configuration files generating PXE menu structure rendering DHCP files generating /etc/dhcp/dhcpd.conf rendering TFTPD files generating /etc/xinetd.d/tftp cleaning link caches running post-sync triggers running python triggers from /var/lib/cobbler/triggers/sync/post/* running python trigger cobbler.modules.sync_post_restart_services running: dhcpd -t -q received on stdout: received on stderr: running: service dhcpd restart #这里会自动重启dhcp服务 received on stdout: received on stderr: Redirecting to /bin/systemctl restart dhcpd.service running shell triggers from /var/lib/cobbler/triggers/sync/post/* running python triggers from /var/lib/cobbler/triggers/change/* running python trigger cobbler.modules.scm_track running shell triggers from /var/lib/cobbler/triggers/change/* *** TASK COMPLETE *** 验证:::: 这里查看dhcpd.conf会自动生成相同的配置文件信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 [root@linux-node1 cobbler]# cat /etc/dhcp/dhcpd.conf # ****************************************************************** # Cobbler managed dhcpd.conf file # generated from cobbler dhcp.conf template (Tue Feb 21 15:59:49 2017) # Do NOT make changes to /etc/dhcpd.conf. Instead, make your changes # in /etc/cobbler/dhcp.template, as /etc/dhcpd.conf will be # overwritten. # ****************************************************************** ddns-update-style interim; allow booting; allow bootp; ignore client-updates; set vendorclass = option vendor-class-identifier; option pxe-system-type code 93 = unsigned integer 16; subnet 192.168.56.0 netmask 255.255.255.0 { option routers 192.168.56.2; option domain-name-servers 192.168.56.2; option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.56.100 192.168.56.254; default-lease-time 21600; max-lease-time 43200; next-server 192.168.56.11; class "pxeclients" { match if substring (option vendor-class-identifier, 0, 9) = "PXEClient"; if option pxe-system-type = 00:02 { filename "ia64/elilo.efi"; } else if option pxe-system-type = 00:06 { filename "grub/grub-x86.efi"; } else if option pxe-system-type = 00:07 { filename "grub/grub-x86_64.efi"; } else { filename "pxelinux.0"; } } } # group for Cobbler DHCP tag: default group { } 七、导入操作系统 我们使用上传工具,上传一个系统到cobbler文件系统下面,这里使用的C7做为测试 7.1上传os到opt目录下面 1 2 3 [root@linux-node1 opt]# ll -sh total 4.1G 4.1G -rw-r--r-- 1 root root 4.1G Feb 21 11:10 CentOS-7-x86_64-DVD-1511.iso 7.2 导入distro,即导入一个发行版,发行版指的是操作系统 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@linux-node1 opt]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 46G 5.6G 41G 13% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 497M 125M 373M 26% /boot tmpfs 378M 0 378M 0% /run/user/0 [root@linux-node1 opt]# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-DVD-1511.iso /mnt mount: /dev/loop0 is write-protected, mounting read-only [root@linux-node1 opt]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 46G 5.6G 41G 13% / devtmpfs 1.9G 0 1.9G 0% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm tmpfs 1.9G 8.6M 1.9G 1% /run tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda1 497M 125M 373M 26% /boot tmpfs 378M 0 378M 0% /run/user/0 /dev/loop0 4.1G 4.1G 0 100% /mnt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 [root@linux-node1 ~]# cobbler import --path=/mnt/ --name=c7.2-x86_64 --arch=x86_64 task started: 2017-02-21_134843_import task started (id=Media import, time=Tue Feb 21 13:48:43 2017) Found a candidate signature: breed=redhat, version=rhel6 Found a candidate signature: breed=redhat, version=rhel7 Found a matching signature: breed=redhat, version=rhel7 Adding distros from path /var/www/cobbler/ks_mirror/c7.2-x86_64: creating new distro: c7.2-x86_64 trying symlink: /var/www/cobbler/ks_mirror/c7.2-x86_64 -> /var/www/cobbler/links/c7.2-x86_64 creating new profile: c7.2-x86_64 associating repos checking for rsync repo(s) checking for rhn repo(s) checking for yum repo(s) starting descent into /var/www/cobbler/ks_mirror/c7.2-x86_64 for c7.2-x86_64 processing repo at : /var/www/cobbler/ks_mirror/c7.2-x86_64 need to process repo/comps: /var/www/cobbler/ks_mirror/c7.2-x86_64 looking for /var/www/cobbler/ks_mirror/c7.2-x86_64/repodata/*comps*.xml error launching createrepo (not installed?), ignoring Exception occured: <type 'exceptions.IOError'> Exception value: [Errno 2] No such file or directory: '/var/www/cobbler/ks_mirror/config/c7.2-x86_64.repo' Exception Info: File "/usr/lib/python2.7/site-packages/cobbler/modules/manage_import_signatures.py", line 599, in yum_process_comps_file config_file = open(fname, "w+") *** TASK COMPLETE *** [root@linux-node1 ~]# ll /var/www/cobbler/ks_mirror/c7.2-x86_64/ total 296 -r--r--r-- 1 root root 14 Dec 9 2015 CentOS_BuildTag dr-xr-xr-x 3 root root 33 Dec 9 2015 EFI -r--r--r-- 1 root root 215 Dec 9 2015 EULA -r--r--r-- 1 root root 18009 Dec 9 2015 GPL dr-xr-xr-x 3 root root 54 Dec 9 2015 images dr-xr-xr-x 2 root root 4096 Dec 9 2015 isolinux dr-xr-xr-x 2 root root 41 Dec 9 2015 LiveOS dr-xr-xr-x 2 root root 204800 Dec 9 2015 Packages dr-xr-xr-x 2 root root 4096 Dec 9 2015 repodata -r--r--r-- 1 root root 1690 Dec 9 2015 RPM-GPG-KEY-CentOS-7 -r--r--r-- 1 root root 1690 Dec 9 2015 RPM-GPG-KEY-CentOS-Testing-7 -r--r--r-- 1 root root 2883 Dec 9 2015 TRANS.TBL 7.3 指定profile,在导入发行版的时候可以通过–kickstart=KICKSTART_FILE指定profile文件,如果没有指定,可以在后期重新指定,需要将profile文件提前准备好,最好放在/var/lib/cobbler/kickstarts,因为这是cobbler默认的ks文件路径,如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 #查看默认使用的ks文件,默认使用的是sample_end.ks [root@linux-node1 kickstarts]# cobbler profile report Name : c7.2-x86_64 TFTP Boot Files : {} Comment : DHCP Tag : default Distribution : c7.2-x86_64 Enable gPXE? : 0 Enable PXE Menu? : 1 Fetchable Files : {} Kernel Options : {} Kernel Options (Post Install) : {} Kickstart : /var/lib/cobbler/kickstarts/sample_end.ks Kickstart Metadata : {} Management Classes : [] Management Parameters : <<inherit>> Name Servers : [] Name Servers Search Path : [] Owners : ['admin'] Parent Profile : Internal proxy : Red Hat Management Key : <<inherit>> Red Hat Management Server : <<inherit>> Repos : [] Server Override : <<inherit>> Template Files : {} Virt Auto Boot : 1 Virt Bridge : xenbr0 Virt CPUs : 1 Virt Disk Driver Type : raw Virt File Size(GB) : 5 Virt Path : Virt RAM (MB) : 512 Virt Type : kvm #上传一个自己写好的ks文件,并写入到profile文件配置里面 [root@linux-node1 kickstarts]# pwd /var/lib/cobbler/kickstarts [root@linux-node1 kickstarts]# ll total 56 -rw-r--r-- 1 root root 1519 Feb 21 13:59 CentOS-7.1-x86_64_cobbler.cfg [root@linux-node1 kickstarts]# cobbler profile edit --name=c7.2-x86_64 --kickstart=/var/lib/cobbler/kickstarts/CentOS-7.1-x86_64_cobbler.cfg [root@linux-node1 kickstarts]# cobbler profile report Name : c7.2-x86_64 TFTP Boot Files : {} Comment : DHCP Tag : default Distribution : c7.2-x86_64 Enable gPXE? : 0 Enable PXE Menu? : 1 Fetchable Files : {} Kernel Options : {} Kernel Options (Post Install) : {} Kickstart : /var/lib/cobbler/kickstarts/CentOS-7.1-x86_64_cobbler.cfg Kickstart Metadata : {} Management Classes : [] Management Parameters : <<inherit>> Name Servers : [] Name Servers Search Path : [] Owners : ['admin'] Parent Profile : Internal proxy : Red Hat Management Key : <<inherit>> Red Hat Management Server : <<inherit>> Repos : [] Server Override : <<inherit>> Template Files : {} Virt Auto Boot : 1 Virt Bridge : xenbr0 Virt CPUs : 1 Virt Disk Driver Type : raw Virt File Size(GB) : 5 Virt Path : Virt RAM (MB) : 512 Virt Type : kvm #修改内核配置 [root@linux-node1 kickstarts]# cobbler profile edit --name=c7.2-x86_64 --kopts='net.ifnames=0 biosdevname=0' [root@linux-node1 kickstarts]# cobbler profile report Name : c7.2-x86_64 TFTP Boot Files : {} Comment : DHCP Tag : default Distribution : c7.2-x86_64 Enable gPXE? : 0 Enable PXE Menu? : 1 Fetchable Files : {} Kernel Options : {'biosdevname': '0', 'net.ifnames': '0'} Kernel Options (Post Install) : {} Kickstart : /var/lib/cobbler/kickstarts/CentOS-7.1-x86_64_cobbler.cfg Kickstart Metadata : {} Management Classes : [] Management Parameters : <<inherit>> Name Servers : [] Name Servers Search Path : [] Owners : ['admin'] Parent Profile : Internal proxy : Red Hat Management Key : <<inherit>> Red Hat Management Server : <<inherit>> Repos : [] Server Override : <<inherit>> Template Files : {} Virt Auto Boot : 1 Virt Bridge : xenbr0 Virt CPUs : 1 Virt Disk Driver Type : raw Virt File Size(GB) : 5 Virt Path : Virt RAM (MB) : 512 Virt Type : kvm #更改登录界面内容 [root@linux-node1 kickstarts]# vim /etc/cobbler/pxe/pxedefault.template DEFAULT menu PROMPT 0 MENU TITLE Cobbler | http://cobbler.github.io/ TIMEOUT 200 TOTALTIMEOUT 6000 ONTIMEOUT $pxe_timeout_profile LABEL local MENU LABEL (local) MENU DEFAULT LOCALBOOT -1 $pxe_menu_items MENU end 到此安装完毕 启动客户端测试 本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/1900302,如需转载请自行联系原作者
*此次是实战使用于WMF3.0以上版本 一、理论原理 使用PowerShell远程管理Windows Server是Windows Management Framework的核心思想:使用Powershell充当远程客户端,使用WinRM作为接收的服务端,来对远程的Windows Server进行远程操作;实验图如下: 二、操作准备 1.WinRM的开启和关闭:http://281816327.blog.51cto.com/907015/1394799 2.WinRM的配置:http://281816327.blog.51cto.com/907015/1394891 三、实战 1.在“iis01-op”上开启Windows Server的WinRM监听; 2.从iis02_op远程到iis01-op; A.在iis02_op的powershell中输入“enter-pssession –computer iis01-op –credential contoso.test\adminstrator”,然后回车,弹出的对话框中输入contoso.test\adminstrator的密码; B.点击''OK”后,可以看到我们已经远程到iis01-op的powershell上; 3.远程操作“Ipconfig”事例; A.在iis01-op上输入ipconfig,可以看到IP为192.168.11.53; B.在iis02_op上远程到iis01-op的powershell会话中输入ipconfig,得到同样的IP地址192.168.11.53; 4.退出远程操作; A.在客户端退出;在iis02_op远程的powershell中输入“enter-pssesion”,即退出远程会话; B.在服务端退出;在iis01-op的powershell中输入“get-process –name *wsmpro* |stop-process”将关闭所有进入到iis01-op上的远程会话; 本文转自 bannerpei 51CTO博客,原文链接:http://blog.51cto.com/281816327/1397239,如需转载请自行联系原作者
内核的功用主要有进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能这几个方面,本文主要讨论linux进程及作业管理。 进程管理: 进程,process,运行中程序的一个副本,且存在生命周期; 进程分为CPU bound和I/Obound。 CPU bound:CPU密集型(类似于高清视频) I/O bound:IO密集型(编辑器等频繁IO操作) Linux内核存储进程信息的固定格式为:task struct(结构体) 多个任务的task struct组件的链表:task list 进程创建: 在centos6上,init为初始化进程,父进程。 请求发出者(进程)都由父进程创建,然后为系统调用; 进程:fork() clone() IPC: Inter Process Communication 同一主机上: signal shm: shared memory semerphor 不同主机上: rpc: remote procecure call socket: 进程调度:保存现场,恢复现场 进程运行程序,是程序的一部分 多任务:多进程同时运行 抢占式多任务 进程优先级: 0-139: 1-99:实时优先级,数字越大,优先级越高; 100-139:静态优先级,数字越小,优先级越高; Nice值:-20,19 -20相当于100,19相当于139; 每个进程运行时间不同,linux支持抢占式多任务,当一个低优先级的程序在运行,这时有一个高优先级的运行,过段时间后这个高优先级的提前运行。 算法复杂度:Big 0 (衡量标准算法) o(1):恒定的,无论优先级,消耗时间相同(最佳的) o(logn):每次调度,调度程序需要从树中找出优先级最高的进程 o(n):线性的 o(n^2):抛物线机制 o(2^n):随队列深度增长 进程状态: 运行态:running 就绪态:ready 睡眠态: 可中断:interruptable 不可中断:uninterruptable 停止态:暂停于内存中,但不会被调度,除非手动启动之:stopped 僵死态:zombie Linux系统上的进程查看及管理工具: 在linux系统中主要的进程管理工具有:pstree,ps,pidof,pgrep,top,htop,glances,pmap,vmstat,dstat,kill,job,bg,fg,nohup,nice,renice,killall,… 1. pstree命令: pstree - display a tree of processes 在centos6中父进程为init,而在centos7中,父进程为systemd pstree –p:显示各进程的PID 其它用法选项可参照man手册。 2. ps命令:process state ps命令显示的是ps命令执行时系统上进程信息的快照,是静态的结果。 Linux运行中的内核的相关信息是通过/proc伪文件系统输出的;各进程都有一个其PID命名的子目录,每个子目录中许多文件存储了进程的相关信息。 进程文件:/proc/# #:PID ps - report a snapshot of the current processes. ps [options] 选项有三种风格: 1 UNIX options, which maybe grouped and must be preceded by a dash. 2 BSD options, which maybe grouped and must not be used with a dash. 3 GNU long options, which arepreceded by two dashes. 启动进程的方式: 系统启动过程中自动启动:与终端无关的进程; 通过用户终端启动:与终端相关的进程; 常用组合之一:aux a:所有与终端相关的进程; x:所有与终端无关的进程; u:以用户为中心组织进程状态信息显示; VSZ:虚拟内存集; RSS:Resident Size,常驻内存集; STAT: R:running; S:interruptable sleeping D:uninterruptable sleeping T:stopped Z:zombie +:前台进程; 1:多线程进程; N:低优先级进程; <:高优先级进程; s:session leader; 常用组合之二:-ef -e:显示所有进程; -f:显示完整格式的进程信息; 常用组合之三:-eFH -F:显示额外信息 C:cpu utilization cpu利用率 PSR:运行在哪一颗cpu之上 -H:以层级结构显示进程的相关信息; 常用组合之四:-eo,axo o field2,field2,…:自定义要显示的字段列表,以逗号分隔; 常用的field:pid,ni,pri,psr,pcpu,stat,comm,tty,ppid,rtprio ni:nice值; priority:优先级; rtprio:realtime priority,实时优先级; 3. pgrep,pkill命令: pgrep, pkill - look up or signalprocesses based on name and other attributes pgrep [options] pattern -uuid:effectiveuser; -Uuid:readuser; -tTERMINAL:与指定的终端相关的进程; -l:显示进程名; -Ppid:显示此进程的子进程; pkill的用法与pgrep完全一样。 4. pidof命令:根据进程名,取其id pidof -- find the process ID of a running program. pidof [ program ] 5. top命令: top - display Linux tasks 排序: P:以占据cpu百分比排序; M:已占据内存百分比排序; T:累计占用CPU时间排序; 首部信息:按以下命令可以显示或隐藏指定的信息; uptime信息:l命令 tasks及cpu信息:t命令 内存信息:m命令 退出命令:q 修改刷新时间间隔:s 终止指定的进程:k 选项: -d #:指定刷新时间间隔,默认为3秒; #top –d 1:指定刷新时间为1秒刷新一次; -b:以批次方式显示; -n #:显示多少批次; #top –b –n 2:以批次显示显示两批,自动退出; 6. uptime命令:显示系统时间、运行时长及平均负载; 过去一分钟、五分钟和十五分钟的平均负载; 等待运行的进程队列的长度; uptime - Tell how long the system has been running. #uptime 7. htop命令: centos6上没有htop的安装包,我们需要手动配置epel的yum源安装htop; htop - interactive process viewer:交互式进程查看器 选项: -d #:指定延迟时间间隔; -u USERNAME:仅显示指定用户的进程; #htop –u rpc -s COLUME:以指定字段进行排序; 子命令: l:显示选定的进程打开的文件列表; s:跟踪选定的进程的系统调用; t:以层级关系显示各种进程状态; a:将选定的进程绑定至某指定的CPU核心; 8. vmstat命令: vmstat - Report virtual memory statistics 显示虚拟内存状态 vmstat [options] [delay [count]] proc: r:等待运行的进程运行的任务队列的长度; b;处于不可中断睡眠态的进程个数;被阻塞的任务队列的长度; memory: swpd:交换内存使用总量; free:空闲的物理内存总量; buffer:用于buffer的内存的总量; cache:用于cache的内存总量; swap: si:数据进入swap中的数据速率(kb/s) so:数据离开swap的速率(kb/s) io: bi:从块设备读入数据到系统的速度(kb/s) bo:保存数据至块设备的速率(kb/s) system: in:interrupts,中断速率; cs:context switch,上下文切换的速率; cpu: us:user space; sy:system; id:idle; wa:wait; st:stolen; 选项: -s:显示内存统计数据; #vmstat 2 6 每两秒显示一次,显示六次退出; 9. pmap命令: pmap - report memory map of a process显示一个进程的内存映射 pmap [options] pid [...] -x:显示详细信息的格式; 另一种查看方式:cat /proc/PID/maps 10.glances命令: glances - A cross-platform curses-based monitoring tool 一个跨平台的多视窗根基的监控工具 glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-trefresh] [-f file] [-o output] #glances 按“h”帮助选项: 常用选项: -b:以byte为单位显示网上数据速率; -d:关闭磁盘I/O模块; -m:关闭mount模块; -t #:刷新时间间隔; -1:每个CPU的相关数据单独显示; -o {HTML|CSV}:输出格式; -f /PATH/TO/SOMEWHERE:设定输出文件的位置; C/S模式下运行glances命令: 服务模式: glances –s -BIPADDR IPADDR:本机的某地址,用于监听; 客户端模式: glances –c IPADDR IPADDR:是远程某服务器的地址; 11.dstat命令: - versatile tool for generating system resource statistics 显示系统资源状态的通用工具 dstat [-afv] [options..] [delay [count]] 常用选项: -c, --cpu:显示cpu相关信息; -C #,#,…,total -d,--disk:显示磁盘的相关信息; -D sda,sdb,…,total -g:显示page相关的速率数据; -m:memory的相关统计数据; -n:interface的相关统计数据; -p:显示process的相关统计数据; -r:显示io请求的相关统计数据; -s:显示swapped的相关统计数据; -y:显示系统相关数据,包括中断和进程切换; --tcp:显示tcp的相关数据 --udp:显示udp的相关数据 --raw:显示raw的相关数据 --socket:显示套接字的相关数据 --ipc:显示进程通信相关的速率数据 --top-cpu:显示最占用cpu的进程; --top-io:最占用io的进程; --top-mem:最占用内存的进程; --top-lantency:延迟最大的进程; 用于向进程发送信号,以实现对进程的管理; 显示当期系统可用信号: 12.kill 命令: kill- terminate a process 用于向进程发送信号,以实现对进程的管理; 显示当期系统可用信号: kill –l [signal] 每个信号的标识有三种: 1) 信号的数字标识; 2) 信号的完整名称; 3) 信号的简写名称; 向进程发送信号: kill [-s signal|-SIGNAL] pid... 常用信号: 1) SIGHUP:无须关闭进程而让其重读配置文件; 2) SIGINT:终止正在运行的进程,相当于ctrl+c; 9) SIGKILL:杀死运行中的进程; 15) SIGTERM:中止正在运行中的进程; 18) SIGCONT:继续运行指定进程; 19) SIGSTOP:暂停进程; 示例:启用httpd服务,对此进程进行管理; 1. 启用httpd服务,检查80端口是否处于监听状态。 2. 查看httpd进程; 3. 杀死运行中的pid为3099的进程,并查看结果; #kill -9 3099 4. 默认信号为15,用下面的方法可以中止信号; 或者 13.kllall命令: killall - kill processes by name killall [-SIGNAL] program 示例:禁用httpd服务; Linux系统作业控制: job: 前台作业(foregroud):通过终端启动后,且启动后会一直占据终端; 后台作业(backgroud):可以通过终端启动,但启动后即转入后台运行(释放终端) 如何让作业运行于后台? 1)运行中的作业 Ctrl+z 注意:送往后台后,作业会转为停止态; 2)尚未启动的作业 #COMMAND & 注意:此类作业虽然被送往后台,但其依然与终端相关;如果希望把送网后台的作业剥离与终端的关系; #nohup COMMAND & 查看所有作业: #jobs 可实现作业控制的常用命令: # fg [[%]JOB_NUM]:把指定的作业调回前台; # bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;但是此作业必须支持后台运行; # kill %JOB_NUM:终止指定的作业,kill作业号的%不可以省略; 调整进程的优先级: 可通过nice值调整的优先级范围:100-139; 分别对应于:-20,19 进程启动时,其nice值默认为0,其优先级是120; nice命令: 以指定的nice值启动并运行命令 # nice [OPTION] [COMMAND [ARGU]...] 选项: -n NICE 注意:仅管理员可调低nice值; renice命令: # renice [-n] NICE PID... 查看Nice值和优先级: ps axo pid, ni, priority, comm 本文转自 claude_liu 51CTO博客,原文链接:http://blog.51cto.com/claude666/1961098,如需转载请自行联系原作者
还是替换大小写字母的问题,这是我整理博客的时候遇到的一点小问题 sed -i 用来改变文本内容 root@localhost ding]# echo ding xue | sed -r 's/([^ ]+)/\u&/g' Ding Xue [root@localhost ding]# 这是替换一个字符串,如果我们要替换一个文本中的内容怎么办呢? 例如 [root@localhost ding]# cat 111 ding xue dingxue ding da xue [root@localhost ding]# 如果我们把这个文本中的首字母变成大写,怎么办呢,是这样吗?例如: [root@localhost kkk]# sed -ir 's/([^ ]+)/\u&/g' 111 [root@localhost kkk]# cat 111 ding xue dingxue ding da xue [root@localhost kkk]# ls 111 111r [root@localhost kkk]# 看结果,并没有改过来,我们ls 一下,发现多了个111r,这是怎么回事呢? 其实这是sed 的一个小bug ,当我们想改变一个文本的时候sed -i如果和rn写在一起就会出错,我们看下111r的内容。也没有改变过来,如果写在一起,sed 就默认把i后面的内容当作备份的后缀。 root@localhost kkk]# cat 111r ding xue dingxue ding da xue [root@localhost kkk]# 如果想真正改变文件内容,我们可以这么做。这样就改过来了。 [root@localhost kkk]# sed -r 's/([^ ]+)/\u&/g' -i 111 [root@localhost kkk]# cat 111 Ding Xue Dingxue Ding Da Xue [root@localhost kkk]# 本文转自 大雪儿 51CTO博客,原文链接:http://blog.51cto.com/dingxue/1970090,如需转载请自行联系原作者
Faker是一个可以让你生成伪造数据的Python包。当你需要初始化数据库,创建美观的XML文档,不断产生数据来进行压力测试或者想从生产服务器上拉取匿名数据的时候,Faker将是你最棒的选择。 安装: pip install fake-factory 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from faker import Factory fake = Factory.create() # OR from faker import Faker fake = Faker() fake.name() # 'Lucy Cechtelar' fake.address() # "426 Jordy Lodge # Cartwrightshire, SC 88120-6700" fake.text() # Sint velit eveniet. Rerum atque repellat voluptatem quia rerum. Numquam excepturi # beatae sint laudantium consequatur. Magni occaecati itaque sint et sit tempore. Nesciunt # amet quidem. Iusto deleniti cum autem ad quia aperiam. # A consectetur quos aliquam. In iste aliquid et aut similique suscipit. Consequatur qui # quaerat iste minus hic expedita. Consequuntur error magni et laboriosam. Aut aspernatur # voluptatem sit aliquam. Dolores voluptatum est. # Aut molestias et maxime. Fugit autem facilis quos vero. Eius quibusdam possimus est. # Ea quaerat et quisquam. Deleniti sunt quam. Adipisci consequatur id in occaecati. # Et sint et. Ut ducimus quod nemo ab voluptatum. 另一种使用方法: python -m faker [option] [*args] 本文转自 奚落123 51CTO博客,原文链接:http://blog.51cto.com/guyuyuan/1944986,如需转载请自行联系原作者
分享一些Excel的干货,拿走不谢! 1. 快速选中全部工作表 右键单击工作窗口下面的工作表标签,在弹出的菜单中选择“选定全部工作表”命令即可()。 2. 快速启动Excel 如果想在启动系统自动运行Excel,可以这样操作: 1.双击“我的电脑”图标,进入Windows目录,依次打开“Start Menu\Programs\启动”文件夹; 2.打开Excel所在的文件夹,用鼠标将Excel图标拖到“启动”文件夹,这时Excel的快捷方式就被复制到“启动”文件夹中,下次启动Windows就可快速启动Excel了。 如果Windows系统已启动,你可用以下方法快速启动Excel: 方法一:单击“开始→文档”命令里的任一Excel工作簿即可。 方法二:用鼠标从“我的电脑”中将Excel应用程序拖到桌面上,然后从快捷菜单中选择“在当前位置创建快捷方式”,以后启动时只需双击快捷方式即可。 3. 快速删除选定区域数据 如果用鼠标右键向上或向左(反向)拖动选定单元格区域的填充柄时,没有将其拖出选定区域即释放了鼠标右键,则将删除选定区域中的部分或全部数据(即拖动过程中变成灰色模糊的单元格区域,在释放了鼠标右键后其内容将被删除)。 4. 给单元格重新命名 Excel给每个单元格都有一个默认的名字,其命名规则是列标加横标,例如D3表示第四列、第三行的单元格。如果要将某单元格重新命名,可以采用下面两种方法: 1.只要用鼠标单击某单元格,在表的左上角就会看到它当前的名字,再用鼠标选中名字,就可以输入一个新的名字了。 2.选中要命名的单元格,单击“插入→名称→定义”命令,显示“定义名称”对话框,在“在当前工作簿中的名称”框里输入名字,单击“确定”按钮即可()。 注意:在给单元格命名时需注意名称的第一个字符必须是字母或汉字,它最多可包含255个字符,可以包含大、小写字符,但是名称中不能有空格且不能与单元格引用相同。 5. 在Excel中选择整个单元格范围 在Excel中,如果想要快速选择正在处理的整个单元格范围,按下“Ctrl+Shift+ *”。 注意:该命令将选择整个列和列标题,而不是该列表周围的空白单元格——你将得到所需的单元格。这一技巧不同于全选命令,全选命令将选择工作表中的全部单元格,包括那些你不打算使用的单元格。 6. 快速移动/复制单元格 先选定单元格,然后移动鼠标指针到单元格边框上,按下鼠标左键并拖动到新位置,然后释放按键即可移动。若要复制单元格,则在释放鼠标之前按下Ctrl即可。 7. 快速修改单元格式次序 在拖放选定的一个或多个单元格至新位置的同时,按住Shift键可以快速修改单元格内容的次序。方法为:选定单元格,按下Shift键,移动鼠标指针至单元格边缘,直至出现拖放指针箭头,然后进行拖放操作。上下拖拉时鼠标在单元格间边界处会变成一个水平“工”状标志,左右拖拉时会变成垂直“工”状标志,释放鼠标按钮完成操作后,单元格间的次序即发生了变化。 8. 彻底清除单元格内容 先选定单元格,然后按Delete键,这时仅删除了单元格内容,它的格式和批注还保留着。要彻底清除单元格,可用以下方法:选定想要清除的单元格或单元格范围,单击“编辑→清除”命令,这时显示“清除”菜单(),选择“全部”命令即可,当然你也可以选择删除“格式”、“内容”或“批注”中的任一个。 9. 选择单元格 选择一个单元格,将鼠标指向它单击鼠标左键即可; 选择一个单元格区域,可选中左上角的单元格,然后按住鼠标左键向右拖曳,直到需要的位置松开鼠标左键即可; 若要选择两个或多个不相邻的单元格区域,在选择一个单元格区域后,可按住Ctrl键,然后再选另一个区域即可; 若要选择整行或整列,只需单击行号或列标,这时该行或该列第一个单元格将成为活动的单元格;若单击左上角行号与列标交叉处的按钮,即可选定整个工作表。 10. 为工作表命名 为了便于记忆和查找,可以将Excel的sheet1、sheet2、sheet3工作命名为容易记忆的名字,有两种方法:1.选择要改名的工作表,单击“格式→工作表→重命名”命令,这时工作表的标签上名字将被反白显示,然后在标签上输入新的表名即可。 2.双击当前工作表下部的名称,如“Sheet1”,再输入新的名称。 11. 一次性打开多个工作簿 利用下面的方法可以快速打开多个工作簿: 方法一 打开工作簿(*.xls)所在的文件夹,按住Shift键或Ctrl键,并用鼠标选择彼此相邻或不相邻的多个工作簿,将它们全部选中,然后按右键单击,选择“打开”命令,系统则启动Excel2002,并将上述选中的工作簿全部打开。 方法二 将需要一次打开的多个工作簿文件复制到C:\Windows\ApplicationData\Microsoft\Excel\XLSTART文件夹中,以后启动Excel 2002时,上述工作簿也同时被全部打开。方法三 启动Excel 2002,单击“工具→选项”命令,打开“选项”对话框,点击“常规”标签,在“启动时打开此项中的所有文件”后面的方框中输入一个文件夹的完整路径(如d:\Excel),单击“确定”退出。然后将需要同时打开的工作簿复制到上述文件夹中,以后当启动Excel 2002时,上述文件夹中的所有文件(包括非Excel格式的文档)被全部打开。方法四 在Excel 2002中,单击“文件→打开”命令,按住Shift键或Ctrl键,在弹出的对话框文件列表中选择彼此相邻或不相邻的多个工作簿,然后按“打开”按钮,就可以一次打开多个工作簿。 方法五 用上述方法,将需要同时打开的多个工作簿全部打开,再单击“文件→保存工作区”命令,打开“保存工作区”对话框,取名保存。以后只要用Excel 2002打开该工作区文件,则包含在该工作区中的所有工作簿即被同时打开。 12. 快速切换工作簿 对于少量的工作簿切换,单击工作簿所在窗口即可。要对多个窗口下的多个工作簿进行切换,可以使用“窗口”菜单。“窗口”菜单的底部列出了已打开工作簿的名字,要直接切换到一个工作簿,可以从“窗口”菜单选择它的名字。“窗口”菜单最多能列出9个工作簿,若多于9个,“窗口”菜单则包含一个名为“其他窗口”的命令,选用该命令,则出现一个按字母顺序列出所有已打开的工作簿名字的对话框,只需单击其中需要的名字即可。 13. 选定超级链接文本(微软Office技巧大赛获奖作品) 如果需要在Excel中选定超级链接文本而不跳转到目标处,可在指向该单元格时,单击并按住可选定单元格。 14. 快速查找 在执行查找操作之前,可以将查找区域确定在某个单元格区域、整个工作表(可选定此工作表内的任意一个单元格)或者工作簿里的多个工作表范围内。在输入查找内容时,可以使用问号(?)和星号(*)作为通配符,以方便查找操作。问号(?)代表一个字符,星号(*)代表一个或多个字符。需要注意的问题是,既然问号(?)和星号(*)作为通配符使用,那么如何查找问号(?)和星号(*)呢?只要在这两个字符前加上波浪号(~)就可以了。 15. 修改默认文件保存路径 启动Excel 2002,单击“工具→选项”命令,打开“选项”对话框,在“常规”标签中,将“默认文件位置”方框中的内容修改为你需要定位的文件夹完整路径()。以后新建Excel工作簿,进行“保存”操作时,系统打开“另存为”对话框后直接定位到你指定的文件夹中。 16. 指定打开的文件夹 我们可以指定打开文件的文件夹,方法如下: 单击“开始→运行”,输入regedit命令,打开“注册表编辑器”,展开HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Common\Open Find\Places\UserDefinedPlaces,在下面新建主键,名称为“mydoc”,然后在该主键中新建两个“字符串值”,名称分别是“Name”和“Path”,值分别为“我的文件”(可以随意命名)和“d:\mypath”(定位文件夹的完整路径),关闭“注册表编辑器”,重启电脑。以后在Excel2002中进行“打开”操作时,打开对话框左侧新添了“我的文件”这一项目,点击该项目,即可进入“d:\mypath”文件夹。 17. 在多个Excel工作簿间快速切换 按下“Ctrl+Tab”可在打开的工作簿间切换。 18. 快速获取帮助 对于工具栏或屏幕区,按组合键“Shift+F1”,鼠标变成带问号的箭头,用鼠标单击工具栏按钮或屏幕区,它就弹出一个帮助窗口会显示该元素的详细帮助信息。 19. 创建帮助文件的快捷方式 Excel帮助文件是编译的HTML帮助文件Xlmain10.chm,存放在安装目录\Office10\2052目录中,单击并拖拉此文件到Windows快速启动工具栏上。此后,不管Excel是否在运行,而且也不用调用Office助手,单击Windows快速启动工具栏上的这个图标将引出Excel帮助。 20. 双击单元格某边移动选定单元格 在工作表内移动选定单元格有一种快捷方法:将鼠标指针放置于选定单元格的一边,注意要选择与移动方向相关的一边,即要向下移动,就将鼠标指针放置于单元格的底部;如果要向右移动,就将鼠标指针放置于单元格的右边;依此类推。这时鼠标指针变为白色箭头的形状,双击选择单元格的某边,鼠标指针将沿选定的方向移动到特定的单元格中。如果此方向相邻单元格为空白单元格,则将移动到连续最远的空白单元格中;如果此方向相邻单元格为非空白单元格,则将移动到连续最远的非空白单元格中。 本文转自 寂岚峰 51CTO博客,原文链接:http://blog.51cto.com/13271983/1977072,如需转载请自行联系原作者
我初步分析了一下,我遇到问题的可能原因: 先说一下我的实验环境: 域控制器一台,运行的是windows server 2012 R2 邮件服务器一台,运行的是windows server 2012 Exchange server版本是SP1 后来才知道,SP1是不能安装在windows server 2012上的,要SP3的才可以。http://www.exchangecn.com/html/exchange2010/20120926_386.html 然后又将邮件服务器的系统改成了windows server 2008 R2 下面我就说说安装吧:安装的先决条件我上面遇到的问题当中有解答,我这边就简单的说一下就行了: .NET Framework 3.5的安装 IIS的安装 还有几个KB包,KB包微软官网上可以下到的。下面会具体说那几个的。 我就从头开始演示一遍,包括哪些先决条件我都先不安装,直接先运行setup安装,讲解如果哪些没有安装,会报什么错误。 先说一下,我不是光盘安装的,我Exchange的安装文件时放在D盘的,你如果是使用光盘安装只要改下路径就好了。 下面开始安装,是在一台干净的系统上安装。系统没有做任何设置。 1、安装之前有几个准备的命令,这个命令在exchange安装目录下,所以我们先要切换目录到exchange的安装目录下。用CD命令,我想这个大家都应该知道吧。 2、首先我们要运行的是setup /ps命令,但我们看到了,运行的时候报错了,需要安装 .NET Framework 3.5。 3、那么我们就需要安装.NET Framework 3.5,安装步骤我就不演示了,很简单的,直接在添加功能里面添加就可以了,就是时间有点长。这里要注意的就是下图,选择“添加所需的角色服务”。 4、这下就可以运行setup /ps 命令了。 5、不好又报错,下面我们看看是报的什么错,“Active Directory 不存在或无法联系。” 在看看下面的“此计算机不属于windows 域;用户未登录到windows 域。”我想大家应该知道是什么原因了吧。对,就是我计算机未加入到域,我上面已经说过了,在一个干净的系统上安装的,并且系统没有任何设置。解决方法将该机器加入域,加入域的过程就不演示了,我想大家都应该会。 6、加入域就可以运行setup /ps了吗?下面我们看看,又报错了,报什么错呢?“未安装“Ldifde.exe。”那怎么解决呢?继续看下去,下面有解决方法。 7、解决方法就是打开windows powershell,运行“Import—ModuleServerManager”,然后再运行“Add—WindowsFeatureRSAT—ADDS”来安装。 8、在安装完成的时候,后面有提示你重启,那么如果我们不重启会怎么样呢?对就会出现下图那样的错误。那我们只有重启了。 9、当我们重启完成后,就可以运行setup /ps 10、下面我们运行第二个setup命令,setup /p /organizationname:ne(组织名称),ne是我安装的组织名称,这个大家根据实际情况填就可以了。 11、一般情况下这一步也不会报错的,但我不错了,因为我的实验环境安装过N遍exchange了。有人会问,系统不是干净的吗?为什么还会有这样的错误?因为这个这个组织名称不是存在你系统上的,而是存在你域架构上的,即使是重装了系统还是会有的,除非你连域控制器也一起重装。 解决方法大家可以看看这个帖子:http://bisheng.blog.51cto.com/409831/227023 12、下面运行第三个setup命令。Setup /pad 13、下面运行第四个setup命令,setup /pd. 本文转自 as900 51CTO博客,原文链接:http://blog.51cto.com/yupeizhi/1348578,如需转载请自行联系原作者
综述 首先来看一下他们的区别 urllib和urllib2 urllib 和urllib2都是接受URL请求的相关模块,但是urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。 这意味着,你不可以伪装你的User Agent字符串等。 urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。 目前的大部分http请求都是通过urllib2来访问的 httplib httplib实现了HTTP和HTTPS的客户端协议,一般不直接使用,在python更高层的封装模块中(urllib,urllib2)使用了它的http实现。 urllib简单用法 urllib.urlopen(url[, data[, proxies]]) : 详细使用方法见 urllib学习 urllib2简单用法 最简单的形式 import urllib2 response=urllib2.urlopen('http://www.douban.com') html=response.read() 实际步骤: 1、urllib2.Request()的功能是构造一个请求信息,返回的req就是一个构造好的请求 2、urllib2.urlopen()的功能是发送刚刚构造好的请求req,并返回一个文件类的对象response,包括了所有的返回信息。 3、通过response.read()可以读取到response里面的html,通过response.info()可以读到一些额外的信息。 如下: #!/usr/bin/env python import urllib2 req = urllib2.Request("http://www.douban.com") response = urllib2.urlopen(req) html = response.read() print html 有时你会碰到,程序也对,但是服务器拒绝你的访问。这是为什么呢?问题出在请求中的头信息(header)。 有的服务端有洁癖,不喜欢程序来触摸它。这个时候你需要将你的程序伪装成浏览器来发出请求。请求的方式就包含在header中。常见的情形: 1 2 3 4 5 6 7 8 9 import urllib import urllib2 url = 'http://www.someserver.com/cgi-bin/register.cgi' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'# 将user_agent写入头信息 values = {'name' : 'who','password':'123456'} headers = { 'User-Agent' : user_agent } data = urllib.urlencode(values) req = urllib2.Request(url, data, headers) response = urllib2.urlopen(req) the_page = response.read( values是post数据 GET方法 例如百度: 百度是通过http://www.baidu.com/s?wd=XXX 来进行查询的,这样我们需要将{‘wd’:’xxx’}这个字典进行urlencode 1 2 3 4 5 6 7 8 9 #coding:utf-8 import urllib import urllib2 url = 'http://www.baidu.com/s' values = {'wd':'D_in'} data = urllib.urlencode(values) print data url2 = url+'?'+data response = urllib2.urlopen(url2) the_page = response.read() print the_page POST方法 1 2 3 4 5 6 7 8 9 10 import urllib import urllib2 url = 'http://www.someserver.com/cgi-bin/register.cgi' user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' //将user_agent写入头信息 values = {'name' : 'who','password':'123456'} //post数据 headers = { 'User-Agent' : user_agent } data = urllib.urlencode(values) //对post数据进行url编码 req = urllib2.Request(url, data, headers) response = urllib2.urlopen(req) the_page = response.read() urllib2带cookie的使用 1 2 3 4 5 6 7 8 9 10 11 #coding:utf-8 import urllib2,urllib import cookielib url = r'http://www.renren.com/ajaxLogin' #创建一个cj的cookie的容器 cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #将要POST出去的数据进行编码 data = urllib.urlencode({"email":email,"password":pass}) r = opener.open(url,data) print cj httplib简单用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #!/usr/bin/env python # -*- coding: utf-8 -*- import httplib import urllib def sendhttp(): data = urllib.urlencode({'@number': 12524, '@type': 'issue', '@action': 'show'}) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"} conn = httplib.HTTPConnection('bugs.python.org') conn.request('POST', '/', data, headers) httpres = conn.getresponse() print httpres.status print httpres.reason print httpres.read() if __name__ == '__main__': sendhttp() 具体用法见 httplib模块 python 3.x中urllib库和urilib2库合并成了urllib库。其中、 首先你导入模块由 import urllib import urllib2 变成了 import urllib.request 然后是urllib2中的方法使用变成了如下 urllib2.URLError 变成了urllib.error.URLError 而当你想使用urllib 带数据的post请求时, 而在python3中就变成了 本文转自 奚落123 51CTO博客,原文链接:http://blog.51cto.com/guyuyuan/1942504,如需转载请自行联系原作者
chrome driver 模拟浏览器对网站进行请求。 安装 chromedriver下载地址:https://sites.google.com/a/chromium.org/chromedriver/downloads 注:chrome版本 解压得到chromedriver.exe文件 将解压后的exe文件放到chrome的安装目录下...\Google\Chrome\Application\ (我的Chrome安装目录: C:\Program Files (x86)\Google\Chrome\Application )根据自己的chrome浏览器的路径 配置环境变量: 设置path环境变量,把chrome的安装目录添加至环境变量(chromedriver.exe不要加入路径) 测试: #coding:utf-8 from selenium import webdriver import time def main(): b=webdriver.Chrome() b.get('http://www.baidu.com') time.sleep(5) b.quit() if __name__ == '__main__': main() 问题: 出现selenium.common.exceptions.WebDriverException: Message: 'ChromeDriver executable needs to be available in the path. 提示chrome driver没有放置在正确的路径下,于是下载chrome dirver,然后放置到chrome所在的目录下,再次运行就OK了! 用下面这种方式检验是路径错误还是安装错误: import os from selenium import webdriver chromedriver = "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" driver = webdriver.Firefox() driver.get('http://stackoverflow.com') driver.quit() 执行没有问题,说明环境变量配置错误,那就重新返回上面配置吧 本文转自 奚落123 51CTO博客,原文链接:http://blog.51cto.com/guyuyuan/1944403,如需转载请自行联系原作者
1 2 3 4 5 6 通过google下载安装包 huwei@huwei:~/Downloads$ ll -a total 47028 drwxr-xr-x 2 huwei huwei 4096 Jul 28 00:16 ./ drwxr-xr-x 18 huwei huwei 4096 Jul 28 00:12 ../ -rw-rw-r-- 1 huwei huwei 48147924 Jul 28 00:16 google-chrome-stable_current_amd 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 使用sudo dpkg -i 安装包名字 安装chrome,但是u缺少相关库文件,系统会报错 huwei@huwei:~/Downloads$ sudo dpkg -i google-chrome-stable_current_amd64.deb (Reading database ... 198622 files and directories currently installed.) Preparing to unpack google-chrome-stable_current_amd64.deb ... Unpacking google-chrome-stable (44.0.2403.107-1) over (44.0.2403.107-1) ... dpkg: dependency problems prevent configuration of google-chrome-stable: google-chrome-stable depends on libappindicator1; however: Package libappindicator1 is not installed. dpkg: error processing package google-chrome-stable (--install): dependency problems - leaving unconfigured Processing triggers for man-db (2.6.7.1-1ubuntu1) ... Processing triggers for gnome-menus (3.10.1-0ubuntu2) ... Processing triggers for desktop-file-utils (0.22-1ubuntu1) ... Processing triggers for bamfdaemon (0.5.1+14.04.20140409-0ubuntu1) ... Rebuilding /usr/share/applications/bamf-2.index... Processing triggers for mime-support (3.54ubuntu1.1) ... Errors were encountered while processing: google-chrome-stable 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 尝试安装缺少的文件,通过报错“Package libappindicator1 is not installed”,我们尝试安装libappindicator1文件 huwei@huwei:~/Downloads$ sudo apt-get install libappindicator1 Reading package lists... Done Building dependency tree Reading state information... Done You might want to run 'apt-get -f install' to correct these: The following packages have unmet dependencies: libappindicator1 : Depends: libindicator7 (>= 0.4.90) but it is not going to be installed E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution). 通过提示,我们安装libappindicator1 libindicator7两个文件 huwei@huwei:~/Downloads$ sudo apt-get -f install libappindicator1 libindicator7 Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: account-plugin-windows-live libupstart1 Use 'apt-get autoremove' to remove them. The following NEW packages will be installed: libappindicator1 libindicator7 0 upgraded, 2 newly installed, 0 to remove and 12 not upgraded. 1 not fully installed or removed. Need to get 39.9 kB of archives. After this operation, 201 kB of additional disk space will be used. Get:1 http://cn.archive.ubuntu.com/ubuntu/ trusty-updates/main libindicator7 amd64 12.10.2+14.04.20141007.1-0ubuntu1 [21.7 kB] Get:2 http://cn.archive.ubuntu.com/ubuntu/ trusty-updates/main libappindicator1 amd64 12.10.1+13.10.20130920-0ubuntu4.1 [18.2 kB] Fetched 39.9 kB in 0s (127 kB/s) Selecting previously unselected package libindicator7. (Reading database ... 198622 files and directories currently installed.) Preparing to unpack .../libindicator7_12.10.2+14.04.20141007.1-0ubuntu1_amd64.deb ... Unpacking libindicator7 (12.10.2+14.04.20141007.1-0ubuntu1) ... Selecting previously unselected package libappindicator1. Preparing to unpack .../libappindicator1_12.10.1+13.10.20130920-0ubuntu4.1_amd64.deb ... Unpacking libappindicator1 (12.10.1+13.10.20130920-0ubuntu4.1) ... Setting up libindicator7 (12.10.2+14.04.20141007.1-0ubuntu1) ... Setting up libappindicator1 (12.10.1+13.10.20130920-0ubuntu4.1) ... Setting up google-chrome-stable (44.0.2403.107-1) ... update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/x-www-browser (x-www-browser) in auto mode update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/gnome-www-browser (gnome-www-browser) in auto mode update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/google-chrome (google-chrome) in auto mode Processing triggers for libc-bin (2.19-0ubuntu6.6) ... 到此,chrome安装成功!!! 本文转自 yawei555 51CTO博客,原文链接:http://blog.51cto.com/huwei555/1678955,如需转载请自行联系原作者
从Linux终端管理进程:10个你必须知道的命令 Linux终端有一系列有用的命令。它们可以显示正在运行的进程、杀死进程和改变进程的优先级。本文列举了一些经典传统的命令和一些有用新颖的命令。本文提到的命令会实现某个单一功能。其它命令,例如htop,会在命令的上层提供一个友好的界面供用户使用。 Linux终端有一系列有用的命令。它们可以显示正在运行的进程、杀死进程和改变进程的优先级。本文列举了一些经典传统的命令和一些有用新颖的命令。本文提到的命令会实现某个单一功能。它们可以结合起来——这也是Unix设计程序的理念。其它命令,例如htop,会在命令的上层提供一个友好的界面供用户使用。 top top命令是一个常用的查看系统资源使用情况和查看占用系统资源最多的进程的命令。top以列形式显示所有的进程,占最多CPU资源的进程会显示在最上面。 要退出top或者htop,可以使用键盘快捷键Ctrl-C。这个键盘快捷键通常会终止目前在终端上运行的进程。 htop htop命令是top的改进版。默认情况下,大多数Linux发行版本都没有安装htop——在Ubuntu系统上安装可以运行以下命令: sudo apt-get install htop htop命令显示的信息与top相同,但它的界面更人性化。你可以使用键盘箭头键选择进程和采取某些动作,例如杀死进程或者改变它们的优先级。 过去我们详细解释过htop。 ps ps命令可以列出正在运行的进程。以下命令列出所有在你系统上运行的命令: ps -A 这个命令列出的信息也许太多,不方便阅读。你可以使用less命令对输出进行管道,这样你就可以按你的速度滚动阅读: ps -A | less 当你阅读完后,可以按q退出。 你也可以使用grep来对输出做管道,这样可以不需要使用其它命令就能搜索出某个进程。以下命令会搜索Firefox进程: ps -A | grep firefox pstree pstree命令也可以显示进程信息。它以树的形式显示进程。例如,你的x系统和图形环境会出现在产生树状进程的显示管理器的下面。 kill kill命令可以根据进程ID来杀死进程。你可以使用ps -A,top,或者grep命令获取到进程ID。 kill pid 从技术层面来讲,kill命令可以发送任何信号给一个进程。你可以使用kill -KILL或者kill -9来杀死顽固的进程。 pgrep 给定一个搜索关键词,pgrep命令会返回所有匹配这个关键词的进程ID。例如,你可以使用以下命令寻找Firefox的PID: pgrep firefox 你也可以将这个命令与kill命令结合起来杀死一个特定的进程。但是,使用pkill或者killall会更简单。 pkill & killall pkill和killall命令可以根据进程的名字杀死一个进程。使用以下任一方法都可以杀死Firefox进程: pkill firefox killall firefox renice renice命令用来改变进程的nice值。nice值代表进程的优先级。-19的nice值是非常高的优先级,相反,19是非常低的优先级。0是默认的优先级。 运行renice命令需要使用进程的ID。以下命令可以让某个进程以非常低的优先级运行。 renice 19 pid 你可以把pregrep和renice结合起来使用,如上图所示。 如果你想把进程的优先级调高,那么你需要使用root权限。在Ubuntu系统,使用sudo获取root权限: sudo renice -19 # xkill xkill命令是一个可以轻易杀死图形程度的命令。运行它之后,你的光标会变成x符号。点击相应的图形程序的窗口就可以杀死该程序。如果你中途要放弃操作,你可以点击鼠标右键取消。 你不一定要在终端运行这个命令——你可以在图形桌面上按Alt-F2,输入xkill然后按回车键来运行它。我们已经将xkill和热键绑定,这样杀死进程就更容易了。 你有没有一些喜爱的命令我们这里又没有提及的,或者其它一些小技巧可以分享的?请留下你的评论。 本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/1853880,如需转载请自行联系原作者
1.操作系统安装 本文采用CentOS6.5x86_64操作系统,也可以采用RHEL/CentOS6.x。选择ESXi主机平台上的虚拟机扮演KVM宿主机。 (1)开启ESXI主机网卡的混杂模式,让物理机能够与KVM虚拟机正常通信。 (2)关闭selinux、iptables 1 2 3 [root@node1 ~]# setenforce 0;sed -i '/SELINUX/s/enforcing/disabled/g' /etc/selinux/config [root@node1 ~]# chkconfig ip6tables off [root@node1 ~]# chkconfig iptables off (3)修改主机名 1 2 [root@node1 ~]# sed -i '/HOSTNAME/s/localhost.localdomain/node1/g' /etc/sysconfig/network [root@node1 ~]# echo "10.10.172.191 node1" >>/etc/hosts 2.虚拟化环境配置 (1)查看是否支持虚拟化 说明1:半虚拟化是不能运行与安装KVM虚拟机的。虚拟机修改.vmx文件追加vhv.enable = "TRUE",物理机需要开启VT功能 1 [root@node1 ~]# egrep '(vmx|svm)' --color=always /proc/cpuinfo (2)配置yum环境(采用系统默认即可) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 [root@node1 ~]# cd /etc/yum.repos.d/ [root@node1 yum.repos.d]# ll total 16 -rw-r--r--. 1 root root 1926 Nov 27 2013 CentOS-Base.repo -rw-r--r--. 1 root root 638 Nov 27 2013 CentOS-Debuginfo.repo -rw-r--r--. 1 root root 630 Nov 27 2013 CentOS-Media.repo -rw-r--r--. 1 root root 3664 Nov 27 2013 CentOS-Vault.repo [root@node1 yum.repos.d]# cat CentOS-Base.repo # CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # update status of each mirror to pick mirrors that are updated to and # geographically close to the client. You should use this for CentOS updates # unless you are manually picking other mirrors. # # If the mirrorlist= does not work for you, as a fall back you can try the # remarked out baseurl= line instead. # # [base] name=CentOS-$releasever - Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os #baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #released updates [updates] name=CentOS-$releasever - Updates mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates #baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #additional packages that may be useful [extras] name=CentOS-$releasever - Extras mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras #baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/ gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #additional packages that extend functionality of existing packages [centosplus] name=CentOS-$releasever - Plus mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus #baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 #contrib - packages by Centos Users [contrib] name=CentOS-$releasever - Contrib mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib #baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/ gpgcheck=1 enabled=0 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 [root@node1 yum.repos.d]# (3)安装kvm软件包 1 #yum -y install kvm python-virtinst libvirt tunctl bridge-utils virt-manager qemu-kvm-tools virt-viewer virt-v2v 安装kvm虚拟化一些管理工具包 1 #yum -y install libguestfs-tools 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 Installed: libvirt.x86_64 0:0.10.2-62.el6 python-virtinst.noarch 0:0.600.0-31.el6 qemu-kvm.x86_64 2:0.12.1.2-2.503.el6_9.3 qemu-kvm-tools.x86_64 2:0.12.1.2-2.503.el6_9.3 tunctl.x86_64 0:1.5-3.el6 virt-manager.x86_64 0:0.9.0-34.el6 virt-v2v.x86_64 0:0.9.1-5.el6_5 virt-viewer.x86_64 0:2.0-18.el6 Dependency Installed: augeas-libs.x86_64 0:1.0.0-10.el6 btrfs-progs.x86_64 0:0.20-0.2.git91d9eec.el6 celt051.x86_64 0:0.5.1.3-0.el6 cyrus-sasl-md5.x86_64 0:2.1.23-15.el6_6.2 ebtables.x86_64 0:2.0.9-6.el6 febootstrap-supermin-helper.x86_64 0:3.21-4.el6 gdisk.x86_64 0:0.8.10-1.el6 genisoimage.x86_64 0:1.1.9-12.el6 glusterfs.x86_64 0:3.7.9-12.el6 glusterfs-api.x86_64 0:3.7.9-12.el6 glusterfs-client-xlators.x86_64 0:3.7.9-12.el6 glusterfs-libs.x86_64 0:3.7.9-12.el6 gnutls-utils.x86_64 0:2.12.23-21.el6 gpxe-roms-qemu.noarch 0:0.9.7-6.16.el6 gtk-vnc.x86_64 0:0.3.10-3.el6 gtk-vnc-python.x86_64 0:0.3.10-3.el6 hivex.x86_64 0:1.3.3-4.3.el6 iscsi-initiator-utils.x86_64 0:6.2.0.873-27.el6_9 libcacard.x86_64 0:0.15.0-2.el6 libcgroup.x86_64 0:0.40.rc1-24.el6_9 libgovirt.x86_64 0:0.3.2-3.el6 libguestfs.x86_64 1:1.20.11-20.el6 libvirt-client.x86_64 0:0.10.2-62.el6 libvirt-python.x86_64 0:0.10.2-62.el6 lzop.x86_64 0:1.02-0.9.rc1.el6 mailcap.noarch 0:2.1.31-2.el6 nc.x86_64 0:1.84-24.el6 netcf-libs.x86_64 0:0.2.4-4.el6 netpbm.x86_64 0:10.47.05-11.el6 netpbm-progs.x86_64 0:10.47.05-11.el6 numad.x86_64 0:0.5-12.20150602git.el6 perl-Class-MethodMaker.x86_64 0:2.16-6.el6 perl-Class-Singleton.noarch 0:1.4-6.el6 perl-Compress-Raw-Zlib.x86_64 1:2.021-144.el6 perl-Compress-Zlib.x86_64 0:2.021-144.el6 perl-Crypt-SSLeay.x86_64 0:0.57-17.el6 perl-DateTime.x86_64 1:0.5300-3.el6 perl-HTML-Parser.x86_64 0:3.64-2.el6 perl-HTML-Tagset.noarch 0:3.20-4.el6 perl-IO-Compress-Base.x86_64 0:2.021-144.el6 perl-IO-Compress-Zlib.x86_64 0:2.021-144.el6 perl-IO-String.noarch 0:1.08-9.el6 perl-List-MoreUtils.x86_64 0:0.22-10.el6 perl-Params-Validate.x86_64 0:0.92-3.el6 perl-Sys-Guestfs.x86_64 1:1.20.11-20.el6 perl-Sys-Virt.x86_64 0:0.10.2-6.el6 perl-Term-ProgressBar.noarch 0:2.09-10.el6 perl-TermReadKey.x86_64 0:2.30-13.el6 perl-URI.noarch 0:1.40-2.el6 perl-XML-DOM.noarch 0:1.44-7.el6 perl-XML-DOM-XPath.noarch 0:0.14-4.el6 perl-XML-Parser.x86_64 0:2.36-7.el6 perl-XML-RegExp.noarch 0:0.03-7.el6 perl-XML-XPath.noarch 0:1.13-10.el6 perl-XML-XPathEngine.noarch 0:0.12-3.el6 perl-YAML-Tiny.noarch 0:1.40-2.el6 perl-hivex.x86_64 0:1.3.3-4.3.el6 perl-libintl.x86_64 0:1.20-1.el6 perl-libwww-perl.noarch 0:5.833-5.el6 qemu-img.x86_64 2:0.12.1.2-2.503.el6_9.3 radvd.x86_64 0:1.6-1.el6 rest.x86_64 0:0.7.92-3.el6 scrub.x86_64 0:2.2-2.el6 seabios.x86_64 0:0.6.1.2-30.el6 sgabios-bin.noarch 0:0-0.3.20110621svn.el6 spice-glib.x86_64 0:0.26-8.el6 spice-gtk.x86_64 0:0.26-8.el6 spice-gtk-python.x86_64 0:0.26-8.el6 spice-server.x86_64 0:0.12.4-16.el6 usbredir.x86_64 0:0.5.1-3.el6 vgabios.noarch 0:0.6b-3.8.el6 yajl.x86_64 0:1.0.7-3.el6 Updated: lvm2-libs.x86_64 0:2.02.143-12.el6_9.1 Dependency Updated: cyrus-sasl.x86_64 0:2.1.23-15.el6_6.2 cyrus-sasl-gssapi.x86_64 0:2.1.23-15.el6_6.2 cyrus-sasl-lib.x86_64 0:2.1.23-15.el6_6.2 cyrus-sasl-plain.x86_64 0:2.1.23-15.el6_6.2 device-mapper.x86_64 0:1.02.117-12.el6_9.1 device-mapper-event.x86_64 0:1.02.117-12.el6_9.1 device-mapper-event-libs.x86_64 0:1.02.117-12.el6_9.1 device-mapper-libs.x86_64 0:1.02.117-12.el6_9.1 device-mapper-persistent-data.x86_64 0:0.6.2-0.1.rc7.el6 glib2.x86_64 0:2.28.8-9.el6 gnutls.x86_64 0:2.12.23-21.el6 libdrm.x86_64 0:2.4.65-2.el6 lvm2.x86_64 0:2.02.143-12.el6_9.1 perl.x86_64 4:5.10.1-144.el6 perl-CGI.x86_64 0:3.51-144.el6 perl-ExtUtils-MakeMaker.x86_64 0:6.55-144.el6 perl-ExtUtils-ParseXS.x86_64 1:2.2003.0-144.el6 perl-Module-Pluggable.x86_64 1:3.90-144.el6 perl-Pod-Escapes.x86_64 1:1.04-144.el6 perl-Pod-Simple.x86_64 1:3.13-144.el6 perl-Test-Harness.x86_64 0:3.17-144.el6 perl-Test-Simple.x86_64 0:0.92-144.el6 perl-devel.x86_64 4:5.10.1-144.el6 perl-libs.x86_64 4:5.10.1-144.el6 perl-version.x86_64 3:0.77-144.el6 Complete! 3.查看虚拟化环境 (1)查看虚拟机环境 (2)查看kvm模块支持 (3)查看虚拟工具版本 4.手动配置虚拟网桥 (1)关闭NetworkManager服务 (2)创建br0网桥 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [root@node1 ~]# cd /etc/sysconfig/network-scripts/ [root@node1 network-scripts]# cp ifcfg-eth0 ifcfg-br0 [root@node1 network-scripts]# [root@node1 network-scripts]# cat ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet BRIDGE=br0 BOOTPROTO=static ONBOOT=yes IPADDR=10.10.172.191 PREFIX=24 GATEWAY=10.10.172.1 DNS1=192.168.172.208 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no NAME="system eth0" UUID=799e696b-8596-4106-a8b8-ed7737174ce4 HWADDR=00:50:56:86:7C:86 LAST_CONNECT=1493675713 [root@node1 network-scripts]# cat ifcfg-br0 DEVICE=br0 TYPE=Bridge BOOTPROTO=static ONBOOT=yes IPADDR=10.10.172.191 PREFIX=24 GATEWAY=10.10.172.1 DNS1=192.168.172.208 DEFROUTE=yes IPV4_FAILURE_FATAL=yes IPV6INIT=no HWADDR=00:50:56:86:7C:86 [root@node1 network-scripts]# (3)关闭了NetworkManager服务之后,才能通过service network restart管理网络。 (4)查看网桥br0 (5)查看网桥 到此kvm虚拟化环境安装完毕。 本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/1982447,如需转载请自行联系原作者
1. Pillar简介和应用场景 Pillar是Salt用来分发全局变量到所有minions的一个接口。Pillar data的管理类似于Salt State Tree。 Salt 0.9.8版本增加了pillar(动态数据) 存储位置: 存储在master端,存放需要提供给minion的信息。 应用场景: 敏感信息:每个minion只能访问master分配给自己的。 2. Pillar应用示例 [root@salt-master111 ~]# vim /etc/salt/master pillar_roots: base: - /srv/pillar [root@salt-master111 ~]# mkdir -p /srv/pillar [root@salt-master111 ~]# cd /srv/pillar/ [root@salt-master111 pillar]# vim zabbix.sls 内容如下: Zabbix_Server: 10.1.0.111 [root@salt-master111 pillar]# vim top.sls 内容如下 base: '10.1.0.112': - zabbix [root@salt-master111 pillar]# salt '*' saltutil.refresh_pillar 10.1.0.112: True salt-master111: True [root@salt-master111 pillar]# [root@salt-master111 pillar]# salt -I 'Zabbix_Server:10.1.0.111' test.ping10.1.0.112: True [root@salt-master111 pillar]# 更多Pillar详情:http://docs.saltstack.cn/topics/pillar/index.html 本文转自 ygqygq2 51CTO博客,原文链接:http://blog.51cto.com/ygqygq2/1933003,如需转载请自行联系原作者
转自:http://www.cnblogs.com/tomatoes-/p/6108916.html set colsep' '; //-域输出分隔符 set echo off; //显示start启动的脚本中的每个sql命令,缺省为on set echo on //设置运行命令是是否显示语句 set feedback on; //设置显示“已选择XX行” set feedback off; //回显本次sql命令处理的记录条数,缺省为on set heading off; //输出域标题,缺省为on set pagesize 0; //输出每页行数,缺省为24,为了避免分页,可设定为0。 set linesize 80; //输出一行字符个数,缺省为80 set numwidth 12; //输出number类型域长度,缺省为10 set termout off; //显示脚本中的命令的执行结果,缺省为on set trimout on; //去除标准输出每行的拖尾空格,缺省为off set trimspool on; //去除重定向(spool)输出每行的拖尾空格,缺省为off set serveroutput on; //设置允许显示输出类似dbms_output set timing on; //设置显示“已用时间:XXXX” set autotrace on; //设置允许对执行的sql进行分析 set verify off //可以关闭和打开提示确认信息old 1和new 1的显示. set long 1000; //设置long类型显示字节数,默认为80 set space 3; //设置各列之间的空格数量 set autocommit on;//启用自动提交,每执行完一条语句自动提交 set autocommit off;//关闭自动提交,只有发出commit后才能被提交 set autocommit 10;//设置允许用户在发出commit后,可以执行命令的数量(将10条语句所做的改变进行提交) set arraysize 10;//设置一次可以提取的行的数量(数值应介于1-5000) set timeout on;//设置屏幕显示输出信息 set timeout off;//设置屏幕不显示输出信息 set transaction read only;//保证读一致性,其他用户的修改不影响当前查询的结果 set transaction use rollback segment segment_name;//为当前事物指定回滚段 show all;//查看当前所有参数的数值
一、简便切换用户: 切换用户,每次输入密码,比较麻烦,可以使用脚本交互式登录实现,每次只要输入./su_ 并tab,执行此脚本,即可切换至root用户,比较简单。如下: hao@hao-ubuntu:~$ cat su_root.sh #!/usr/bin/expect set timeout 3 spawn su expect "Password:" exec sleep 1 send "root\r" expect "#" interact hao@hao-ubuntu:~$ ./su_root.sh spawn su Password: root@hao-ubuntu:/home/hao# 当然也可以增加一些if判断之类,让其他用户切换也不必输入密码。具体根据个人喜欢自己修改完善。 二、交互式登录: 通过expect,实现交互式登录,且看如下脚本: hao@hao-ubuntu:~$ cat login.sh #!/usr/bin/expect -f set ipaddr "192.168.77.58" set passwd "hao" spawn ssh hao@$ipaddr #spawn 意思是执行命令,expect内命令,shell中不存在 expect { "yes/no" { send "yes\r"; exp_continue} "password:" { send "$passwd\r" } } #expect "]# " #echo '----------------login $ipaddr SUCC!--------------' #send "touch a.txt\r" #意思为发送命令 #send "exit\r" expect eof exit =========================================== 另外尝试修改sh,或者alias,使其随处可以调用,而不是只能到固定位置执行脚本才可以,或许更为优化。 当然此脚本稍微可以带来便利,但是也存在安全风险。 补充一点内容: 对如上内容可以详细解释如下:expect spawn、linux expect 用法 使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。 脚本代码如下: ############################################## #!/usr/bin/expect set timeout 30 spawn ssh -l username 192.168.1.1 expect "password:" send "ispass\r" interact ############################################## 1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 注意:这一行需要在脚本的第一行。 2. [set timeout 30] 基本上认识英文的都知道这是设置超时时间的,现在你只要记住他的计时单位是:秒 3. [spawn ssh -l username 192.168.1.1] spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。好比windows里的dir就是一个内部命令,这个命令由shell自带,你无法找到一个dir.com 或 dir.exe 的可执行文件。 它主要的功能是给ssh运行进程加个壳,用来传递交互指令。 4. [expect "password:"] 这里的expect也是expect的一个内部命令,有点晕吧,expect的shell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒 5. [send "ispass\r"] 这里就是执行交互动作,与手工输入密码的动作等效。 温馨提示: 命令字符串结尾别忘记加上“\r”,如果出现异常等待的状态可以核查一下。 6. [interact] 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行 #!/usr/bin/expect #注意安装的路径,不确定 whereis expect 一下 # Change a login shell to bash set user [lindex $argv 0] spawn bash $user expect "]:" send "/bin/bash " expect eof exit 使用expect自动登录 一,什么是expect? 在做系统管理时,我们很多时候需要输入密码,例如:连接 ssh,连接ftp, 那么如何能做到不输入密码吗? 我们需要有一个工具,能代替我们实现与终端的交互, 那么,就是它:expect,管理员的最好的朋友之一 它能够代替我们实现与终端的交互,我们不必再守候在电脑旁边输入密码, 或是根据系统的输出再运行相应的命令, 这些都可以由expect代替我们来完成 说明:expect到底是什么? expect是一种脚本语言,使用起来非常简单,我们看后面的例子即可以了解到了 三,安装expect 备注:因为expect是基于tcl的,所以需要你的系统中安装有tcl 如何检查? [root@dev ~]# whereis tcl tcl: /usr/lib/tcl8.4 /usr/share/tcl8.4 如果看不到结果,请先安装tcl 安装, [root@dev ~]# yum install expect 也可以从http://rpm.pbone.net下载for相应发行版的rpm包 本文转自 念槐聚 博客园博客,原文链接:http://www.cnblogs.com/haochuang/archive/2012/05/18/2507457.html,如需转载请自行联系原作者
sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,就能实现所有功能。 但是增删查改并不能代表sql语句的所有, 完整的sql功能会另人望而生畏。 就拿比普通增删查改稍微复杂一个层次的连接查询来说, 盲目使用, 也会出现意料之外的危险结果,导致程序出现莫名其妙的BUG。 在连接查询语法中,另人迷惑首当其冲的就要属on筛选和where筛选的区别了, 在我们编写查询的时候, 筛选条件的放置不管是在on后面还是where后面, 查出来的结果总是一样的, 既然如此,那为什么还要多此一举的让sql查询支持两种筛选器呢? 事实上, 这两种筛选器是存在差别的,只是如果不深挖不容易发现而已。 sql中的连接查询分为3种, cross join,inner join,和outer join , 在 cross join和inner join中,筛选条件放在on后面还是where后面是没区别的,极端一点,在编写这两种连接查询的时候,只用on不使用where也没有什么问题。因此,on筛选和where筛选的差别只是针对outer join,也就是平时最常使用的left join和right join。 来看一个示例,有两张数据表,结构和数据如图所示 表main 表ext 可以把这两张表看作是用来存放用户信息的, main放置主要信息,ext表放置附加信息,两张表的关系是1对1的,以id字符作为对应关系键。现在我们需要将地址不为杭州的所有用户信息筛选出来,结果中需要包含main表和ext表的所有字段数据。 select * from main left JOIN exton main.id = ext.id and address <> '杭州' 闭上眼睛, 请用大脑人肉运行一下这段SQL, 想象一下是什么结果。 当把 address <> '杭州' 这个筛选条件放在on之后,查询得到的结果似乎跟我们预料中的不同,从结果中能看出,这个筛选条件好像只过滤掉了ext表中对应的记录,而main表中的记录并没有被过滤掉,也就是上图中标记为红色的那条记录。outer join相对于inner join的一个主要特性就是以一侧的表为基础,但是在这里以左表为基这一点却可以无视筛选条件,这未免也太霸道了一些。 把查询语句稍微改动一下,将地址的筛选条件从on转移至where select * from main left JOIN ext on main.id = ext.id where address <> '杭州' 结果就如我们预期的那样了 造成这种结果上的差异要从outer join查询的逻辑查询的各个阶段说起。总的来说,outer join 的执行过程分为4步 1、先对两个表执行交叉连接(笛卡尔积) 2、应用on筛选器 3、添加外部行 4、应用where筛选器 就拿上面不使用where筛选器的sql来说,执行的整个详细过程如下 第一步,对两个表执行交叉连接,结果如下,这一步会产生36条记录(此图显示不全) 第二步,应用on筛选器。筛选器中有两个条件,main.id = ext.id and address<> '杭州',符合要求的记录如下 这似乎正是我们期望中查询的结果,然而在接下来的步骤中这个结果会被打乱 第三步,添加外部行。outer join有一个特点就是以一侧的表为基,假如另一侧的表没有符合on筛选条件的记录,则以null替代。在这次的查询中,这一步的作用就是将那条原本应该被过滤掉的记录给添加了回来 是不是不种画蛇添足的感觉, 结果就成了这样 第四步,应用where筛选器 在这条问题sql中,因为没有where筛选器,所以上一步的结果就是最终的结果了。 而对于那条地址筛选在where条件中的sql,这一步便起到了作用,将所有地址不属于杭州的记录筛选了出来 通过上面的讲解,已经能反应出在outer join中的筛选条件在on中和where中的区别,开发人员如能详细了解之中差别,能规避很多在编写sql过程中出现的莫名其妙的错误。 本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1928058,如需转载请自行联系原作者
NET命令详解综合了WINDOWS 98,WINDOWS WORKSTATION和WINDOWS SERVER 三个操作系统关于NET命令的解释,希望可以全面一些。 先说一些: (1)NET命令是一个命令行命令。 (2)管理网络环境、服务、用户、登陆。。。。等本地信息 (3)WIN 98,WIN WORKSTATION和WIN NT都内置了NET命令。 (4)但WIN 98的NET命令和WORKSTATION、NT的NET命令不同。 (5)WORKSTATION和SERVER中的NET命令基本相同。 (6)获得HELP (1)在NT下可以用图形的方式,开始-》帮助-》索引-》输入NET (2)在COMMAND下可以用字符方式,NET /?或NET或NET HELP得到一些方法 相应的方法的帮助NETCOMMAND /HELP或NET HELP COMMAND 或NET COMMAND /? 另对于错误NET HELPMSG MESSAGE#是4位数 (7)强制参数 所有net命令接受选项/yes和/no(可缩写为/y和/n)。[简单的说就是预先给系统的 提问一个答案] (8)有一些命令是马上产生作用并永久保存的,使用的时候要慎重 (9)对于NET命令的功能都可以找到相应的图形工具的解决方案 (10)命令的组成 命令 参数 选项 | 参数 选项 | 参数 选项 |。。。。。。 瘰疬罗嗦说了一大堆,其实就是6和7有用,呵呵 另有两件事: (1)在NT的NET命令中有一些参数是只有在SERVER环境中才能使用的 (2)在WIN98的NET命令中有一些参数不能在DOS-WIN中使用,只能在DOS环境中使用 下面对NET命令的不同参数的基本用法做一些初步的介绍: (1)NET VIEW 作 用:显示域列表、计算机列表或指定计算机的共享资源列表。 命令格式:net view [computername | /domain[:domainname} 参数介绍: (1)键入不带参数的net view显示当前域的计算机列表。 (2)computername 指定要查看其共享资源的计算机。 (3)/domain[:domainname]指定要查看其可用计算机的域。 简单事例: (1)net view YFANG查看YFANG的共享资源列表。 (2)net view /domain:LOVE查看LOVE域中的机器列表。 (2)NET USER 作 用:添加或更改用户帐号或显示用户帐号信息。该命令也可以写为 net users。 命令格式:net user [username [password | *] [options} [/domain] 参数介绍: (1)键入不带参数的net user查看计算机上的用户帐号列表。 (2)username添加、删除、更改或查看用户帐号名。 (3)password为用户帐号分配或更改密码。 (4)*提示输入密码。 (5)/domain在计算机主域的主域控制器中执行操作。 简单事例: (1)net user yfang查看用户YFANG的信息 (3)NET USE 作 用:连接计算机或断开计算机与共享资源的连接,或显示计算机的连接信息。 命令格式:net use [devicename | *] [computernamesharename[volume} [password | *} [/user:[domainname]username] {/delete] | [/persistent:{yes | no}} 参数介绍: 键入不带参数的net use列出网络连接。 devicename指定要连接到的资源名称或要断开的设备名称。 computernamesharename服务器及共享资源的名称。 password访问共享资源的密码。 *提示键入密码。 /user指定进行连接的另外一个用户。 domainname指定另一个域。 username指定登录的用户名。 /home将用户连接到其宿主目录。 /delete取消指定网络连接。 /persistent控制永久网络连接的使用。 简单事例: (1)net use e: YFANGTEMP将YFANGTEMP目录建立为E盘 (2)net use e: YFANGTEMP /delete断开连接 (4)NET TIME 作 用:使计算机的时钟与另一台计算机或域的时间同步。 命令格式:net time [computername | /domain[:name} [/set] 参数介绍: (1)computername要检查或同步的服务器名。 (2)/domain[:name]指定要与其时间同步的域。 (3)/set使本计算机时钟与指定计算机或域的时钟同步。 下面的这4个参数是相关的,所以一起介绍 (5)Net Start 作 用:启动服务,或显示已启动服务的列表。 命令格式:net start service (6)Net Pause 作 用:暂停正在运行的服务。 命令格式:net pause service (7)Net Continue 作 用:重新激活挂起的服务。 命令格式:net continue service (8)NET STOP 作 用:停止 Windows NT 网络服务。 命令格式:net stop service 参数介绍:我们来看看这些服务都是什么 (1)alerter(警报) (2)client service for netware(Netware 客户端服务) (3)clipbook server(剪贴簿服务器) (4)computer browser(计算机浏览器) (5)directory replicator(目录复制器) (6)ftp publishing service (ftp )(ftp 发行服务) (7)lpdsvc (8)net logon(网络登录) (9)network dde(网络 dde) (10)network dde dsdm(网络 dde dsdm) (11)network monitor agent(网络监控代理) (12)nt lm security support provider(NT LM 安全性支持提供) (13)ole(对象链接与嵌入) (14)remote access connection manager(远程访问连接管理器) (15)remote access isnsap service(远程访问 isnsap 服务) (16)remote access server(远程访问服务器) (17)remote procedure call (rpc) locator(远程过程调用定位器) (18)remote procedure call (rpc) service(远程过程调用服务) (19)schedule(调度) (20)server(服务器) (21)simple tcp/ip services(简单 TCP/IP 服务) (22)snmp (23)spooler(后台打印程序) (24)tcp/ip netbios helper(TCP/IP NETBIOS 辅助工具) (25)ups (26)workstation(工作站) (27)messenger(信使) (28)dhcp client (29)eventlog 以下这些SERVICE只能在NT SERVER上使用 (1)file server for macintosh (2)gateway service for netware (3)microsoft dhcp server (4)print server for macintosh (5)remoteboot (6)windows internet name service (9)Net Statistics 作 用:显示本地工作站或服务器服务的统计记录。 命令格式:net statistics [workstation | server] 参数介绍: (1)键入不带参数的net statistics列出其统计信息可用的运行服务。 (2)workstation显示本地工作站服务的统计信息。 (3)server显示本地服务器服务的统计信息。 简单事例: (1)net statistics server | more显示服务器服务的统计信息 (10)Net Share 作 用:创建、删除或显示共享资源。 命令格式:net share sharename=drive:path [/users:number | /unlimited] [/remark:"text"] 参数介绍: (1)键入不带参数的net share显示本地计算机上所有共享资源的信息。 (2)sharename是共享资源的网络名称。 (3)drive:path指定共享目录的绝对路径。 (4)/users:number设置可同时访问共享资源的最大用户数。 (5)/unlimited不限制同时访问共享资源的用户数。 (6)/remark:"text "添加关于资源的注释,注释文字用引号引住。 简单事例: (1)net share mylove=c:temp /remark:"my first share"以mylove为共享名共享C:temp (2)net share mylove /delete停止共享mylove目录 (11)Net Session 作 用:列出或断开本地计算机和与之连接的客户端的会话,也可以写为net sessions或net sess。 命令格式:net session [computername] [/delete] 参数介绍: (1)键入不带参数的net session显示所有与本地计算机的会话的信息。 (2)computername标识要列出或断开会话的计算机。 (3)/delete结束与computername计算机会话并关闭本次会话期间计算机的所有. 简单事例: (1)net session YFANG要显示计算机名为YFANG的客户端会话信息列表。 (12)Net Send 作 用:向网络的其他用户、计算机或通信名发送消息。 命令格式:net send {name | * | /domain[:name] | /users} message 参数介绍: (1)name要接收发送消息的用户名、计算机名或通信名。 (2)*将消息发送到组中所有名称。 (3)/domain[:name]将消息发送到计算机域中的所有名称。 (4)/users将消息发送到与服务器连接的所有用户。 (5)message作为消息发送的文本。 简单事例: (1)net send /users server will shutdown in 5 minutes.给所有连接到服务器的用户发送消息 (13)Net Print 作 用:显示或控制打印作业及打印队列。 命令格式:net print [computername ] job# [/hold | /release | /delete] 参数介绍: (1)computername共享打印机队列的计算机名。 (2)sharename打印队列名称。 (3)job#在打印机队列中分配给打印作业的标识号。 (4)/hold使用 job# 时,在打印机队列中使打印作业等待。 (5)/release释放保留的打印作业。 (6)/delete从打印机队列中删除打印作业。 简单事例: (1)net print YFANGSEEME列出YFANG计算机上SEEME打印机队列的目录 (14)Net Name 作 用:添加或删除消息名(有时也称别名),或显示计算机接收消息的名称列表。 命令格式:net name [name [/add | /delete} 参数介绍: (1)键入不带参数的net name列出当前使用的名称。 (2)name指定接收消息的名称。 (3)/add将名称添加到计算机中。 (4)/delete从计算机中删除名称。 (15)Net Localgroup 作 用:添加、显示或更改本地组。 命令格式:net localgroup groupname {/add [/comment:"text "] | /delete} [/domain] 参数介绍: (1)键入不带参数的net localgroup显示服务器名称和计算机的本地组名称。 (2)groupname要添加、扩充或删除的本地组名称。 (3)/comment: "text "为新建或现有组添加注释。 (4)/domain在当前域的主域控制器中执行操作,否则仅在本地计算机上执行操作? (5)name [ ...]列出要添加到本地组或从本地组中删除的一个或多个用户名或组名。 (6)/add将全局组名或用户名添加到本地组中。 (7)/delete从本地组中删除组名或用户名。 简单事例: (1)net localgroup love /add将名为love的本地组添加到本地用户帐号数据库 (2)net localgroup love显示love本地组中的用户 (16)Net Group 作 用:在 Windows NT Server 域中添加、显示或更改全局组。 命令格式:net group groupname {/add [/comment:"text "] | /delete} [/domain] 参数介绍: (1)键入不带参数的net group显示服务器名称及服务器的组名称。 (2)groupname要添加、扩展或删除的组。 (3)/comment:"text "为新建组或现有组添加注释。 (4)/domain在当前域的主域控制器中执行该操作,否则在本地计算机上执行操作? ? (5)username[ ...]列表显示要添加到组或从组中删除的一个或多个用户。 (6)/add添加组或在组中添加用户名。 (7)/delete删除组或从组中删除用户名。 简单事例: (1)net group love yfang1 yfang2 /add将现有用户帐号yfang1和yfang2添加到本地计算机的love组 (17)Net File 作 用:显示某服务器上所有打开的共享文件名及锁定文件数。 命令格式:net file [id [/close} 参数介绍: (1)键入不带参数的net file获得服务器上打开文件的列表。 (2)id文件标识号。 (3)/close关闭打开的文件并释放锁定记录。 (18)Net Config 作 用:显示当前运行的可配置服务,或显示并更改某项服务的设置。 命令格式:net config [service [options} 参数介绍: (1)键入不带参数的net config显示可配置服务的列表。 (2)service通过net config命令进行配置的服务(server或workstation) (3)options服务的特定选项。 (19)Net Computer 作 用:从域数据库中添加或删除计算机。 命令格式:net computer computername {/add | /del} 参数介绍: (1)computername指定要添加到域或从域中删除的计算机。 (2)/add将指定计算机添加到域。 (3)/del将指定计算机从域中删除。 简单事例: (1)net computer cc /add将计算机 cc 添加到登录域 (20)Net Accounts 作 用:更新用户帐号数据库、更改密码及所有帐号的登录要求。 命令格式:net accounts [/forcelogoff:{minutes | no}] [/minpwlen:length] [/maxpwage:{days | unlimited}] [/minpwage:days] [/uniquepw:number] [/domain] 参数介绍: (1)键入不带参数的net accounts显示当前密码设置、登录时限及域信息。 (2)/forcelogoff:{minutes | no}设置当用户帐号或有效登录时间过期时 (3)/minpwlen:length设置用户帐号密码的最少字符数。 (4)/maxpwage:{days | unlimited}设置用户帐号密码有效的最大天数。 (5)/minpwage:days设置用户必须保持原密码的最小天数。 (6)/uniquepw:number要求用户更改密码时,必须在经过number次后才能重复使用 与之相同的密码。 (7)/domain在当前域的主域控制器上执行该操作。 (8)/sync当用于主域控制器时,该命令使域中所有备份域控制器同步 简单事例: (1)net accounts /minpwlen:7将用户帐号密码的最少字符数设置为7 ----------------------上面介绍的是NET命令在WINNT下的基本用法 ----------------------下面我们看看NET命令在WIN98下的基本用法 在WIN98中NET命令也有一些参数的名字和功能及简单的使用方法和WINNT下的相应的参数的用法相同 其中有 (1)NET TIME命令 (2)NET PRINT命令 (3)NET USE命令 (4)NET VIEW命令 在WIN98中NET命令有一些参数的名字和WINNT下的相应的参数的名字相同,但其用法却有些不同 其中有 (1)NET START 作 用:启动相应的服务。(不能在DOS-WIN中用) 命令格式:NET START [BASIC | NWREDIR | WORKSTATION | NETBIND | NETBEUI | NWLINK] [/LIST] [/YES] [/VERBOSE] (2)NET STOP 作 用:停止相应的服务.(不能在DOS-WIN中用) 命令格式:NET STOP [BASIC | NWREDIR | WORKSTATION | NETBEUI | NWLINK] [/YES] 在WIN98中NET命令还有一些参数是在98下才有的 其中有 (1)NET DIAG 作 用:运行MS的DIAGNOSTICS程序显示网络的DIAGNOSTIC信息 命令格式:NET DIAGNOSTICS [/NAMES | /STATUS] (2)NET INIT 作 用:不通过绑定来加载协议或网卡驱动(不能在DOS-WIN中用) 命令格式:NET INITIALIZE [/DYNAMIC] (3)NET LOGOFF 作 用:断开连接的共享资源(不能在DOS-WIN中用) ( (4)NET LOGON 作 用:在WORKGROUP中登陆(不能在DOS-WIN中用) 命令格式:NET LOGON [user [password | ?} [/DOMAIN:name] [/YES] [/SAVEPW:NO] (5)NET PASSWORD 作 用:更改你的网络登陆口令(不能在DOS-WIN中用) 命令格式:NET PASSWORD computer | /DOMAIN:name [user [oldpassword [newpassword> 本文转自 wwwzbx 51CTO博客,原文链接:http://blog.51cto.com/wwwzbx/2962,如需转载请自行联系原作者
概念:俗话就是拷贝一个副本 一般实现: 实现Cloneable 接口重写clone()方法 部分代码 public Object clone() { Object o = null; try { o = (Student) super.clone();// Object中的clone()识别出你要复制的是哪一 // 个对象。 } catch (CloneNotSupportedException e) { System.out.println(e.toString()); } return o; } 注意:浅复制不能同时复制引用 如果需要复制引用将需要引用的对象也克隆一下做深复制 更好的方法是利用序列化(常说的串行化)来实现深复制(不需要实现Cloneable接口,需要实现Serializable接口) 见部分代码 public Object deepClone() throws IOException, OptionalDataException, ClassNotFoundException { // 将对象写到流里 ByteArrayOutputStream bo = new ByteArrayOutputStream(); ObjectOutputStream oo = new ObjectOutputStream(bo); oo.writeObject(this); // 从流里读出来 ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray()); ObjectInputStream oi = new ObjectInputStream(bi); return (oi.readObject()); } 本文转自 www19 51CTO博客,原文链接:http://blog.51cto.com/doujh/1932919,如需转载请自行联系原作者
原文链接:http://soft.yesky.com/lesson/318/2166818.shtml 动态链接库(DLL)是Windows系统的核心,也是COM技术的基础,因此突破动态链接库一直是技术人员的攻坚目标,本期专题将由浅入深的介绍动态链接库的基础慨念、分类、实现和应用。 第一章:VC++动态链接库编程之基础慨念 1.1、概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。 对动态链接库,我们还需建立如下概念: (1)DLL 的编制与具体的编程语言及编译器无关 只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。(2)动态链接库随处可见 我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。 一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。(3)VC动态链接库的分类Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。 非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。 1.2、静态链接库 对静态链接库的讲解不是本文的重点,但是在具体讲解DLL之前,通过一个静态链接库的例子可以快速地帮助我们建立“库”的概念。 图1 建立一个静态链接库 静态库编写方法:如图1,在VC++6.0中new一个名称为LibTest的static library工程(单击此处下载本工程),并新建lib.h和lib.cpp两个文件,lib.h和lib.cpp的源代码如下: //文件:lib.h #ifndef __LIB_H__ #define __LIB_H__ extern "C" int add(int x,int y);//声明为C编译、连接方式的外部函数 #endif //文件:lib.cpp #include "lib.h" int add(int x,int y) { return x + y; } 编译这个工程就得到了一个.lib文件,这个文件就是一个函数库,它提供了add的功能。将头文件和.lib文件提交给用户后,用户就可以直接使用其中的add函数了。 标准Turbo C2.0中的C库函数(我们用来的scanf、printf、memcpy、strcpy等)就来自这种静态库。 静态库使用方法:下面来看看怎么使用这个库,在LibTest工程所在的工作区内new一个LibCall工程。LibCall工程仅包含一个main.cpp文件,它演示了静态链接库的调用方法,其源代码如下: #include <stdio.h> #include "..\LibTest\lib.h" #pragma comment(lib, "..\\LibTest\\debug\\libTest.lib") //指定与静态库一起连接 //..\\debug\\为LibTest.lib文件路径 int main(int argc, char* argv[]) { printf("2 + 3 = %d\n", add( 2, 3 )); return 0; } 静态链接库的调用就是这么简单,或许我们每天都在用,可是我们没有明白这个概念。代码中#pragma comment(lib, "..\\LibTest\\debug\\libTest.lib")的意思是指本文件生成的.obj文件应与LibTest.lib一起连接。如果不用#pragma comment指定,则可以直接在VC++中设置,如图2,依次选择Tools->Options->Directories->Library files菜单或选项,填入库文件路径。图2中加红圈的部分为我们添加的LibTest.lib文件的路径。 图2 在VC中设置库文件路径 1.3、库的调试与查看 在具体进入各类DLL的详细阐述之前,有必要对库文件的调试与查看方法进行一下介绍,因为从下一节开始我们将面对大量的例子工程。 由于库文件不能单独执行,因而在按下F5(开始debug模式执行)或CTRL+F5(运行)执行时,其弹出如图3所示的对话框,要求用户输入可执行文件的路径来启动库函数的执行。这个时候我们输入要调用该库的EXE文件的路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样。 图3 库的调试与“运行” 通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库的工程)放置在同一VC工作区,只对应用工程进行调试,在应用工程调用库中函数的语句处设置断点,执行后按下F11,这样就单步进入了库中的函数。第2节中的libTest和libCall工程就放在了同一工作区,其工程结构如图4所示。 图4 把库工程和调用库的工程放入同一工作区进行调试 动态链接库中的导出接口可以使用Visual C++的Depends工具进行查看,让我们用Depends打开系统目录中的user32.dll,看到了吧?红圈内的就是几个版本的MessageBox了!原来它真的在这里啊,原来它就在这里啊! 图5 用Depends查看DLL 当然Depends工具也可以显示DLL的层次结构,若用它打开一个可执行文件则可以看出这个可执行文件调用了哪些DLL。 第二章:VC++动态链接库编程之非MFC DLL 2.1、一个简单的DLL 第1.2节给出了以静态链接库方式提供add函数接口的方法,接下来我们来看看怎样用动态链接库实现一个同样功能的add函数。 如图6,在VC++中new一个Win32 Dynamic-Link Library工程DllTest。注意不要选择MFC AppWizard(dll),因为用MFC AppWizard(dll)建立的将是第5、6节要讲述的MFC 动态链接库。 图6 建立一个非MFC DLL 在建立的工程中添加dll.h及dll.cpp文件,源代码如下: /* 文件名:dll.h*/ #ifndef __DLL_H__ #define __DLL_H__ extern "C" int __declspec(dllexport)add(int x, int y); #endif /* 文件名:dll.cpp*/ #include "dll.h" int add(int x, int y) { return x + y; } 与第2节对静态链接库的调用相似,我们也建立一个与DLL工程处于同一工作区的应用工程DllCall,它调用DLL中的函数add,其源代码如下: #include <stdio.h> #include <windows.h> typedef int(*lpAddFun)(int, int); //宏定义函数指针类型 int main(int argc, char *argv[]) { HINSTANCE hDll; //DLL句柄 lpAddFun addFun; //函数指针 hDll = LoadLibrary("..\\DllTest\\Debug\\DllTest.dll"); if (hDll != NULL) { addFun = (lpAddFun)GetProcAddress(hDll, "add"); if (addFun != NULL) { int result = addFun(2, 3); printf("2 + 3 = %d\n", result); } FreeLibrary(hDll); } return 0; } 分析上述代码,DllTest工程中的dll.cpp文件与第1.2节静态链接库版本完全相同,不同在于dll.h对函数add的声明前面添加了__declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。DLL内的函数分为两种:(1)DLL导出函数,可供应用程序调用;(2) DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。 而应用程序对本DLL的调用和对第2节静态链接库的调用却有较大差异,下面我们来逐一分析。 首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun; 其次,在函数main中定义了一个DLL HINSTANCE句柄实例hDll,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll; 再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用; 最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。 通过这个简单的例子,我们获知DLL定义和调用的一般概念:(1)DLL中需以某种特定的方式声明导出函数(或变量、类);(2)应用工程需以某种特定的方式调用DLL的导出函数(或变量、类)。 下面我们来对“特定的方式进行”阐述。 2.2、声明导出函数 DLL中导出函数的声明有两种方式:一种为2.1节例子中给出的在函数声明中加上__declspec(dllexport),这里不再举例说明;另外一种方式是采用模块定义(.def) 文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。 下面的代码演示了怎样同.def文件将函数add声明为DLL导出函数(需在DllTest工程中添加dll.def文件): ; dll.def : 导出DLL函数LIBRARY DllTestEXPORTSadd @ 1 .def文件的规则为:(1)LIBRARY语句说明.def文件相应的DLL;(2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);(3).def 文件中的注释由每个注释行开始处的分号 (;) 指定,且注释不能与语句共享一行。 由此可以看出,例子中dll.def文件的含义为生成名为“DllTest”的动态链接库,导出其中的add函数,并指定add函数的序号为1。 2.3、DLL的调用方式 在2.1节的例子中我们看到了由“LoadLibrary-GetProcAddress-FreeLibrary”系统Api提供的三位一体“DLL加载——DLL函数地址获取——DLL释放”方式,这种调用方式称为DLL的动态调用。 动态调用方式的特点是完全由编程者用 API 函数加载和卸载 DLL,程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个DLL 文件。 与动态调用方式相对应的就是静态调用方式,静态调用方式的特点是由编译系统完成对DLL的加载和应用程序结束时 DLL 的卸载。当调用某DLL的应用程序结束时,若系统中还有其它程序使用该 DLL,则Windows对DLL的应用记录减1,直到所有使用该DLL的程序都结束时才释放它。静态调用方式简单实用,但不如动态调用方式灵活。 将编译dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路径,dllCall执行下列代码: #pragma comment(lib,"DllTest.lib") //.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息extern "C" __declspec(dllimport) add(int x,int y); int main(int argc, char* argv[]){int result = add(2,3); printf("%d",result);return 0;} 由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作:(1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,"DllTest.lib")就是起这个作用。 程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。(2)声明导入函数,extern "C" __declspec(dllimport) add(int x,int y)语句中的__declspec(dllimport)发挥这个作用。 静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在 EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。 2.4、DllMain函数 Windows在加载DLL的时候,需要一个入口函数,就如同控制台或DOS程序需要main函数、Win32程序需要WinMain函数一样。在前面的例子中,DLL并没有提供DllMain函数,应用工程也能成功引用DLL,这是因为Windows在找不到DllMain的时候,系统会从其它运行库中引入一个不做任何操作的缺省DllMain函数版本,并不意味着DLL可以放弃DllMain函数。 根据编写规范,Windows必须查找并执行DLL里的DllMain函数作为加载DLL的依据,它使得DLL得以保留在内存里。这个函数并不属于导出函数,而是DLL的内部函数。这意味着不能直接在应用工程中引用DllMain函数,DllMain是自动被调用的。 我们来看一个DllMain函数的例子 BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:printf("\nprocess attach of dll");break;case DLL_THREAD_ATTACH:printf("\nthread attach of dll");break;case DLL_THREAD_DETACH:printf("\nthread detach of dll");break;case DLL_PROCESS_DETACH:printf("\nprocess detach of dll");break;}return TRUE;} DllMain函数在DLL被加载和卸载时被调用,在单个线程启动和终止时,DllMain函数也被调用,ul_reason_for_call指明了被调用的原因。原因共有4种,即PROCESS_ATTACH、PROCESS_DETACH、THREAD_ATTACH和THREAD_DETACH,以switch语句列出。 来仔细解读一下DllMain的函数头BOOL APIENTRY DllMain( HANDLE hModule, WORD ul_reason_for_call, LPVOID lpReserved )。APIENTRY被定义为__stdcall,它意味着这个函数以标准Pascal的方式进行调用,也就是WINAPI方式; 进程中的每个DLL模块被全局唯一的32字节的HINSTANCE句柄标识,只有在特定的进程内部有效,句柄代表了DLL模块在进程虚拟空间中的起始地址。在Win32中,HINSTANCE和HMODULE的值是相同的,这两种类型可以替换使用,这就是函数参数hModule的来历。 执行下列代码: hDll = LoadLibrary("..\\Debug\\dllTest.dll");if (hDll != NULL){addFun = (lpAddFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));//MAKEINTRESOURCE直接使用导出文件中的序号if (addFun != NULL){int result = addFun(2, 3);printf("\ncall add in dll:%d", result);}FreeLibrary(hDll);} 我们看到输出顺序为: process attach of dllcall add in dll:5process detach of dll 这一输出顺序验证了DllMain被调用的时机。 代码中的GetProcAddress ( hDll, MAKEINTRESOURCE ( 1 ) )值得留意,它直接通过.def文件中为add函数指定的顺序号访问add函数,具体体现在MAKEINTRESOURCE ( 1 ),MAKEINTRESOURCE是一个通过序号获取函数名的宏,定义为(节选自winuser.h): #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))#define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))#ifdef UNICODE#define MAKEINTRESOURCE MAKEINTRESOURCEW#else#define MAKEINTRESOURCE MAKEINTRESOURCEA 2.5、__stdcall约定 如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern "C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如_functionname@number;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。Windows编程中常见的几种函数类型声明宏都是与__stdcall和__cdecl有关的(节选自windef.h): #define CALLBACK __stdcall //这就是传说中的回调函数#define WINAPI __stdcall //这就是传说中的WINAPI#define WINAPIV __cdecl#define APIENTRY WINAPI //DllMain的入口就在这里#define APIPRIVATE __stdcall#define PASCAL __stdcall 在lib.h中,应这样声明add函数: int __stdcall add(int x, int y); 在应用工程中函数指针类型应定义为: typedef int(__stdcall *lpAddFun)(int, int); 若在lib.h中将函数声明为__stdcall调用,而应用工程中仍使用typedef int (* lpAddFun)(int,int),运行时将发生错误(因为类型不匹配,在应用工程中仍然是缺省的__cdecl调用),弹出如图7所示的对话框。 图7 调用约定不匹配时的运行错误 图8中的那段话实际上已经给出了错误的原因,即“This is usually a result of…”。单击此处下载__stdcall调用例子工程源代码。 2.6、DLL导出变量 DLL定义的全局变量可以被调用进程访问;DLL也可以访问调用进程的全局数据,我们来看看在应用工程中引用DLL中变量的例子(单击此处下载本工程)。 /* 文件名:lib.h*/#ifndef LIB_H#define LIB_Hextern int dllGlobalVar;#endif/* 文件名:lib.cpp */#include "lib.h"#include <windows.h>int dllGlobalVar;BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:dllGlobalVar = 100; //在dll被加载时,赋全局变量为100break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;} ;文件名:lib.def;在DLL中导出变量 LIBRARY "dllTest"EXPORTSdllGlobalVar CONSTANT;或dllGlobalVar DATAGetGlobalVar 从lib.h和lib.cpp中可以看出,全局变量在DLL中的定义和使用方法与一般的程序设计是一样的。若要导出某全局变量,我们需要在.def文件的EXPORTS后添加: 变量名 CONSTANT//过时的方法 或 变量名 DATA //VC++提示的新方法 在主函数中引用DLL中定义的全局变量: #include <stdio.h>#pragma comment(lib,"dllTest.lib")extern int dllGlobalVar;int main(int argc, char *argv[]){printf("%d ", *(int*)dllGlobalVar);*(int*)dllGlobalVar = 1;printf("%d ", *(int*)dllGlobalVar);return 0;} 特别要注意的是用extern int dllGlobalVar声明所导入的并不是DLL中全局变量本身,而是其地址,应用程序必须通过强制指针转换来使用DLL中的全局变量。这一点,从*(int*)dllGlobalVar可以看出。因此在采用这种方式引用DLL全局变量时,千万不要进行这样的赋值操作: dllGlobalVar = 1; 其结果是dllGlobalVar指针的内容发生变化,程序中以后再也引用不到DLL中的全局变量了。 在应用工程中引用DLL中全局变量的一个更好方法是: #include <stdio.h>#pragma comment(lib,"dllTest.lib")extern int _declspec(dllimport) dllGlobalVar; //用_declspec(dllimport)导入int main(int argc, char *argv[]){printf("%d ", dllGlobalVar);dllGlobalVar = 1; //这里就可以直接使用, 无须进行强制指针转换printf("%d ", dllGlobalVar);return 0;} 通过_declspec(dllimport)方式导入的就是DLL中全局变量本身而不再是其地址了,笔者建议在一切可能的情况下都使用这种方式。 2.7、DLL导出类 DLL中定义的类可以在应用工程中使用。 下面的例子里,我们在DLL中定义了point和circle两个类,并在应用工程中引用了它们(单击此处下载本工程)。 //文件名:point.h,point类的声明#ifndef POINT_H#define POINT_H#ifdef DLL_FILEclass _declspec(dllexport) point //导出类point#elseclass _declspec(dllimport) point //导入类point#endif{public:float y;float x;point();point(float x_coordinate, float y_coordinate);};#endif//文件名:point.cpp,point类的实现#ifndef DLL_FILE#define DLL_FILE#endif#include "point.h"//类point的缺省构造函数point::point(){x = 0.0;y = 0.0;}//类point的构造函数point::point(float x_coordinate, float y_coordinate){x = x_coordinate;y = y_coordinate;}//文件名:circle.h,circle类的声明#ifndef CIRCLE_H#define CIRCLE_H#include "point.h" #ifdef DLL_FILEclass _declspec(dllexport)circle //导出类circle#elseclass _declspec(dllimport)circle //导入类circle#endif{public:void SetCentre(const point 本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1697981,如需转载请自行联系原作者
一、RAID 1.1 概述 RAID(Redundant Arrays of Inexpensive Disks)廉价冗余磁盘阵列 通过硬件/软件技术,将多个较小/低速的磁盘整合成一个大磁盘 1.2 分类 1.2.1 raid0 条带模式 至少两块磁盘,将同一个文档分散存放在两个磁盘,提高了存储效率 但是没有可靠性 1.2.2 raid1 镜像模式 至少两块磁盘,同一个文档复制多份,存放在多个磁盘,无存储效率提高 可靠性最高 1.2.3 raid3 RAID3更加适合应用于那些写入操作较少,读取操作较多的应用环境,如数据库和web服务器等。与RAID0相比,RAID3在读写速度方面相对较慢。使用的容错算法和分块大小决定RAID使用的应用场合,在通常情况下,RAID3比较适合大文件类型且安全性要求较高的应用,如视频编辑、硬盘播出机、大型数据库等。 1.2.4 raid5 相当于raid0与raid1的折衷方案 至少三块磁盘,有一块磁盘存放数据的校验值,能够在一块磁盘损坏丢失数据之后通过校验值和部分源数据来推算出丢失的数据 同时只能坏一块磁盘 存储效率有部分提升 也有部分可靠性 1.2.5 raid6 相当于扩展的raid5 至少四块硬盘,至少有两块磁盘存放数据的校验值 同时只能坏两块磁盘 1.2.6 raid01 or raid10 整合raid0、raid1的优势,并行存取提高效率,镜像写入提高可靠性 1.2.7 raid各级别特点对比 对比项 RAID0 RAID1 RAID10 RAID5 RAID6 磁盘数 ≧2 ≧2 ≧4 ≧3 ≧4 存储利用率 100% ≦50% ≦50% n-1/n n-2/n 校验盘 无 无 无 有 有 容错性 无 有 有 有 有 IO性能 高 低 中 较高 较高 二、进程管理 2.1 概念 程序:静态的代码,占用的是硬盘空间,不会耗费CPU,也不会耗费内存空间 进程(PID):动态的代码,占用的是CPU、内存的空间 父进程:为了完成某些功能,需要启动多个子进程。当父进程被杀死的时候,会把自己生成的子进程全部杀死,直到子进程全部杀死之后,父进程才会被杀 子进程:由父进程生成的进程 僵尸进程:要杀死僵尸进程,只杀它本身是没用的,要杀掉它的父进程才行 2.2 pstree 查看进程树。在rhel7里面,systemd是所有进程的父进程 2.2.1 pstree -a 查看进程树,-a表示显示进程调用的的完整命令行 2.2.2 pstree -p 查看进程树,-p表示显示进程的PID 2.3 ps PS (Process Snapshot)进程快照 选项是否有'-'有不同的含义 选项是否大小写有不同的含义 2.3.1 ps aux 列出正在运行的所有进程,进程显示的很详细 a 显示当前终端所有进程 u 以用户格式输出 x 当前用户在所有终端下的进程 2.3.2 ps -elf 列出正在运行的所有进程,对进程的状态,PPID显示的很清楚 -e 显示系统内所有进程 -l 以长格式输出信息 -f 表示文件之间的关系,包括最完整的进程信息 2.4 top 交互式进程管理工具 users load average P 根据%Cpu排名 M 根据%Mem排名 k 杀死指定进程 q 退出top 2.5 pgrep 检索进程 2.5.1 pgrep -l 输出进程名 2.5.2 pgrep -U username 检索指定用户的进程名 2.5.3 pgrep -t 检索指定终端的进程名 2.5.4 pgrep -x 精确匹配指定的进程名 三、控制进程 3.1 ctrl+z 挂起当前进程(暂停并转入后台) 3.2 & 在命令行末尾添加"&"符号,把命令行放到后台运行,不占用当前终端 3.3 jobs -l 查看后台运行的任务情况,-l表示显示PID 3.4 fg 序号 把后台任务恢复到前台运行,缺省序号为最近1个任务 3.5 bg 序号 把前台任务放到后台运行,缺省序号为最近1个任务 expr $RANDOM % 10 产生10以下的随机数 四、杀死进程 4.1 kill [-9] PID 根据PID杀死进程,-9为强制 4.2 killall [-9] 进程名 杀死同名的所有进程,-9为强制 4.3 pkill [-9] -u username 把username的进程全部杀死,-9为强制。即强制踢出用户 五、日志管理 5.1 概述 日志就是系统和程序的“日记本” -记录系统、程序运行中发生的各种事件 -通过查看日志,了解和排除故障 -信息安全控制的“依据” 5.2 rsyslog rhel5使用的是syslog系统服务 rhel6、rhel7都使用了rsyslog系统服务。它统一记录内核及系统日志,主要记录事件发生的时间、主机、进程、内容, 5.2.1常见的系统日志文件如下: 日志文件 主要用途 /var/log/messages 记录内核消息、各种服务的公共消息 /var/log/dmesg 记录系统启动过程的各种消息 /var/log/cron 记录与cron计划任务相关的消息 /var/log/maillog 记录邮件收发相关的消息 /var/log/secure 记录与访问限制相关的安全消息 5.2.2 常见的用户日志文件如下: 日志文件 主要用途 /var/log/lastlog 记录最近的用户登录事件 /var/log/wtmp 记录成功的用户登录/注销事件 /var/log/btmp 记录失败的用户登录事件 /var/log/utmp 记录当前登录的每个用户的相关信息 用户日志文件无法通过cat来查看,需要通过专用分析工具 5.3 日志查看命令 5.3.1 tailf 与tail -f等价,可以实时跟踪日志消息 5.3.2 users 显示正在登录的用户 5.3.3 who 显示正在登录的用户、登录时间、登录IP、终端类型 pts:伪字符终端 tty:纯字符终端 5.3.4 w 显示最详细,除了who出来的信息,还有CPU、空闲时间、正在使用的命令等 5.3.5 last 最近登录成功的用户信息,-n表示显示n条 5.3.6 lastb -n 最近登录失败的用户信息,-n表示显示n条 5.3.7 第三方日志分析工具 AWStats ELK Webalizer Webadmin系统管理套件 5.4 日志消息的优先级 级别 字段 含义 0 KERN_EMERG system is unusable 1 KERN_ALERT action must be taken immediately 2 KERN_CRIT critical conditions 3 KERN_ERR error conditions 4 KERN_WARNING warning conditions 5 KERN_NOTICE normal but significant condition 6 KERN_INFO informational 7 KERN_DEBUG debug-level messages 5.5 journalctl工具 rhel7才有的工具,提取由systemd-journal服务搜集的日志,主要包括内核/系统日志、服务日志 5.5.1 journalctl -u 服务名 [-p 优先级] 查看指定服务相关的日志消息 5.5.2 journalctl -n 消息条数 查看n条日志消息 5.5.3 journalctl --since="yyyy-mm-dd HH:MM:SS" --until="yyyy-mm-dd HH:MM:SS" 根据时间段查看日志消息 六、systemd介绍 6.1 init程序的作用 Linux系统和服务管理器,是内核引导之后加载的第一个初始化进程(PID=1),负责掌控整个linux的的运行/资源组合 rhel7:systemd rhel6:upstart,事件触发 rhel5:system v,顺序加载 6.2 systemd 一个更高效的系统和服务管理器,开机服务并行启动,各系统服务之间精确依赖 6.2.1 /etc/systemd/system systemd的配置目录 6.2.2 /lib/systemd/system systemd的服务目录 6.3 systemctl介绍 systemd的管理工具 6.3.1 unit配置单元分类 service:后台独立服务 target:一套配置单元的组合,类似传统“运行级别” socket:套接字,类似于xinetd管理的临时任务 device:对应udev规则标记的某个设备 mount、automount:挂载点、触发挂载点 6.3.2 systemctl -t target --all multi-user.target 字符模式 graphical.target 图形模式 6.3.3 systemctl get-defult 查询开机所处的运行模式 6.3.4 systemctl set default graphical.target 设置开机所处的运行级别为图形模式。实质就是为/usr/lib/systemd/system/graphical.target创建软链接,名字为/etc/systemd/system/default.target 6.3.5 systemctl isolate graphical.target 临时切换到指定运行模式 6.3.6 systemctl list-unit-files [-t service|target] 列出已定义的配置文件及自启状态 6.3.7 systemctl start|stop|restart 服务名称 启动、停止和重启服务 6.3.8 systemctl status|is-active 服务名称 查看服务状态 6.3.9 systemctl enable|is-enabled 服务名称 设置服务开机自启动 七、实体机添加虚拟网卡 7.1 /etc/libvirt/qemu/networks/ 实体机的虚拟网卡配置文件路径 7.2 添加虚拟网卡 virt-manager 选择虚拟机,点“连接详情”,创建新的虚拟网络,禁用DHCP、隔离的虚拟网络 本文转自 goldwinner 51CTO博客,原文链接:http://blog.51cto.com/355665/2068785,如需转载请自行联系原作者
Mongodb的默认端口号27017 _id是全局唯一值,不要去给这个列赋值,默认是唯一的,如果赋值,列入有两列的_id:2,则会报冲突不能插入 [root@HE4 ~]# tar xvf mongodb-linux-x86_64-2.6.10.tgz [root@HE4 ~]# mkdir -p /export/mongodb [root@HE4 ~]# mkdir -p /export/mongodb/bin [root@HE4 ~]# mkdir -p /export/mongodb/conf [root@HE4 ~]# mkdir -p /export/mongodb/log [root@HE4~]# mkdir -p /export/mongodb/data [root@HE4bin]# cd /root/mongodb-linux-x86_64-2.6.10/bin [root@HE4bin]# cp /root/mongodb-linux-x86_64-2.6.10/bin/* /export/mongodb/bin/ [root@HE4conf]# vi /export/mongodb/conf/mongod.conf [root@HE4conf]# cat mongod.conf port=27408 dbpath=/export/mongodb/data logpath=/export/mongodb/log/mongod.log fork=true [root@HE4bin]# cd /export/mongodb/bin [root@HE4bin]# ./mongod -f /export/mongodb/conf/mongod.conf [root@HE4bin]# ./mongo --port 20011 > > > showdbs; admin (empty) local 0.078GB > useadmin; switchedto db admin >db.shutdownServer() [root@HE4bin]# netstat -anlp|grep mongod [root@HE4bin]# ./mongo --port 20011 > usehelei; switchedto db helei >db.t1.insert({id:1}) WriteResult({"nInserted" : 1 }) >db.t1.insert({id:2}); WriteResult({"nInserted" : 1 }) >db.t1.find() {"_id" : ObjectId("57033a5eade0255b255b4e22"),"id" : 1 } {"_id" : ObjectId("57033a6bade0255b255b4e23"),"id" : 2 } 本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1958242,如需转载请自行联系原作者
编译安装php5.6.2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 1. 前期准备工作 # mkdir /home/download && cd /home/download # yum install gcc pcre pcre-devel gcc-c++ autoconf libxml2 libxml2-devel zlib zlib-devel glibc libjpeg libjpeg-devel libpng libpng-devel glibc-devel glib2 glib2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel openssl openssl-devel openldap openldap-devel openldap-clients openldap-servers freetype freetype-devel mhash-devel libmcrypt-devel 【libiconv】 下载LIBICONV 1.14 并安装 Libiconv URL: http://ftp.gnu.org/pub/gnu/libiconv/ # wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz && tar zxvf libiconv-1.14.tar.gz && cd libiconv-1.14 && ./configure --prefix=/usr/local && make && make install # ln -s /usr/local/lib/libiconv.* /usr/lib/ # ldconfig # cd .. 2. 编译安装php # wget http://php.net/get/php-5.6.2.tar.gz/from/this/mirror -O php-5.6.2.tar.gz && tar zxvf php-5.6.2.tar.gz && cd php-5.6.2 # ./configure --prefix=/usr/local/php \ --with-config-file-path=/usr/local/php/etc \ --with-pdo-sqlite \ --with-mysql=mysqlnd \ --with-mysqli=mysqlnd \ --with-pdo-mysql=mysqlnd \ --with-mysql-sock \ --with-mcrypt \ --with-mhash \ --with-iconv-dir=/usr/local \ --with-gd \ --with-gettext \ --with-freetype-dir \ --with-jpeg-dir \ --with-png-dir \ --with-libxml-dir=/usr \ --with-curl \ --with-xmlrpc \ --with-zlib \ --with-pear \ --with-openssl \ --with-libdir \ --with-kerberos \ --enable-cgi \ --enable-fpm \ --enable-pdo \ --enable-opcache \ --enable-mbstring \ --enable-gd-native-ttf \ --enable-xml \ --enable-exif \ --enable-zip \ --enable-soap \ --enable-sockets \ --enable-sysvmsg \ --enable-sysvsem \ --enable-sysvshm \ --enable-shmop \ --enable-json \ --enable-bcmath \ --enable-calendar \ --enable-ftp \ --enable-inline-optimization \ --enable-pcntl \ --enable-mbregex \ --disable-rpath # cp -a ext/phar/phar.php ext/phar/phar.phar # make ZEND_EXTRA_LIBS='-liconv' # make install # cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # chmod +x /etc/init.d/php-fpm # chkconfig php-fpm on # ln -s /usr/local/php/bin/* /usr/bin/ # ln -s /usr/local/php/etc/php.ini /etc/ # php -v PHP 5.6.2 (cli) (built: Apr 7 2015 10:53:08) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.6.0, Copyright (c) 1998-2014 Zend Technologies # cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf # cp php.ini-production /usr/local/php/etc/php.ini # cd .. 3. php模块和对应的服务的安装 增加php模块: memcache: libmemcached-devel imagick: ImageMagick-devel gearman: libgearman-devel sphinx: libsphinxclient-devel redis: hiredis-devel 1)使用pecl安装模块: 【memcache】 # yum install libmemcached-devel # pecl install memcache 【imagick】 # yum install ImageMagick-devel # pecl install imagick 【gearman】 # yum install libgearman-devel # pecl install gearman 【sphinx】 # yum install libsphinxclient-devel # pecl install sphinx 【redis】 # yum install hiredis-devel # pecl install redis 2)服务安装和启动: # yum install memcached # memcached -d -m 512 -l localhost -u root # yum install gearmand # gearmand -L 127.0.0.1 -d 4. 配置文件 【php.ini】 # vim /usr/local/php/etc/php.ini expose_php = Off max_execution_time = 300 max_input_time = 600 post_max_size = 100M date.timezone = Asia/Shanghai 增加到文件末尾: extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/" extension = "memcache.so" extension = "imagick.so" extension = "gearman.so" extension = "sphinx.so" extension = "redis.so" zend_extension = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/opcache.so" opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.save_comments=0 opcache.fast_shutdown=1 更新配置文件后要reload一下 # service php-fpm reload 【php-fpm.conf】 # vim /usr/local/php/etc/php-fpm.conf user = www group = www # service php-fpm start 本文转自 pcnk 51CTO博客,原文链接:http://blog.51cto.com/nosmoking/1629891,如需转载请自行联系原作者
通过一个备份归档的脚本演示rsync限速和find如何删除文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #!/bin/bash # # 2015/04/15 src='mysqlbak' ip='192.168.1.20' dest='/data/backup/mysql/3306/test20' f_log='/data/backup/mysql/log/bak_mysql_3306_test20.log' [ -d $dest ] || mkdir -p $dest echo "[`date +%F_%T`] rsync mysql slave tar backup file from test20 and remove old one:" >${f_log} rsync -avzP --bwlimit=50000 ${ip}::${src}/gz ${dest} >>${f_log} 2>&1 rsync -avzP --bwlimit=50000 ${ip}::${src}/log ${dest} >>${f_log} 2>&1 echo "[`date +%F_%T`] finished! 10s later, delete files over 30 days:" >>${f_log} sleep 10s find /data/backup/mysql/3306/test20/gz -maxdepth 1 -type f -name "*.tar.gz" -mtime +30 -print >>${f_log} 2>&1 find /data/backup/mysql/3306/test20/gz -maxdepth 1 -type f -name "*.tar.gz" -mtime +30 -delete >>${f_log} 2>&1 find /data/backup/mysql/3306/test20/log -maxdepth 1 -type f -name "*.log" -mtime +30 -print >>${f_log} 2>&1 find /data/backup/mysql/3306/test20/log -maxdepth 1 -type f -name "*.log" -mtime +30 -delete >>${f_log} 2>&1 其中test20上的rsyncd.conf的配置如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [Jack@test20 ~]$ cat /etc/rsyncd.conf uid = nobody gid = nobody use chroot = no max connections = 50 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [mysqlbak] path = /data/backup/mysql/3306 read only = yes list = no hosts allow = 192.168.1.250 hosts deny = * uid = root gid = root 本文转自 pcnk 51CTO博客,原文链接:http://blog.51cto.com/nosmoking/1632845,如需转载请自行联系原作者
@echo off & title 本程序获取用户输入并作相应处理 time /t :hui echo 键入相应的值看程序输出? color 2f rem "echo."表示换行 echo. set /p AA=请键入y(喜欢)或n(不喜欢)并按回车(y/n): if /i "%AA%"=="y" goto shi if /i "%AA%"=="n" goto bu rem "cls"表示清除屏幕 cls color df echo 您放弃了键入或键入有错误。。。 pause goto hui :shi cls color 4f echo 您键入的是y echo 感谢您的支持与信任! echo. pause exit :bu cls color 1f echo 您键入的是n echo 请您多提宝贵意见! echo. pause 本文转自 韬光星夜 51CTO博客,原文链接:http://blog.51cto.com/xfqxj/1074040,如需转载请自行联系原作者
MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异: 逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现。物理备份的特点是:拷贝相关数据文件。 这二种备份差异 :逻辑备份其备份、还原慢,但备份文件占用的空间小;物理备份其备份还原快,备份文件占用空间大。 到底选择那种备份方式,具体根据自己的实际情况,如需要的是热备还是冷备?数据量大不大?磁盘空间够不够等因素决定。 逻辑备份工具主要有:mysqldump、mysqlpump、mydumper,物理备份工具主要有:xtrabackup。 现在使用最多的备份就是mysqldump、xtrabackup(都支持支持热备),本文就mysqldump(mysqlpump)和xtrabackup的原理进行下大致的说明。 逻辑备份:mysqldump,第三方备份工具mydumper的备份原理看MySQL备份mydumper的原理 1)参数说明,具体的参数可以用mysqldump --help查看。 在说明mysqldump之前先了解下它的相关参数,可以通过mysqldump --help进行查看,也可以通过mysqldump、mysqlpump备份工具说明和mysqldump的流程进行了解。这里再重申一下几个比较重要的参数。 ①:--single-transaction 通过将导出操作封装在一个事务(Repeatable Read)内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作;其他引擎不能保证导出是一致的。当导出开启了–single-transaction选项时,要确保导出文件有效(正确的表数据和二进制日志位置),就要保证没有其他连接会执行如下语句:ALTER TABLE, DROP TABLE, RENAME TABLE, TRUNCATE TABLE,这会导致一致性快照失效。这个选项开启后会自动关闭lock-tables。并且在mysql5.7.11之前,--default-parallelism大于1的时候和此参也互斥,必须使用--default-parallelism=0。5.7.11之后解决了--single-transaction和--default-parallelism的互斥问题。 ②:--master-data 这个选项可以把binlog的位置和文件名添加到输出中,如果等于1,将会打印成一个CHANGE MASTER命令;如果等于2,会加上注释前缀。并且这个选项会自动打开–lock-all-tables,除非同时设置了–single-transaction(这种情况下,全局读锁只会在开始dump的时候加上一小段时间,不要忘了阅读–single-transaction的部分)。在任何情况下,所有日志中的操作都会发生在导出的准确时刻。这个选项会自动关闭–lock-tables。打开该参数需要有reload权限,并且服务器开启binlog。 ③:--lock-all-tables ,-x 锁定所有库中所有的表。这是通过在整个dump的过程中持有全局读锁来实现的。会自动关闭–single-transaction 和 –lock-tables。 ④:--lock-tables,-l 备份某个库就锁该库的所有表,用READ LOCAL来锁表。MyISAM允许并发写入,因为锁表只针对指定的数据库,不能保证物理上的一致性,不同库的表备份完成时会有不同的状态。用–skip-lock-tables来关闭。 ⑤:--flush-logs,-F 在开始导出前刷新服务器的日志文件。注意,如果你一次性导出很多数据库(使用--databases= 或--all-databases 选项),导出每个库时都会触发日志刷新。例外是当使用了--lock-all-tables、--master-data或--single-transaction时:日志只会被刷新一次,那个时候所有表都会被锁住。所以如果你希望你的导出和日志刷新发生在同一个确定的时刻,你需要使用--lock-all-tables、--master-data和--single-transaction配合 –flush-logs。 ⑥:--opt 该参数默认开启,表示快递启动--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset选项,通过 --skip-opt 关闭。 2)执行说明 ①:逻辑备份就是导出SQL形式的文件,其的具体实现步骤可以直接打开genaral_log。 general_log_file = /var/log/mysql/mysql.log general_log = 1 ②:备份需要保证数据库的一致性,即在某一时刻,整个数据库的状态是一致的,这样可以通过备份进行恢复成为另一个从库。数据库目前使用最多的存储引擎是InnoDB,也有可能部分是MyISAM,建议把MyISAM存储引起改成InnoDB。现在重点说明关于InnoDB的备份。 MyISAM表的备份选项:上面提过因为mysqldump默认开启--opt选项,而--opt里包含--lock-tables的选项,这个选项不能保证在多个数据库下数据备份的一致性,所以要么--skip-opt,再把需要的选项添加进去,要么就再使用--lock-all-tables的选项(开启之后会关闭--lock-tables的选项),要是在从库备份则只需要添加--master-data选项(开启之后自动打开--lock-all-tables选项)即可。 备份myisam表的命令: mysqldump -uroot -p123 --default-character-set=utf8 --master-data=1 -R -E --triggers -B dba_test dba_test2 > /home/dxy/dba_test.sql 因为开启了--lock-all-tables选项(--master-data),保证一致性读和数据的一致性。在备份开始时就会执行FLUSH TABLES WITH READ LOCK命令,这个命令是server层面的锁,这样后面任何存储引擎执行DML、DDL语句都会 Waiting for global read lock状态,这样就保证了从备份点之后数据的一致性。 InnoDB表的备份选项:和上面介绍MyISAM表的备份选项一样,在此基础上增加了--single-transaction的选项,这个选项保证了通过将导出操作封装在一个事务(Repeatable Read)内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作,其他引擎不能保证导出是一致的。这个选项开启后会自动关闭--lock-tables选项,而--master-data选项自动打开–lock-all-tables选项,在设置了--single-transaction这种情况下,全局读锁只会在开始dump的时候加上一小段时间(5.7之前),5.7之后不需要加锁了。 一致性快照,即一致性读取,那是如何保证一致性读的呢?具体的说明可以看MySQL 一致性读 深入研究这篇文章。大致的说明可以看下面的测试说明: 测试1: sesseion A session B mysql> set tx_isolation='repeatable-read'; Query OK, 0 rows affected (0.00 sec) mysql> set tx_isolation='repeatable-read'; Query OK, 0 rows affected (0.00 sec) mysql> begin; Query OK, 0 rows affected (0.01 sec) mysql> select * from t1; Empty set (0.00 sec) mysql> insert into t1(c1,c2) values(1,1); Query OK, 1 row affected (0.01 sec) mysql> select * from t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | +----+------+ 1 row in set (0.00 sec) 结论1:RR隔离级别下的一致性读,不是以begin开始的时间点作为snapshot建立时间点,因为测试看出再begin一个事务的时候,表是没有数据的,sessionB写入数据之后,却能看到数据。 测试2: session A session B mysql> set tx_isolation='repeatable-read'; mysql> set tx_isolation='repeatable-read'; mysql> select * from t1; Empty set (0.00 sec) mysql> begin; mysql> select * from t; mysql> insert into t1(c1,c2) values(1,1); Query OK, 1 row affected (0.01 sec) mysql> select * from t1; Empty set (0.00 sec) 结论2:RR隔离级别下的一致性读,是以第一条select语句的执行点作为snapshot建立的时间点的,即使是不同表的select语句。这里因为session A在insert之前对 t 表执行了select,所以建立了snapshot,所以后面的select * from t1 不能读取到insert的插入的值(snapshot的时候t1表没有数据)。 测试3: session A session B mysql> set tx_isolation='repeatable-read'; mysql> set tx_isolation='repeatable-read'; mysql> select * from t1; Empty set (0.00 sec) mysql> begin; mysql> select * from t1; Empty set (0.00 sec) mysql> select * from t1; Empty set (0.00 sec) mysql> insert into t1(c1,c2) values(1,1); mysql> select * from t1; Empty set (0.01 sec) 结论3:session A 的第一条语句,发生在session B的 insert语句提交之前,所以session A中的第二条select还是不能读取到数据。因为RR中的一致性读是以事务中第一个select语句执行的时间点作为snapshot建立的时间点的。而此时,session B的insert语句还没有执行,所以读取不到数据。 测试4: session A session B mysql> set tx_isolation='repeatable-read'; mysql> set tx_isolation='repeatable-read'; mysql> select * from t1; Empty set (0.00 sec) mysql> select * from t1; Empty set (0.00 sec) mysql> insert into t1(c1,c2) values(1,1),(2,2); mysql> select * from t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | | 2 | 2 | +----+------+ 2 rows in set (0.01 sec) mysql> select * from t1; Empty set (0.00 sec) mysql> update t1 set c2=100 where c1=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 100 | +----+------+ 1 row in set (0.00 sec) 结论4:本事务中进行修改的数据,即使没有提交,在本事务中的后面也可以读取到。update 语句因为进行的是“当前读”,所以它可以修改成功。 通过上面的几个测试得出的结论:对同一个表或者不同表进行的第一次select语句建立了该事务中一致性读的snapshot,在snapshot建立之后提交的数据,一致性读就读不到,之前提交的数据就可以读到。事务一致性读的起始点其实是以执行的第一条语句为起始点的,而不是以begin作为事务的起始点的。 一般begin/start transaction是开始一个事务的标志,但不是事务开始的时间点,也就是说执行了start transaction之后的第一个语句(任何语句),事务才真正的开始。但是如果要达到将 start transaction作为事务开始的时间点,那么必须使用: START TRANSACTION WITH consistent snapshot ###mysqldump中的快照就是用这个实现的 这样开启事务效果等价于: start transaction 之后,马上执行一条 select 语句(此时会建立一致性读的snapshot)。 测试5: session A session B mysql> set tx_isolation='repeatable-read'; mysql> set tx_isolation='repeatable-read'; mysql> select * from t1; Empty set (0.01 sec) mysql> start transaction; mysql> insert into t1(c1,c2) values(1,1); mysql> select * from t1; +----+------+ | c1 | c2 | +----+------+ | 1 | 1 | +----+------+ 1 row in set (0.00 sec) 测试6: mysql> set tx_isolation='repeatable-read'; mysql> set tx_isolation='repeatable-read'; mysql> select * from t1; Empty set (0.01 sec) mysql> start transaction with consistent snapshot; mysql> insert into t1(c1,c2) values(1,1); mysql> select * from t1; Empty set (0.00 sec) 上面测试说明了 start transaction 和 start tansaction with consistent snapshot的区别。测试5说明,start transaction执行之后,一致性读并没有开始,所以可以读到session B插入的值。测试6说明,start transaction with consistent snapshot已经开始了一致性快照,所以insert语句发生在事务开始之后,所以读不到insert的数据。 所以事务一致性快照开始时间点,分为两种情况: 1)START TRANSACTION时,第一条语句的执行时间点,就是事务开始的时间点,第一条select语句建立一致性读的snapshot; 2)START TRANSACTION WITH consistent snapshot时,则是立即建立本事务的一致性读snapshot,当然也开始事务了; 到此,大致说明了参数single-transaction的意义,其实就是通过start transaction with consistent snapshot实现一致性快照读:通过将导出操作封装在一个事务内来使得导出的数据是一个一致性快照。只有当表使用支持MVCC的存储引擎(目前只有InnoDB)时才可以工作,其他引擎(MyISAM)不能保证导出是一致的。如备份开启之后,通过一致性快照记录了mysql的binlog和position,此时往innodb表里写入数据,因为有一致性快照,备份读不到最新的记录,但是该操作会在之前记录binlog之后位置里记录,当还原的时候,直接应用之后的binlog记录即可。而myisam不支持事务,没有快照,备份直接取最新数据,而写入操作会持续记录到binlog里,所以还原的时候会导致一致性被破环。当还原到一个新从并开启同步的change(备份里面记录的点)之后,myisam表会出现主键冲突,而innodb表不会。 备份InnoDB表的命令: mysqldump -uroot -p123 --default-character-set=utf8 --single-transaction --master-data=1 -R -E --triggers -B dba_test dba_test2 > /home/dxy/dba_test.sql 上面讲了这么多,现在通过general_log看看mysqlbinlog备份步骤: 2016-08-21T00:08:11.755486+08:00 15 Connect root@localhost on using Socket ##备份的连接方式2016-08-21T00:08:11.793153+08:00 15 Query /*!40100 SET @@SQL_MODE='' */ ##备份的SQL_MODE2016-08-21T00:08:11.815880+08:00 15 Query /*!40103 SET TIME_ZONE='+00:00' */ ##备份的时区,--tz-utc,用--skip-tz-utc关闭##2016-08-21T00:08:11.815880+08:00 15 Query FLUSH /*!40101 LOCAL */ TABLES ##刷新表,5.6之前有,5.7没有##2016-08-21T00:08:11.815880+08:00 15 Query FLUSH TABLES WITH READ LOCK ##加全局读锁,--lock-all-tables的作用。5.6之前有,5.7没有。5.7的mysqldump加了--single-transaction不需要锁表了?2016-08-21T00:08:11.815981+08:00 15 Query SHOW STATUS LIKE 'binlog_snapshot_%' ##binlog的文件名和偏移量,--master-data的作用,5.6之前是用SHOW MASTER STATUS表示2016-08-21T00:08:11.822342+08:00 15 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ##--single-transaction的作用,设置成RR级别2016-08-21T00:08:11.822457+08:00 15 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */ ##--single-transaction的作用,设置成一致性快照读2016-08-21T00:08:11.822675+08:00 15 Query SHOW VARIABLES LIKE 'gtid\_mode'2016-08-21T00:08:11.868728+08:00 15 Query SHOW STATUS LIKE 'binlog_snapshot_%' ##binlog的文件名和偏移量,--master-data的作用,5.6之前是用SHOW MASTER STATUS表示2016-08-21T00:08:11.868940+08:00 15 Query UNLOCK TABLES ##解锁表,印证了全局读锁只会在开始dump的时候加上一小段时间(5.7之前),5.7之后不需要加锁了#上面黄色背景表示备份前的一些准备工作:一致性快照、锁、二进制日志等信息。 2016-08-21T00:08:11.900984+08:00 15 Query SELECT LOGFILE_GROUP_NAME, FILE_NAME, TOTAL_EXTENTS, INITIAL_SIZE, ENGINE, EXTRA FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'UNDO LOG' AND FILE_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IS NOT NULL AND LOGFILE_GROUP_NAME IN (SELECT DISTINCT LOGFILE_GROUP_NAME FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dba_test','dba_test2'))) GROUP BY LOGFILE_GROUP_NAME, FILE_NAME, ENGINE, TOTAL_EXTENTS, INITIAL_SIZE, EXTRA ORDER BY LOGFILE_GROUP_NAME2016-08-21T00:08:12.000013+08:00 15 Query SELECT DISTINCT TABLESPACE_NAME, FILE_NAME, LOGFILE_GROUP_NAME, EXTENT_SIZE, INITIAL_SIZE, ENGINE FROM INFORMATION_SCHEMA.FILES WHERE FILE_TYPE = 'DATAFILE' AND TABLESPACE_NAME IN (SELECT DISTINCT TABLESPACE_NAME FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA IN ('dba_test','dba_test2')) ORDER BY TABLESPACE_NAME, LOGFILE_GROUP_NAME2016-08-21T00:08:12.000954+08:00 15 Query SHOW VARIABLES LIKE 'ndbinfo\_version'2016-08-21T00:08:12.001309+08:00 15 Init DB dba_test2016-08-21T00:08:12.001387+08:00 15 Query SHOW CREATE DATABASE IF NOT EXISTS `dba_test`2016-08-21T00:08:12.001505+08:00 15 Query SAVEPOINT sp ##--single-transaction的作用2016-08-21T00:08:12.001564+08:00 15 Query show tables2016-08-21T00:08:12.001645+08:00 15 Query show table status like 'abc'2016-08-21T00:08:12.001747+08:00 15 Query SET SQL_QUOTE_SHOW_CREATE=12016-08-21T00:08:12.001772+08:00 15 Query SET SESSION character_set_results = 'binary'2016-08-21T00:08:12.001799+08:00 15 Query show create table `abc`2016-08-21T00:08:12.001835+08:00 15 Query SET SESSION character_set_results = 'utf8'2016-08-21T00:08:12.001864+08:00 15 Query show fields from `abc`2016-08-21T00:08:12.002013+08:00 15 Query show fields from `abc`2016-08-21T00:08:12.002150+08:00 15 Query SELECT /*!40001 SQL_NO_CACHE */ * FROM `abc` ##表示备份表的语句2016-08-21T00:08:12.021228+08:00 15 Query SET SESSION character_set_results = 'binary' #上面蓝色背景表示备份一张表的过程2016-08-21T00:08:12.021499+08:00 15 Query use `dba_test`2016-08-21T00:08:12.021549+08:00 15 Query select @@collation_database2016-08-21T00:08:12.021616+08:00 15 Query SHOW TRIGGERS LIKE 'abc' ##备份触发器,--triggers2016-08-21T00:08:12.039445+08:00 15 Query SET SESSION character_set_results = 'utf8'2016-08-21T00:08:12.039561+08:00 15 Query ROLLBACK TO SAVEPOINT sp ... ...2016-08-21T00:23:35.131333+08:00 16 Query show events ##备份事件,-E2016-08-21T00:23:35.161440+08:00 16 Query use `dba_test`2016-08-21T00:23:35.161513+08:00 16 Query select @@collation_database2016-08-21T00:23:35.161582+08:00 16 Query SET SESSION character_set_results = 'binary'2016-08-21T00:23:35.161795+08:00 16 Query SHOW FUNCTION STATUS WHERE Db = 'dba_test' ##备份函数,-R2016-08-21T00:23:35.190912+08:00 16 Query SHOW PROCEDURE STATUS WHERE Db = 'dba_test' ##备份存储过程,-R2016-08-21T00:23:35.191683+08:00 16 Query SET SESSION character_set_results = 'utf8'2016-08-21T00:23:35.191683+08:00 16 Quit ##备份完成退出 3)实现过程 通过2)里的general_log的这些步骤,可以看到mysqldump的大致实现过程是:连接 -> 初始化信息 -> 刷新表(锁表)-> 记录偏移量 -> 开启事务(一致性快照)-> 记录偏移量 -> 解锁表,因为开启了一致性读,可以得到innodb的一致性,又因为解锁表了,MyISAM表一致性得不到保证,所以尽量别使用MyISAM表。 本文转自 sshpp 51CTO博客,原文链接:http://blog.51cto.com/12902932/1927046,如需转载请自行联系原作者
今天介绍一下关于logstash的启动方式,以前说的都是使用/usr/local/logstash -f /etc/logstash.conf方式启动,这样就有一个麻烦,当你关闭终端,或者ctrl+c时logstash就会退出。下面介绍几种长期运行的方式。 1、service方式 使用rpm方式安装的,都可以/etc/init.d/logstash启动,编译安装的就需要你自己写启动脚本 2、nohup方式 这是最简单的,对于新手来说 nohup /usr/local/logstash/bin/logstash -f /etc/logstash/logstash.conf -w 10 -l /var/log/logstash/logstash.log & 3、优雅的 SCREEN 方式 这里使用了screen的一款软件,运行screen,是一个和shell一模一样的终端,启动之后使用ctrl+a+d退出来,进程仍然在运行。 创建独立的 screen 命令如下: screen -dmS elk 接管连入创建的 elk 命令如下: screen -r elk 启动程序:/usr/local/logstash/bin/logstash -f /etc/logstash/logstash.conf ctrl+a+d退出,ps看一下,logstash仍然在运行 4、最推荐的 daemontools 方式 daemontools是一个软件名称,不过配置略复杂。所以这里我是使用python实现的supervisord方式: 首先安装: yum install python-setuptools easy_install supervisor 生成配置文件(supervisord.conf): echo_supervisord_conf > /etc/supervisord.conf 在supervisord.conf最后增加: [program:elkpro_1] environment=LS_HEAP_SIZE=5000m directory=/usr/local/logstash command=/usr/local/logstash/bin/logstash -f /etc/logstash/conf.d/pro1.conf -w 10 -l /var/log/logstash/pro1.log 注意:经过测试,这里logstash配置文件必须在conf.d/目录下。 然后启动 supervisord -c /etc/supervisord.conf 即可。 解释: logstash 会以 supervisord 子进程的身份运行,你还可以使用supervisorctl命令,单独控制一系列 logstash 子进程中某一个进程的启停操作: supervisorctl start elkpro_1(支持start、stop、restart) 这里还有一点要注意,当你修改了supervisord.conf后,需要使用supervisorctl reload重新加载配置文件。 本文转自 sykmiao 51CTO博客,原文链接:http://blog.51cto.com/syklinux/1866750,如需转载请自行联系原作者
1 2 3 4 5 6 7 8 9 import pandas as pd from pandas_datareader import data import datetime start = datetime.datetime(2016,1,1) end = datetime.date.today() apple = data.DataReader("AAPL", "yahoo", start, end) #type(apple) apple.head() Date Open High Low Close Adj Close Volume 2016-01-04 102.610001 105.370003 102.000000 105.349998 101.790649 67649400 2016-01-05 105.750000 105.849998 102.410004 102.709999 99.239845 55791000 2016-01-06 100.559998 102.370003 99.870003 100.699997 97.297760 68457400 2016-01-07 98.680000 100.129997 96.430000 96.449997 93.191338 81094400 2016-01-08 98.550003 99.110001 96.760002 96.959999 93.684120 70798000 本文转自 326647452 51CTO博客,原文链接:http://blog.51cto.com/svsky/1956586,如需转载请自行联系原作者
配置linux syslog日志服务器 原文地址 http://www.linuxfly.org/post/170/ 感谢作者 目前,linux依旧使用syslogd作为日志监控进程,而在主流的linux发行版中依旧使用sysklog这个比较老的日志服务器套件。从前一篇日志可以看到,对其进行必要的配置能减少很多麻烦,并且可更有效的从系统日志监控到系统的状态。理解并完善一个syslog的配置,对于系统管理员来说显得尤为重要。一、配置文件 以红旗DC Server 5.0为例,默认的日志服务器就是sysklog套件: 引用 # rpm -qa|grep sysklogd sysklogd-1.4.1-26_EL 其主要的配置文件有两个: 引用 /etc/sysconfig/syslog 这里定义syslog服务启动时可加入的参数。 引用 /etc/syslog.conf 这个是syslog服务的主要配置文件,根据定义的规则导向日志信息。二、设置主配置文件 /etc/syslog.conf根据如下的格式定义规则: 引用 facility.level action 设备.优先级 动作 facility.level 字段也被称为seletor(选择条件),选择条件和动作之间用空格或tab分割开。 #号开头的是注释,空白行会自动跳过。1、facility facility定义日志消息的范围,其可使用的key有: 引用 auth -由 pam_pwdb 报告的认证活动。 authpriv -包括特权信息如用户名在内的认证活动 cron -与 cron 和 at 有关的计划任务信息。 daemon -与 inetd 守护进程有关的后台进程信息。 kern -内核信息,首先通过 klogd 传递。 lpr -与打印服务有关的信息。 mail -与电子邮件有关的信息 mark - syslog内部功能用于生成时间戳 news -来自新闻服务器的信息 syslog -由 syslog 生成的信息 user -由用户程序生成的信息 uucp -由 uucp 生成的信息 local0-local7 -与自定义程序使用 * 通配符代表除了 mark 以外的所有功能 除mark为内部使用外,还有security为一个旧的key定义,等同于auth,已经不再建议使用。2、level级别 level定义消息的紧急程度。按严重程度由高到低顺序排列为: 引用 emerg -该系统不可用,等同panic alert -需要立即被修改的条件 crit -阻止某些工具或子系统功能实现的错误条件 err -阻止工具或某些子系统部分功能实现的错误条件,等同error warning -预警信息,等同warn notice -具有重要性的普通条件 info -提供信息的消息 debug -不包含函数条件或问题的其他信息 none -没有重要级,通常用于排错 * 所有级别,除了none 其中,panic、error、warn均为旧的标识符,不再建议使用。在定义level级别的时候,需要注意两点: 引用 1)优先级是由应用程序在编程的时候已经决定的,除非修改源码再编译,否则不能改变消息的优先级; 2)低的优先级包含高优先级,例如,为某个应用程序定义info的日志导向,则涵盖notice、warning、err、crit、alert、emerg等消息。(除非使用=号定义) 3、selector选择条件 通过小数点符号“.”把facility和level连接在一起则成为selector(选择条件)。 可以使用分号“;”同时定义多个选择条件。也支持三个修饰符: 引用 * - 所有日志信息 = - 等于,即仅包含本优先级的日志信息 ! - 不等于,本优先级日志信息除外 4、action动作 由前面选择条件定义的日志信息,可执行下面的动作: 引用 file-指定日志文件的绝对路径,默认为直接写入磁盘文件;但可以在路径前加上“减号” ,表示先放到缓存中,达到一定数量后再写入磁盘,这样能提高性能;但若期间机器出现问题,这些日志数据可能会丢失;因此,只建议用于日志数量大,但非必要的日志文件中,例如mail 等。 terminal 或 print -发送到串行或并行设备标志符,例如/dev/ttyS2 @host -远程的日志服务器 username -发送信息本机的指定用户信息窗口中,但该用户必须已经登陆到系统中 named pipe -发送到预先使用 mkfifo 命令来创建的 FIFO 文件的绝对路径 ※注意,不能通过“|/var/xxx.sh”方式导向日志到其他脚本中处理。5、举例 例如: 引用 *.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages #把除邮件、新闻组、授权信息、计划任务等外的所有通知性消息都写入messages文件中。 mail,news.=info -/var/adm/info #把邮件、新闻组中仅通知性消息写入info文件,其他信息不写入;并且先放到缓存中,累积到一定程度后再写入文件。 mail.*;mail.!=info /var/adm/mail #把邮件的除通知性消息外都写入mail文件中,。 mail.=info /dev/tty12 #仅把邮件的通知性消息发送到tty12终端设备 *.alert root,joey #如果root和joey用户已经登陆到系统,则把所有紧急信息通知他们 *.* @finlandia #把所有信息都导向到finlandia主机(通过/etc/hosts或dns解析其IP地址) ※注意:每条消息均会经过所有规则的,并不是唯一匹配的。 也就是说,假设mail.=info信息通过上面范例中定义的规则时,/var/adm/info、/var/adm/mail、/dev/tty12,甚至finalandia主机都会收到相同的信息。这样看上去比较烦琐,但可以带来的好处就是保证了信息的完整性,可供不同地方进行分析。6、测试 部分情况下,上述规的实际执行结果和定义的预想结果可能会有出入。这时,可使用logger程序辅助测试: # logger -p user.notice 'Hello World!' 日志显示: 引用 Nov 12 13:40:04 dc5test root: Hello World! 其表示意思如下: 引用 第一列:日志产生时间 第二列:产生此日志的主机名称 第三列:产生此日志的应用程序或用户名称 第四列:日志信息 7、自定义日志级别 正如前面所说的,应用程序的日志级别是由应用程序所决定的。部分应用程序可通过配置,定义其日志级别。 例如,/etc/ssh/sshd_config文件中就有: 引用 #SyslogFacility AUTH SyslogFacility AUTHPRIV #LogLevel INFO 把sshd的日志定义在authpriv.info级别。配合syslog.conf中的: 引用 authpriv.* /var/log/secure 则日志文件被写入/var/log/secure文件中。◎我们修改为: 引用 SyslogFacility local0 配合在syslog.conf中增加: 引用 local0.* /var/log/sshd.log 保存后,重新启动sshd或syslog服务,则以后sshd服务的所有日志都会单独的放到sshd.log文件中了。三、设置服务参数 默认情况下,syslog进程是不能接受其他日志服务器发过来的消息的。而通过修改其启动参数,可实现日志的大集中功能。 修改/etc/sysconfig/syslog文件: 引用 -r : 打开接受外来日志消息的功能,其监控514 UDP端口; -x : 关闭自动解析对方日志服务器的FQDN信息,这能避免DNS不完整所带来的麻烦; -m : 修改syslog的内部mark消息写入间隔时间(0为关闭),例如240为每隔240分钟写入一次“--MARK--”信息; -h : 默认情况下,syslog不会发送从远端接受过来的消息到其他主机,而使用该选项,则把该开关打开,所有接受到的信息都可根据syslog.conf中定义的@主机转发过去。 通过man syslogd可获得更详细的帮助,而具体到实际配置文件为: 引用 SYSLOGD_OPTIONS="-r-x-m 0" 保存后,重启服务即可: # service syslog restart 此时,客户机只要通过修改syslog.conf,定义动作为@主机或IP,即可发送日志信息到本服务器中。(在构建集中的日志服务器时,请务必配合ntp时间服务,以保证信息的有效性,避免不必要的麻烦) 另外,/etc/sysconfig/syslog配置文件中,还定义有klogd服务的启动参数: 引用 KLOGD_OPTIONS="-x"
针对这个资源池管理的一步步都实现了,而且做了详细的讲解,下面就看下整个示例代码,方便理解。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 package commonimport ( "errors" "io" "sync" "log")//一个安全的资源池,被管理的资源必须都实现io.Close接口type Pool struct { m sync.Mutex res chan io.Closer factory func() (io.Closer, error) closed bool}var ErrPoolClosed = errors.New("资源池已经被关闭。")//创建一个资源池func New(fn func() (io.Closer, error), size uint) (*Pool, error) { if size <= 0 { return nil, errors.New("size的值太小了。") } return &Pool{ factory: fn, res: make(chan io.Closer, size), }, nil}//从资源池里获取一个资源func (p *Pool) Acquire() (io.Closer,error) { select { case r,ok := <-p.res: log.Println("Acquire:共享资源") if !ok { return nil,ErrPoolClosed } return r,nil default: log.Println("Acquire:新生成资源") return p.factory() }} //关闭资源池,释放资源func (p *Pool) Close() { p.m.Lock() defer p.m.Unlock() if p.closed { return } p.closed = true //关闭通道,不让写入了 close(p.res) //关闭通道里的资源 for r:=range p.res { r.Close() }}func (p *Pool) Release(r io.Closer){ //保证该操作和Close方法的操作是安全的 p.m.Lock() defer p.m.Unlock() //资源池都关闭了,就省这一个没有释放的资源了,释放即可 if p.closed { r.Close() return } select { case p.res <- r: log.Println("资源释放到池子里了") default: log.Println("资源池满了,释放这个资源吧") r.Close() } } 好了,资源池管理写好了,也知道资源池是如何实现的啦,现在我们看看如何使用这个资源池,模拟一个数据库连接池吧。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 package mainimport ( "flysnow.org/hello/common" "io" "log" "math/rand" "sync" "sync/atomic" "time")const ( //模拟的最大goroutine maxGoroutine = 5 //资源池的大小 poolRes = 2)func main() { //等待任务完成 var wg sync.WaitGroup wg.Add(maxGoroutine) p, err := common.New(createConnection, poolRes) if err != nil { log.Println(err) return } //模拟好几个goroutine同时使用资源池查询数据 for query := 0; query < maxGoroutine; query++ { go func(q int) { dbQuery(q, p) wg.Done() }(query) } wg.Wait() log.Println("开始关闭资源池") p.Close()}//模拟数据库查询func dbQuery(query int, pool *common.Pool) { conn, err := pool.Acquire() if err != nil { log.Println(err) return } defer pool.Release(conn) //模拟查询 time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond) log.Printf("第%d个查询,使用的是ID为%d的数据库连接", query, conn.(*dbConnection).ID)}//数据库连接type dbConnection struct { ID int32//连接的标志}//实现io.Closer接口func (db *dbConnection) Close() error { log.Println("关闭连接", db.ID) return nil}var idCounter int32//生成数据库连接的方法,以供资源池使用func createConnection() (io.Closer, error) { //并发安全,给数据库连接生成唯一标志 id := atomic.AddInt32(&idCounter, 1) return &dbConnection{id}, nil } 这时我们测试使用资源池的例子,首先定义了一个结构体dbConnection,它只有一个字段,用来做唯一标记。然后dbConnection实现了io.Closer接口,这样才可以使用我们的资源池。 createConnection函数对应的是资源池中的factory字段,用来创建数据库连接dbConnection的,同时为其赋予了一个为止的标志。 接着我们就同时开了 5 个goroutine,模拟并发的数据库查询dbQuery,查询方法里,先从资源池获取可用的数据库连接,用完后再释放。 这里我们会创建 5 个数据库连接,但是我们设置的资源池大小只有 2 ,所以再释放了 2 个连接后,后面的 3 个连接会因为资源池满了而释放不了,一会我们看下输出的打印信息就可以看到。 最后这个资源连接池使用完之后,我们要关闭资源池,使用资源池的Close方法即可。 2017/04/17 22:25:08 Acquire:新生成资源2017/04/17 22:25:08 Acquire:新生成资源2017/04/17 22:25:08 Acquire:新生成资源2017/04/17 22:25:08 Acquire:新生成资源2017/04/17 22:25:08 Acquire:新生成资源2017/04/17 22:25:08 第2个查询,使用的是ID为4的数据库连接2017/04/17 22:25:08 资源释放到池子里了2017/04/17 22:25:08 第4个查询,使用的是ID为1的数据库连接2017/04/17 22:25:08 资源释放到池子里了2017/04/17 22:25:08 第3个查询,使用的是ID为5的数据库连接2017/04/17 22:25:08 资源池满了,释放这个资源吧2017/04/17 22:25:08 关闭连接 52017/04/17 22:25:09 第1个查询,使用的是ID为3的数据库连接2017/04/17 22:25:09 资源池满了,释放这个资源吧2017/04/17 22:25:09 关闭连接 32017/04/17 22:25:09 第0个查询,使用的是ID为2的数据库连接2017/04/17 22:25:09 资源池满了,释放这个资源吧2017/04/17 22:25:09 关闭连接 22017/04/17 22:25:09 开始关闭资源池2017/04/17 22:25:09 关闭连接 42017/04/17 22:25:09 关闭连接 1 到这里,我们已经完成了一个资源池的管理,并且进行了使用测试。 资源对象池的使用比较频繁,因为我们想把一些对象缓存起来,以便使用,这样就会比较高效,而且不会经常调用GC,为此Go为我们提供了原生的资源池管理,防止我们重复造轮子,这就是sync.Pool,我们看下刚刚我们的例子,如果用sync.Pool实现。 package mainimport ( "log" "math/rand" "sync" "sync/atomic" "time")const ( //模拟的最大goroutine maxGoroutine = 5)func main() { //等待任务完成 var wg sync.WaitGroup wg.Add(maxGoroutine) p:=&sync.Pool{ New:createConnection, } //模拟好几个goroutine同时使用资源池查询数据 for query := 0; query < maxGoroutine; query++ { go func(q int) { dbQuery(q, p) wg.Done() }(query) } wg.Wait()}//模拟数据库查询func dbQuery(query int, pool *sync.Pool) { conn:=pool.Get().(*dbConnection) defer pool.Put(conn) //模拟查询 time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond) log.Printf("第%d个查询,使用的是ID为%d的数据库连接", query, conn.ID)}//数据库连接type dbConnection struct { ID int32//连接的标志}//实现io.Closer接口func (db *dbConnection) Close() error { log.Println("关闭连接", db.ID) return nil}var idCounter int32//生成数据库连接的方法,以供资源池使用func createConnection() interface{} { //并发安全,给数据库连接生成唯一标志 id := atomic.AddInt32(&idCounter, 1) return &dbConnection{ID:id}} 进行微小的改变即可,因为系统库没有提供New这类的工厂函数,所以我们使用字面量创建了一个sync.Pool,注意里面的New字段,这是一个返回任意对象的方法,类似我们自己实现的资源池中的factory字段,意思都是一样的,都是当没有可用资源的时候,生成一个。 这里我们留意到系统的资源池是没有大小限制的,也就是说默认情况下是无上限的,受内存大小限制。 资源的获取和释放对应的方法是Get和Put,也很简洁,返回任意对象interface{}。 2017/04/17 22:42:43 第0个查询,使用的是ID为2的数据库连接2017/04/17 22:42:43 第2个查询,使用的是ID为5的数据库连接2017/04/17 22:42:43 第4个查询,使用的是ID为1的数据库连接2017/04/17 22:42:44 第3个查询,使用的是ID为4的数据库连接2017/04/17 22:42:44 第1个查询,使用的是ID为3的数据库连接 关于系统的资源池,我们需要注意的是它缓存的对象都是临时的,也就说下一次GC的时候,这些存放的对象都会被清除掉。 本文转自 baby神 51CTO博客,原文链接:http://blog.51cto.com/babyshen/1942828,如需转载请自行联系原作者
今年又在不经意间过半,在感叹岁月匆匆逝去的同时,更应该感谢当下遇到的一切人与事给予自己的关注和支持。 我们都是幸运的人,如果还能有追求美好的动力,那么就是幸福的人了。而最近感受到的朋友和学员们,很多时候都是冲动或者盲目消极的状态占多数。总结说来就是大家都曾对未来抱有憧憬和抱负,我们姑且称之为“理想”或者“梦想”。 这本是应该鼓励的一件好事情,而凡事都是有度的,一旦出现炒作“泡沫”了,往往会适得其反。例如早些年的“美国梦”、“彩票梦”,还有近些年来诸如一些励志节目不乏媒体炒作味道的“成功人士励志分享”和“成功法则”,以及最近的快速致富“股票风”等等。如果加以正确的引导,这本无所谓,但是极少数的幸运儿一旦被普及化和大众化之后,好像每个人都马上要成为明星或者大腕儿似的,简直可以说得上是“唾手可得”! 但就是这样的一股风气使得很多人逐渐变得好高骛远,眼高手低。殊不知我们是要实实在在地走进生活和自然中的人,奇闻异事的小概率事件我们听听也就罢了,少数人偶尔尝试一下也可以理解,而大众化的炒作实在是不可取。尤其是一些“暴发户们”大肆宣扬成功的假象和美国大片制造的“个人英雄主义”,影响了太多书幼小的心灵,再加之后期大量暴力和浮夸的网络游戏灌输,使得我们不得为很多孩子发展的问题隐隐担忧。空虚的财富来得快,去得更快,空虚的心灵是再多的物质财富都无法填充的,真正是欲壑难填的真实写照。 任何一个社会人,与生俱来就有一种使命感:认真面对社会群体走向的问题,往大的方面看同时也是顺应天道自然的问题。个人小小的举措看似微乎其微,但是如果大部分人都能够把这个举手之劳的事情坚持做到,那么集体的效应将会影响到整个文化的发展,同时人民综合素养的问题也就不在话下了,所谓教化问题并不是很遥远的一件事情。关键在务实:老老实实做人,踏踏实实做事。 任何投机取巧的成功都不可取,教化后代符合自然发展的规律,与自然和谐相处的道理才是当务之急。在我们物质世界飞速发展的同时,人们的幸福感不但没有正比例增加,反而感觉生活压力更大了,诸如赡养老人问题,抚养子女问题,教育问题,住房压力等等。而在先辈在解决温饱问题的时候也没有感到如今年轻人的痛苦,老人们总是疑惑地说道:那时候虽然日子清苦一些,也还算过得去。 我们都要学会静下心来去思考,在当下国内实现“中国梦”的路上,我相信我们应该反思自己的行为和作风问题了。唯有脚踏实地,认认真真地履行自己应尽的义务,努力学习科学知识,贡献出自己的一份力所能及的力量,才是很有意义的一件事情。 尽管一直在提倡务实精神,还是会出现很多投机分子,心性懒惰使然。所以我们不仅要从新做起,更要从心做起。不要因为侥幸而变得乖张,福报消耗完了,人生陌路就离你不远了。 我们依然提倡怀抱崇高理想,但不是好高骛远和眼高手低,而是要脚踏实地,实事求是地为别人负责,为子孙后代负责,更为自己负责。 本文转自 昊洋教育 51CTO博客,原文链接:http://blog.51cto.com/zdytesting/1793681,如需转载请自行联系原作者
redis数据迁移: 加载rdb文件(或加载aof文件); redis replication; redis-migrate-tool,此工具适用任何场景,是重点: https://github.com/vipshop/redis-migrate-tool,Features特点: Fast.快速; Multi-Threads.多线程; Based on redis replication.基于redis复制; Live migration.实时迁移; In the process of migrating data, the source redis can also provide services for users.迁移过程中,源集群不影响对外提供服务; Heterogeneous migration.异构迁移; Twemproxy and redis cluster support.支持twemproxy集群,redis集群,rdb文件和aof文件; When the target is twemproxy, keys are direct imported into redis behind the twemproxy.过滤功能; Migration Status view.迁移状态显示; Data Verification Mechanism.完善的数据抽样校验; source来源可以是:单redis实例、redis cluster、rdb文件、aof文件、twemproxy集群; target目标可以是:单redis实例、redis cluster、rdb文件、twemproxy集群; 配置文件rmt.conf常用配置项如下: type: The group redis type. Possible values are: single twemproxy redis cluster rdb file aof file servers: The list of redis address in the group. If type is twemproxy, this is same as the twemproxy config file. If type is rdb file, this is the filename. listen: The listening address and port (name:port or ip:port). Defaults to 127.0.0.1:8888. 以下操作有:单节点迁到单节点、redis集群迁到redis集群,各用两种方法,其中: 单节点迁到单节点(方一,直接复制并加载rdb或aof文件;方二,利用redis复制机制); redis集群迁到redis集群(两种方法都使用redis-migrate-tool工具;方一,网络隔离情况时,在被迁移端导出rdb文件,再到迁移端加载;方二,相同网段时,在线迁移); 1、redis单节点数据迁到另一单节点上: 方一: 利用redis启动时加载rdb二进制文件方式(或加载aof文本文件方式),直接将被迁移端的dump.rdb文件(即snapshotting快照文件)上传至迁移端主机; 被迁移端注意: 停连接redis的应用,即禁止往redis里写数据; 在redis交互模式下执行>bgsave #(即重新fork一个线程,用于将当前内存中的数据持久化到磁盘上;若使用加载aof文件,此步用>bgrewriteaof命令); 迁移端注意: 将被迁移端的dump.rdb上传至迁移端指定路径下,即要与配置文件中dir和dbfilename配置项一致; 启动前将配置文件中的rdb持久化配置项注释掉,此步重要,即注释掉配置文件中默认的如下三行: #save 900 1 #save 300 10 #save 60 10000 操作: 此例是在一台主机上启动两个redis实例(6379和6380),将6379上的数据迁到6380上; 在被迁移端(6379)如下操作: [root@test2 ~]# cd /ane/redis [root@test2 redis]# redis-cli -p 6379 keys \* (empty list or set) [root@test2 redis]# for i in `seq 1 100` ; do redis-cli -p 6379 set key$i value$i ; done #(模拟产生数据) …… [root@test2 redis]# redis-cli -p 6379 127.0.0.1:6379> keys * …… 127.0.0.1:6379> bgsave Background saving started 127.0.0.1:6379> exit 在迁移端(6380)上操作: [root@test2 redis]# redis-cli -p 6380 127.0.0.1:6380> keys * (empty list or set) 127.0.0.1:6380> exit [root@test2 redis]# vim redis_6380.conf #save 900 1 #save 300 10 #save 60 10000 dbfilename dump_6380.rdb dir /ane/redis/6380/ [root@test2 redis]# redis-cli -p 6380 shutdown [root@test2 redis]# rm -f /ane/redis/6380/dump_6380.rdb [root@test2 redis]# cp dump.rdb /ane/redis/6380/dump_6380.rdb #(dump.rdb为6379上的持久化数据) [root@test2 redis]# redis-server /ane/redis/6380/redis_6380.conf [root@test2 redis]# redis-cli -p 6380 127.0.0.1:6380> keys * 1)"key64" 2)"key29" 3)"key55" 4)"key67" 5)"key12" 6)"key39" 7)"key26" 8)"key82" 9)"key57" 10)"key48" …… [root@test2 redis]# vim /ane/redis/6380/redis_6380.conf save 900 1 save 300 10 save 60 10000 [root@test2 redis]# redis-cli -p 6380 shutdown [root@test2 redis]# redis-server /ane/redis/6380/redis_6380.conf [root@test2 redis]# redis-cli -p 6380 127.0.0.1:6380> keys * 1)"key85" 2)"key23" 3)"key94" 4)"key41" 5)"key76" 6)"key24" 7)"key55" 8)"key67" 9)"key43" 10)"key90" 11)"key84" 12)"key86" …… 127.0.0.1:6380> exit 方二: 用redis replication复制机制,用于两主机在相同网段或两主机可互通的情况下; 注意主从次序,主端数据被清空,若从仍开启slaveof项时,从上数据也会被清空,两端数据是实时同步的; 在迁移端(6380)操作: [root@test2 redis]# pwd /ane/redis [root@test2 redis]# redis-cli -p 6380 shutdown #(关闭从redis后改配置) [root@test2 redis]#vim 6380/redis.conf #(在迁移端即主从模式的从服务器设置主的ip和port,也可在交互模式下配置>slaveof 192.168.23.130 6379) # slaveof <masterip><masterport> slaveof 192.168.23.130 6379 [root@test2 redis]# redis-server 6380/redis.conf #(启动从redis) 在被迁移端(6379)操作: [root@test2 redis]# redis-cli -p 6379 flushall OK [root@test2 redis]# for i in `seq 100 1000`; do redis-cli -p 6379 set key$i value$i &> /dev/null ; done #(模拟产生数据,到迁移端查看是否有) 在迁移端(6380)上查看是否有数据: [root@test2 redis]# redis-cli -p 6380 127.0.0.1:6380> exists key1000 (integer) 1 127.0.0.1:6380> exists key100 (integer) 1 127.0.0.1:6380> exit [root@test2 redis]# vim 6380/redis.conf #(待数据传完后,改配置,重启;或在命令行交互模式下执行>slave NO ONE,并改配置文件) #slaveof 192.168.23.1306379 [root@test2 redis]# redis-cli -p 6380 shutdown [root@test2 redis]# redis-server 6380/redis.conf [root@test2 redis]# redis-cli -p 6380 127.0.0.1:6380> exists key100 (integer) 1 127.0.0.1:6380> exists key1000 (integer) 1 127.0.0.1:6380> exit 2、redis 集群数据迁到另一redis集群: 使用redis-migrate-tool工具; 操作: 将test1主机redis集群中的数据迁到test2主机; 方一: 适合两台主机不在一个网段,网络隔离情况; test1和test2均需安装redis-migrate-tool,利用此工具先将test1主机上的redis集群中的数据导出为rdb文件,再将rdb文件上传至test2并恢复到redis集群中; test1(被迁移端)上操作如下: [root@test1 ~]# cd /ane [root@test1 ane]# yum -y install automake libtool autoconf bzip2 [root@test1 ane]# unzip /usr/local/src/redis-migrate-tool-master.zip -d /ane [root@test1 ane]# cd redis-migrate-tool-master [root@test1 redis-migrate-tool-master]# autoreconf -fvi [root@test1 redis-migrate-tool-master]# ./configure [root@test1 redis-migrate-tool-master]# make [root@test1 redis-migrate-tool-master]# vim /etc/profile.d/redis.sh export PATH=$PATH:/ane/redis/bin:/ane/redis-migrate-tool-master/src [root@test1 redis-migrate-tool-master]# ./etc/profile.d/redis.sh [root@test1 redis-migrate-tool-master]# which redis-migrate-tool /ane/redis-migrate-tool-master/src/redis-migrate-tool [root@test1 redis-migrate-tool-master]# redis-migrate-tool -h …… -d,--daemonize : run as a daemon -o,--output=S : set logging file(default: stderr) -c,--conf-file=S : set configurationfile (default: rmt.conf) -C,--command=S : set command toexecute (default: redis_migrate) [root@test1 redis-migrate-tool-master]# cd.. [root@test1 ane]# redis-cli -c -h 192.168.23.129 -p 6379 keys \* (empty list or set) [root@test1 ane]# for i in `seq 101 2000` ; do redis-cli -c -h 192.168.23.129 -p 6379 set key$i value$i &> /dev/null ; done #(模拟往test1主机上的redis集群中插入数据) [root@test1 ane]# redis-cli -c -h 192.168.23.129 -p 6379 192.168.23.129:6379> exists key101 (integer) 1 192.168.23.129:6379> exists key2000 -> Redirected to slot [9780] located at192.168.23.129:6380 (integer) 1 192.168.23.129:6380> exit [root@test1 ane]# cp redis-migrate-tool-master/rmt.conf redis-migrate-tool-master/rmt.conf.example [root@test1 ane]# vim redis-migrate-tool-master/rmt.conf [source] type: redis cluster servers: - 192.168.23.129:6379 [target] type: rdb file [common] listen: 0.0.0.0:8888 [root@test1 ane]# redis-migrate-tool -c redis-migrate-tool-master/rmt.conf -o log.txt -d [root@test1 ane]# tail -f log.txt #(查看日志是否报错) …… [root@test1 ane]# cat log.txt #(日志中有详细操作过程) …… [root@test1 ane]# ll -h #(在当前目录下生成了三个rdb文件(该集群是6个节点,3主3从),将这三个文件上传到迁移端恢复即可) total 60K -rw-r--r--. 1 root root 4.2K Mar 17 01:26log.txt -rw-r--r--. 1 root root 12K Mar 17 01:26 node192.168.23.129:6379-1489739168652097-11514.rdb -rw-r--r--. 1 root root 12K Mar 17 01:26 node192.168.23.129:6380-1489739168552203-11514.rdb -rw-r--r--. 1 root root 12K Mar 17 01:26 node192.168.23.129:6381-1489739168455476-11514.rdb drwxr-xr-x. 9 root root 4.0K Mar 2 18:52 redis drwxr-xr-x. 9 root root 4.0K Mar 17 01:23redis-migrate-tool-master -rwxr-xr-x. 1 root root 163 Mar 3 00:32 shutdown_redis.sh -rwxr-xr-x. 1 root root 140 Mar 3 00:34 startup_redis.sh [root@test1 ane]# mv node192.168.23.129\:6379-1489739168652097-11514.rdb node129-6379.rdb #(将生成的这三个文件改名,防止特殊字符(如冒号等)影响操作) [root@test1 ane]# mv node192.168.23.129\:6380-1489739168552203-11514.rdb node129-6380.rdb [root@test1 ane]# mv node192.168.23.129\:6381-1489739168455476-11514.rdb node129-6381.rdb [root@test1 ane]# scp node129-63*.rdbroot@192.168.23.130:/ane #(传至迁移端) [root@test1 ane]# redis-migrate-tool-h 127.0.0.1 -p 8888 shutdown #(关闭redis-migrate-tool) test2上操作如下: 安装redis-migrate-tool; [root@test2 ane]# redis-cli -c -h 192.168.23.130-p 6379 192.168.23.130:6379> keys * (empty list or set) 192.168.23.130:6379> exit [root@test2 ane]# vim redis-migrate-tool-master/rmt.conf [source] type: rdb file servers: - /ane/node129-6379.rdb - /ane/node129-6380.rdb - /ane/node129-6381.rdb [target] type: redis cluster servers: - 192.168.23.130:6379 [common] listen: 0.0.0.0:8888 [root@test2 ane]# redis-migrate-tool -c redis-migrate-tool-master/rmt.conf -o log.txt -d [root@test2 ane]# tail -f log.txt …… [root@test2 ane]# redis-cli -c -h 192.168.23.130 -p 6379 192.168.23.130:6379> exists key101 (integer) 1 192.168.23.130:6379> exists key2000 -> Redirected to slot [9780] located at192.168.23.130:6380 (integer) 1 192.168.23.130:6380> keys * …… 192.168.23.130:6380> exit [root@test2 ane]# redis-migrate-tool -h 127.0.0.1 -p 8888 shutdown 方二: 适合两台主机在一个网段,在线迁移: 确保两台主机的redis集群都在运行状态; 两个主机(被迁移端和迁移端)任意一个上安装redis-migrate-tool即可,此例是在test2上安装; 在迁移端test2上操作: [root@test2 ~]# cd /ane [root@test2 ane]# redis-cli -c -h 192.168.23.130 -p 6379 192.168.23.130:6379> flushall OK 192.168.23.130:6379> keys * (empty list or set) 192.168.23.130:6379> exit [root@test2 ane]# vim redis-migrate-tool-master/rmt.conf [source] type: redis cluster servers: - 192.168.23.129:6379 [target] type: redis cluster servers: - 192.168.23.130:6379 [common] listen: 0.0.0.0:8888 [root@test2 ane]# redis-migrate-tool -c redis-migrate-tool-master/rmt.conf -o log.txt -d [root@test2 ane]# tail -f log.txt #(查看是否有报错) [root@test2 ane]# redis-cli -c -h 192.168.23.130 -p 6379 #(查看是否有数据) 192.168.23.130:6379> exists key2000 -> Redirected to slot [9780] located at192.168.23.130:6380 (integer) 1 192.168.23.130:6380> exit [root@test2 ane]# redis-cli-h 127.0.0.1 -p 8888 #(连接redis-migrate-tool监控的端口) 127.0.0.1:8888> info # Server version:0.1.0 os:Linux 2.6.32-431.el6.x86_64 x86_64 multiplexing_api:epoll gcc_version:4.4.7 process_id:25904 tcp_port:8888 uptime_in_seconds:196 uptime_in_days:0 config_file:/ane/redis-migrate-tool-master/rmt.conf # Clients connected_clients:1 max_clients_limit:100 total_connections_received:1 # Memory mem_allocator:jemalloc-4.0.4 # Group source_nodes_count:3 target_nodes_count:3 # Stats all_rdb_received:1 all_rdb_parsed:1 all_aof_loaded:0 rdb_received_count:3 rdb_parsed_count:3 aof_loaded_count:0 total_msgs_recv:1901 total_msgs_sent:1901 total_net_input_bytes:35215 total_net_output_bytes:76137 total_net_input_bytes_human:34.39K total_net_output_bytes_human:74.35K total_mbufs_inqueue:0 total_msgs_outqueue:0 127.0.0.1:8888> exit [root@test2 ane]# redis-migrate-tool-c redis-migrate-tool-master/rmt.conf -o log.txt -C redis_check #(数据校验) Check job is running... Checked keys: 1000 Inconsistent value keys: 0 Inconsistent expire keys : 0 Other check error keys: 0 Checked OK keys: 1000 All keys checked OK! Check job finished, used 0.045s [root@test2 ane]# redis-migrate-tool -h 127.0.0.1 -p 8888 shutdown 本文转自 chaijowin 51CTO博客,原文链接:http://blog.51cto.com/jowin/1945450,如需转载请自行联系原作者
脚本1 作用:创建10个1M的文件 1 2 3 4 5 6 [root@python script]# cat make_file.sh #!/bin/bash # for i in $(seq 1 10);do dd if=/dev/zero of=/data/test/test"${i}" bs=1M count=1 done 脚本2 作用:移走/data/test目录下大于100K的普通文件到/tmp目录下 1 2 3 4 [root@python script]# cat file_mv.sh #!/bin/bash # find /data/test -type f -size +100k | xargs -i mv {} /tmp 脚本3 作用:删除/tmp目录下包含test的任意字符且大小大于100K的文件 1 2 3 4 [root@python script]# cat file_rm.sh #!/bin/bash # find /tmp -name "test*" -type f -size +100k | xargs -i rm -f {} 脚本4 结合continue,break的for循环示例 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@python script]# cat for.sh #!/bin/bash # for loop egs for I in {1..10};do if [[ $I -eq 6 ]];then echo "six six six" continue elif [[ $I -eq 9 ]];then echo "bye bye 9" break fi echo $I done 脚本5 简单while循环示例 1 2 3 4 5 6 7 8 [root@python script]# cat while.sh #!/bin/bash # while loop egs NUM=5 while [[ $NUM -gt 0 ]];do echo $NUM let NUM-=1 done 脚本6 简单until循环示例 1 2 3 4 5 6 7 8 9 [root@python script]# cat until.sh #!/bin/bash # until loop egs # NUM=5 until [[ $NUM -lt 0 ]];do echo $NUM let NUM-=1 done 脚本7 结合位置参数的case语句用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@python script]# cat case.sh #!/bin/bash #case loop egs # VAR=$1 case $VAR in neo) echo hacker ;; sternberg) echo rigorous ;; michael) echo creative ;; *) echo unknow ;; esac 脚本8 function函数示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@python script]# cat function.sh #!/bin/bash #function egs # #1st function function hi() { echo "Hi,you are beautiful!" } #sencond function hello() { echo -e "Jun Lei says\"hello thank you\"" } hi hello 本文转自 PowerMichael 51CTO博客,原文链接:http://blog.51cto.com/huwho/1958762,如需转载请自行联系原作者
转自:http://blog.csdn.net/post_yuan/article/details/77856320 Embulk提供很多plugins,包括Input plugins、Output plugins、File parser plugins等,详细可以参考http://www.embulk.org/plugins/。embulk不仅可实现数据库到数据库的抽取,也可以实现csv文件/csv.gz文件到数据库的抽取。(相关yml文件的配置可以参考官网) 用户也可以开发自己的plugins并上传,如EsgynDB就基于trafodion自己开发一款基于trafodion的upsert using load实现的批量加载插件,如下图, 本文在此利用上述的trafodion output插件及oracle input插件通过实例描述如何使用embulk实现oracle到trafodion的数据加载。 1 下载安装Embulk 1 2 3 4 5 wget https://dl.embulk.org/embulk-latest.jarmkdir ~/.embulk/bin mv embulk-latest.jar ~/.embulk/bin/embulk chmod +x ~/.embulk/bin/embulk echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashrc source ~/.bashrc123456 2 验证Embulk下载安装成功 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [root@n12 ~]# embulk gem list 2017-09-05 20:19:51.184 +0800: Embulk v0.8.31 *** LOCAL GEMS *** did_you_mean (default: 1.0.1)
一、简介 LogAnalyzer 是一款syslog日志和其他网络事件数据的Web前端。它提供了对日志的简单浏览、搜索、基本分析和一些图表报告的功能。数据可以从数据库或一般的syslog文本文件中获取,所以LogAnalyzer不需要改变现有的记录架构。基于当前的日志数据,它可以处理syslog日志消息,Windows事件日志记录,支持故障排除,使用户能够快速查找日志数据中看出问题的解决方案。 LogAnalyzer 获取客户端日志会有两种保存模式,一种是直接读取客户端/var/log/目录下的日志并保存到服务端该目录下,一种是读取后保存到日志服务器数据库中,推荐使用后者。 LogAnalyzer 采用php开发,所以日志服务器需要php的运行环境,本文采用LAMP。 二、系统环境 Rsyslog Server OS:CentOS 6.5 Rsyslog Server IP:192.168.1.107 Rsyslog 版本:rsyslog-5.8.10-8.el6.i686 LogAnalyzer 版本:LogAnalyzer 3.6.5 (v3-stable) LAMP 版本:httpd-2.2.15-30.el6.centos.i686 + mysql-5.1.73-3.el6_5.i686 + php-5.3.3-27.el6_5.i686 防火墙已关闭/iptables: Firewall is not running. SELINUX=disabled Rsyslog Client OS:RHEL 6.4 Rsyslog Client IP:192.168.1.108 三、安装并设置LAMP环境 3.1 安装LAMP环境 # yum -y install httpd mysql* php* 3.2 启动服务并加入开机启动 启动Apache # /etc/init.d/httpd start # chkconfig httpd on 启动数据库 # /etc/init.d/mysqld start # chkconfig mysqld on 3.3 设置MySQL root 密码 # mysqladmin -uroot password 'abc123' 3.4 测试php运行环境 # cd /var/www/html/ [root@TS html]# cat > index.php <<EOF > <?php > phpinfo(); > ?> > EOF 打开浏览器访问:http://192.168.1.107/index.php LAMP环境配置完毕。 四、检查并安装服务器端软件 4.1 检查是否安装了rsyslog软件 # rpm -qa|grep rsyslog //默认系统都安装了该软件 4.2 安装rsyslog 连接MySQL数据库的模块 # yum install rsyslog-mysql –y rsyslog-mysql 为rsyslog 将日志传送到MySQL 数据库的一个模块,这里必须安装。 五、配置服务器端 5.1 导入rsyslog-mysql 数据库文件 # cd /usr/share/doc/rsyslog-mysql-5.8.10/ # mysql -uroot -pabc123 < createDB.sql 查看做了哪些操作 # mysql -uroot –p mysql> show databases; mysql> show tables; 导入数据库操作创建了Syslog 库并在该库中创建了两张空表SystemEvents 和SystemEventsProperties。 5.2 创建rsyslog 用户在mysql下的相关权限 # mysql -uroot –p mysql> grant all on Syslog.* to rsyslog@localhost identified by '123456'; mysql> flush privileges; mysql> exit 5.3 配置服务端支持rsyslog-mysql 模块,并开启UDP服务端口获取网内其他LINUX系统日志 # vi /etc/rsyslog.conf $ModLoad ommysql *.* :ommysql:localhost,Syslog,rsyslog,123456 在 #### MODULES #### 下添加上面两行。 说明:localhost 表示本地主机,Syslog 为数据库名,rsyslog 为数据库的用户,123456为该用户密码。 5.4 开启相关日志模块 # vi /etc/rsyslog.conf $ModLoad immark #immark是模块名,支持日志标记 $ModLoad imudp #imupd是模块名,支持udp协议 $UDPServerRun 514 #允许514端口接收使用UDP和TCP协议转发过来的日志 5.5 重启rsyslog 服务 # /etc/init.d/rsyslog restart 六、配置客户端 6.1 检查rsyslog 是否安装 # rpm -qa|grep rsyslog 6.2 配置rsyslog 客户端发送本地日志到服务端 # vi /etc/rsyslog.conf *.* @192.168.1.107 行尾新增上面这行内容,即客户端将本地日志发送到服务器。 6.3 重启rsyslog 服务 # /etc/init.d/rsyslog restart 6.4 编辑/etc/bashrc,将客户端执行的所有命令写入系统日志/var/log/messages中。 # vi /etc/bashrc 在文件尾部增加一行 export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });logger "[euid=$(whoami)]":$(who am i):[`pwd`]"$msg"; }' 设置其生效 # source /etc/bashrc 客户端配置完毕。 七、测试Rsyslog Server是否可以正常接受Client端日志 Client 端测试: Server 端侦测: 说明接收正常,包括你重启机器的一些Log都可以查看到。 八、安装LogAnalyzer # wget http://download.adiscon.com/loganalyzer/loganalyzer-3.6.5.tar.gz # tar zxf loganalyzer-3.6.5.tar.gz # cd loganalyzer-3.6.5 # mkdir -p /var/www/html/loganalyzer # rsync -a src/* /var/www/html/loganalyzer/ 九、在浏览器安装向导中安装LogAnalyzer 9.1 打开浏览器访问:http://192.168.1.107/loganalyzer/ 提示没有配置文件,点击 here 利用向导生成。 9.2 第一步,测试系统环境 点击 “Next”,进入第二步。 提示错误:缺少config.php 文件,并且权限要设置为666,可以使用contrib目录下的configure.sh 脚本生成。 查看configure.sh 文件内容 需要在/var/www/html/loganalyzer/ 下创建config.php 文件,并设置其权限为666。 # touch /var/www/html/loganalyzer/config.php # chmod 666 /var/www/html/loganalyzer/config.php 做完上面的操作之后,执行 ReCheck 操作,config.php 文件可写,点击 Next 进入下一步。 9.3 第三步,基础配置 在User Database Options 中,填入上面设置的参数,然后点击 Next. 9.4 第四步,创建表 点击 Next 开始创建表。 9.5 第五步,检查SQL结果 9.6 第六步,创建管理用户 9.7 第七步,创建第一个系统日志source. 9.8 第八步,完成 十、测试 LogAnalyzer 首页 点击任何一条记录,查看详情。 查看Statistics 登录测试 在Admin Center 里可以进行一些系统设置。 Rsyslog + LogAnalyzer 日志服务器部署完毕。 本文转自 dengaosky 51CTO博客,原文链接:http://blog.51cto.com/dengaosky/1864886,如需转载请自行联系原作者
需要软件包: apr-1.5.2.tar.gz apr-util-1.5.4.tar.gz httpd-2.4.23.tar.gz openssl-1.0.1.tar.gz sqlite-autoconf-3140100.tar.gz subversion-1.9.4.tar.gz zlib-1.2.8.tar.gz 一.安装apr和apr-uti #mkdir -p /app/3rd #mkdir -p /data/software #wget http://mirror.bit.edu.cn/apache//apr/apr-1.5.2.tar.gz #tar zxvf apr-1.5.2.tar.gz #cd apr-1.5.1 #./configure --prefix=/usr/local/apr(如果报错rm: cannot remove `libtoolT': Nosuch file or directory,直接打开 configure,把 $RM “$cfgfile” 即30145行删除掉,重新再运行 ./configure 就可以了。) #make && make install 验证: #/usr/local/apr/bin/apr-1-config --version 1.5.1 #cd /data/software #wget http://mirrors.cnnic.cn/apache/apr/apr-util-1.5.4.tar.gz #tar zxvf apr-util-1.5.4.tar.gz #cd apr-util-1.5.4 #./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ #make && make install 验证: #/usr/local/apr-util/bin/apu-1-config --version 1.5.4 二.安装sqlite3 #wget http://www.sqlite.org/2013/sqlite-autoconf-3080000.tar.gz #tar zxvf sqlite-autoconf-3080000.tar.gz #cd sqlite-autoconf-3080000 #./configure #make && make install 三.安装openssl #wget http://www.openssl.org/source/openssl-1.0.1.tar.gz #tar xzvf openssl-1.0.1.tar.gz #cd openssl-1.0.1 #./config-fPIC--prefix=/usr/local/openssl/enable-shared #make && make install 四.安装apachehttp server 和ssl model #wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.2.29.tar.gz #tar zxvf httpd-2.2.29.tar.gz #export LDFLAGS=-ldl #cd httpd-2.2.29 #./configure --prefix=/usr/local/apache --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr-util/bin/apu-1-config --enable-so --enable-dav --enable-maintainer-mode --enable-rewrite --enable-ssl --with-ssl=/usr/local/openssl #make && make install 设置开机启动 #cp /usr/local/apache/bin/apachectl /etc/init.d/httpd #编辑/etc/init.d/httpd,在第二行增加如下内容 #chkconfig: 2345 85 35 #chkconfig httpd on 通过service httpd start启动服务,正常情况下会提示启动成功,通过在其他电脑上打开浏览器浏览这台服务器IP的80端口服务,如果出现Itworks 字样,恭喜您,安装成功 如果出现httpd: Could not reliably determine the server’s fullyqualified domain name,只需要编辑httpd.conf 将里面的 #ServerName www.example.com:80注释去掉即可,,并改成ServerName 127.0.0.1:80 如果出现Cannot load modules/mod_ssl.so into server:libssl.so.1.0.0: 执行: # cp/usr/local/openssl/lib/libssl.so.1.0.0 /usr/lib64/ # cp/usr/local/openssl/lib/libcrypto.so.1.0.0 /usr/lib64/五.安装zlib #wget http://jaist.dl.sourceforge.net/project/libpng/zlib/1.2.8/zlib-1.2.8.tar.gz #tar -xvzf zlib-1.2.8.tar.gz #cd zlib-1.2.8 #./configure #make && make install 六.安装subversion1.8.10 #wget http://mirror.esocc.com/apache/subversion/subversion-1.8.10.tar.gz #tar zxvf subversion-1.8.10.tar.gz #mkdir -p ./subversion-1.8.10/sqlite-amalgamation #cp ./sqlite-autoconf-3080000/sqlite3.c ./subversion-1.8.10/sqlite-amalgamation #cd subversion-1.8.10 #./configure --prefix=/usr/local/subversion --with-apxs=/usr/local/apache/bin/apxs --with-apr=/usr/local/apr/bin/apr-1-config --with-apr-util=/usr/local/apr-util/bin/apu-1-config --with-zlib --enable-maintainer-mode #make && make install 验证: #/usr/local/subversion/bin/svnserve --version svnserve, version 1.8.10 (r1534716)七、整合Apache拷贝模块 #cp /usr/local/subversion/libexec/mod_authz_svn.so /usr/local/apache/modules/ #cp /usr/local/subversion/libexec/mod_dav_svn.so /usr/local/apache/modules/ 编辑http.conf文件 #vim /usr/local/apache/conf/httpd.conf在最后面增加如下内容 #加载整合svn所需so文件 ################for svn#################3 LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so <Location /svn> DAV svn #svn父目录 SVNParentPath /data/zpy/svn #权限配置文件 AuthzSVNAccessFile /data/zpy/svn/authz #连接类型设置 AuthType Basic #连接框提示 AuthName "Subversion.zoneyump" #用户配置文件 AuthUserFile /data/zpy/svn/passwd #采用何种认证 Require valid-user </Location> 八、配置Subversion1)建立svn版本库目录 #mkdir -p /data/zpy/svn/{its,ism} #touch authz #touch passwd 可以多建版本库目录,这里我的目录是its,ism2)建立svn版本库 #svnadmin create /data/zpy/svn/ism #svnadmin create /data/zpy/svn/its 因为apache的线程使用的用户是apache #chown -R apache.apache /data/zpy/svn #chmod -R 755 /data/zpy/svn 3)建立本地访问控制文件 #/usr/local/apache/bin/htpasswd -cm /data/zpy/svn/passwd user1 注意:如果没有文件就创建它并且给予755的权限。然后输入密码即可,默认是MD5加密的添加新用户 #/usr/local/apache/bin/htpasswd /data/zpy/svn/passwd user2 4)建立本地项目控制文件#vim/data/zpy/svn/authz本例authz内容为: [groups] admin = user01 dev3-web = user01,user02 [/] @admin = rw @dev3-web = r [/ism] @dev3-web = rw [/its] @dev3-web = rw 测试连接1)启动apache #service httpd start #svnserve -d --listen-port 7200 -r /data/zpy/svn/ism/ #svnserve -d --listen-port 7201 -r /data/zpy/svn/its 对于报错: svn: E170000: Unrecognized URL scheme for 'http://172.16.67.211/svn/cg-test' 解决方法: # tar zxvf scons-2.3.3.tar.gz # cd scons-2.3.3 # python setup.py install # tar xvf serf-1.3.8.tar.bz2 # cd serf-1.3.8 # cp /usr/local/apr/bin/apr-1-config /usr/bin/ # cp /usr/local/apr-util/bin/apu-1-config /usr/bin/ # scons PREFIX=/usr/local/serf # ln -s /usr/local/serf/lib/libserf-1.so.1 lib/libserf-1.so.1 2)再浏览器访问http://192.168.1.100/svn/its 在本机上通过svn客户端访问不能用svn://192.168.1.100/svn/its 只能用checkouthttp://192.168.1.100/svn/ism #本例服务器ip是192.168.1.100 使用刚才创建的权限用户名与密码登录即可访问 客户端操作 #mkdir /data/svncheck #cd /data/svncheck #svn checkout http://10.0.70.242/svn/ism --username=user01 --password=123456 #cd ism/ #touch ism.txt #svn add ism.txt 用add把新增的文件添加进去 #svn commit --force-log -m "ism.txt" commit正式提交 #svn update ism.txt 更新 #svn lock -m "lock test file" ism.txt 加锁 #svn unlock ism.txt 解锁 #svn info ism.txt 查看信息 #svn update -r 1 ism.txt 更新到1版本 #svn update 如果后面没有目录,默认将当前目录以及子目录下的所有文件都更新到最新版本。 #svn update ism.txt 更新,于版本库同步。如果在提交的时候提示过期的话,是因为冲突,需要先update,修改文件然后清除svn resolved,最后再提交commit) #svn delete ism.txt #svn ci -m 'delete test file' 删除文件 #svn log ism.txt 查看日志 实现https、安装Neon(可以不需要。上面serf已实现) neon并非必要软件,但如果需要通过http或者https协议访问版本库,那就必须安装。我们知道,SVN有ra_dav(http,https)、ra_svn(svn原生协议)、ra_local(本地路径)三种存取模块,系统为我们默认安装了ra_svn和ra_local,我们自己安装neon库,从而让svn支持ra_dav存储模块。 配置apache、创建证书。 # cd /etc/pki/tls/private/ # openssl genrsa -out my.key 1024 # openssl req -new -key my.key -out my.csr # cd /etc/pki/tls/certs/ # openssl x509 -req -days 365 -in /etc/pki/tls/private/my.csr -signkey /etc/pki/tls/private/my.key -out my.crt # vim /usr/local/apache/conf/extra/httpd-ssl.conf ServerName 172.16.67.213:443 SSLCertificateFile "/etc/pki/tls/certs/my.crt" SSLCertificateKeyFile "/etc/pki/tls/private/my.key" vim /usr/local/apache/conf/httpd.conf ServerName 172.16.67.213:80 <Directory /> Options FollowSymLinks AllowOverride None SSLRequireSSL Order deny,allow Deny from all </Directory> Include conf/extra/httpd-ssl.conf <Location /svn> DAV svn #svn父目录 SVNParentPath /data/cg/svn #权限配置文件 AuthzSVNAccessFile /data/cg/svn/authz #连接类型设置 AuthType Basic #连接框提示 AuthName "Subversion.zoneyump" #用户配置文件 AuthUserFile /data/cg/svn/passwd #采用何种认证 Require valid-user SSLRequireSSL </Location> # yum install -y mod_ssl # cp /usr/lib64/httpd/modules/mod_ssl.so /usr/local/apache/modules/ # /usr/local/apache/bin/httpd # svn checkout https://172.16.67.213/svn/op-test --username=user1 --password=123456 本文转自 周新宇1991 51CTO博客,原文链接:http://blog.51cto.com/zhouxinyu1991/1847321,如需转载请自行联系原作者
#!/bin/sh##Subversion的安装目录及执行文件SVN_HOME=/usr/local/subversion/binSVN_ADMIN=$SVN_HOME/svnadminSVN_LOOK=$SVN_HOME/svnlook##配置库根目录SVN_REPOROOT=/zsvn/svnroot##备份文件存放路径date=$(date '+%Y%m%d')BAK_STORE=/zsvn/bakdump/$dateif [ ! -d "$BAK_STORE" ];thenmkdir -p $BAK_STOREfi##日志存放目录Log_PATH=/zsvn/bakdumplogif [ ! -d "$Log_PATH" ];thenmkdir -p $Log_PATHfi##读取项目库列表cd $SVN_REPOROOTfor name in $(ls)doif [ ! -d "$BAK_STORE/$name" ];thenmkdir $BAK_STORE/$nameficd $BAK_STORE/$nameif [ ! -d "$Log_PATH/$name" ];thenmkdir $Log_PATH/$namefiecho ******Starting backup from $date****** >> $Log_PATH/$name/$name.logecho ******svn repository $name startting to backup****** >> $Log_PATH/$name/$name.log$SVN_LOOK youngest $SVN_REPOROOT/$name > $Log_PATH/A.TMPUPPER=`head -1 $Log_PATH/A.TMP`##取出上次备份后的版本号,并做+1处理NUM_LOWER=`head -1 $Log_PATH/$name/last_revision.txt`let LOWER="$NUM_LOWER+1"##开始做增量备份并记录$UPPER,为下次备份做准备$SVN_ADMIN dump $SVN_REPOROOT/$name -r $LOWER:$UPPER --incremental > $BAK_STORE/$name/$LOWER-$UPPER.dumprm -f $Log_PATH/A.TMPecho $UPPER > $Log_PATH/$name/last_revision.txtecho ******This time we bakcup from $LOWER to $UPPER****** >> $Log_PATH/$name/$name.logecho ******Back up ended****** >> $Log_PATH/$name/$name.logdone*********************************************************************************************#!/bin/sh##Subversion的安装目录及执行文件SVN_HOME=/usr/local/subversion/binSVN_ADMIN=$SVN_HOME/svnadminSVN_LOOK=$SVN_HOME/svnlook##配置库根目录SVN_REPOROOT=/zsvn/svnroot##备份文件存放路径date=$(date '+%Y%m%d')BAK_STORE=/zsvn/bakfull/$dateif [ ! -d "$BAK_STORE" ];thenmkdir -p $BAK_STOREfi##读取项目库列表cd $SVN_REPOROOTfor name in $(ls)do##开始做全量备份$SVN_ADMIN hotcopy $SVN_REPOROOT/$name $BAK_STORE/$namedone 本文转自 guowang327 51CTO博客,原文链接:http://blog.51cto.com/guowang327/1739146,如需转载请自行联系原作者
“抠门” 尽管思科总部的办公楼、实验楼有好几十座,而公司领导却只占据其中一隅。从总裁钱伯斯,到所有高层都只有一间背阴的小办公室,外带一间能放几把椅子的小会议室;来自世界各国的行业、金融分析师们来到思科参观,而午餐却只是盒饭——计有三明治两片、苹果一个、巧克力和点心各一块;为了控制支出,包括钱伯斯在内的思科所有员工,出差住宿都要遵循统一标准,超标部分,电脑会自动从工资中扣除;虽然思科年销售额将近200亿美元,即使受IT行业整体不景气的影响,上财年赢利仍有19亿美元,而在员工休息室里,却赫然张贴着这样的告示:每人每天少喝一瓶饮料,公司一年便可节约240万美元; 2003年,思科通过各种手段降低的开支高达19.4亿美元。思科三万多名员工,个个都有公司股份,公司“抠”出效益,大家都受益。思科也有不“死抠”的时候:在行业不景气的情况下,公司2003财年仍将33亿美元资金投入研发;思科员工会将没喝完的矿泉水装入背包以防浪费,会将饮料和雪糕用来热情待客。公司会投入上百万美元进行员工培训,以在行业好转的时候迅速拉开和竞争对手的差距。 思科“抠门”应作如是观:当花则花,能省必省,一切为企业发展。 平等 思科办公室,无论员工级别高低,面积相差无几,且级别高的要坐在中间地带,把临窗向阳的地方让给普通员工;思科公司总部,不设高级管理层专用车位,即使是约翰·钱伯斯也一样得自己到处找停车位;思科所有员工出差,一律坐经济舱。若有人要享受商务舱的舒适,需自己补足两者差价,就连钱伯斯的专用商务机也是自己掏腰包买的,思科只为他提供相同里程的经济舱机票费作补助。 在思科曾收购的企业中,很多高层都留在了思科,而没有另立门户。谈及个中缘由时,有人说:“约翰与我们完全平等,假如他把我们看成下属的话,我们可能早就离去了。” 贯穿其中的是“平等”精神。思科在企业中能够始终弘扬平等精神,对于企业的发展来说既关键且珍贵。 空间 在思科,从秘书的职位做到高层经理,这不是一个童话。公司会最大程度地给予员工发展的空间,只要敢于发挥你的才能,并让公司注意到,每个员工的成材之路都有章可循。员工可以在公司部门之间频繁转换岗位,直到找到最适合自己的岗位为止。然而,在“灰姑娘”成为“公主”之前,你也不会感到任何不平等:与高层领导享用同样大小的办公空间,出差坐同样等级的舱位,世界各地每个员工的股票与在美国的员工一样多,即使是一名新到公司的员工,都会收到总裁钱伯斯从美国寄来的签名欢迎信,新员工到公司的周年纪念日还会收到纪念品。 小卡片 思科员工喜欢用一条小链子将一张印有思科公司介绍的卡片与公司证件系在一起。有些员工还将所有在思科工作期间积累的卡片拴在一起,其中有参加公司各类培训的证明,本地区发展的战略规划等。卡片越多,标志这名员工的工作经历及参与公司的活动越多。 这张塑料卡片只有名片大小,一面是公司的远景规划及使命:互联网正在改变我们的工作、生活、娱乐和学习方式;通过开创全新的价值和机遇,为我们的客户、员工、投资者以及生态系统合作伙伴塑造互联网的未来。另一面讲述公司企业文化,诸如团队精神、品质第一、推动变革、开放交流等。这张小卡片被员工们随身携带着。它时刻提醒员工们,“工作着是快乐的”,为了实现这个目标,思科公司也出台了各种措施来帮助员工解除后顾之忧。 思科高层说 “思科对员工的高度信任和充分授权,使员工能够面临更多的挑战,而不是一成不变的工作。思科的激励机制也努力调动员工的积极性。在思科,没有员工会懈怠,也没有人能坐享其成。有人说,全世界工作最繁忙的是思科人,但思科人也是全世界最自由的,他们不必在框架的约束下工作,而是自己给自己安排日程表。这种充满热情、进取的企业文化,也是思科能够不断取得成功的原因。此外,作为一家网络解决方案供应商,我们利用网络变革了公司的工作流程、管理方式及企业文化,令我们变得更有效率和竞争力。” 思科员工说 “说到高效率,思科的三件事是无人不知的。一是voicemail,规定员工8小时内一定要听、要回。老板有什么新指令,基本都通过这个来传发,因为它既快又能带上老板的语气;二是email,我们一收到,就随时check和回复;三是meeting maker。思科所有人都把自己的时间表放上去,细至每15分钟一个时间段。任何事情通过网络都会非常快,譬如出差。经理们一般不会介入到出差或报销的流程中去。我们可以通过网络迅速搞定出差行程,任意选择航班、汽车和酒店。出差回来后,通过一个报销自动程序,每个人将报销单输入电脑,不需任何人监督,公司马上会自动将报销费给你。” 作为思科商业管理文化的一部分,其成功的收购策略,填补了自主研发未来产品的一些空白,把整个硅谷作为自己实验室的一部分 本文转自 霜寒未试 51CTO博客,原文链接:http://blog.51cto.com/51bbs/148215,如需转载请自行联系原作者
------https://github.com/chenchaojie---- ---https://github.com/JanHuang----- -----https://github.com/LinkedDestiny----- -----https://github.com/kcloze-------- --------https://github.com/osgochina------ -----https://github.com/swoole/swoole-docs------ -------https://github.com/tmtbe------- -----------https://github.com/qq8044023/taskPHP------------- ------https://www.oschina.net/news/88861/php-msf-3-0-2----- ---------------------https://www.oschina.net/p/php-msf----------------------- -------------https://yeasy.gitbooks.io/docker_practice/content/compose/------------------- -----------------http://laradock.io/--------------------- 23。。。。 jmeter http://pan.baidu.com/s/1dFmfjax 9jhh http://jmeter.apache.org/ 32。。。 老男孩Linux企业级Nginx负载均衡与keepalived 高可用实战视频教程 http://pan.baidu.com/s/1kVsEEv9 Occj 72。。。。 http://pan.baidu.com/s/1i58vdel ---- nwn3 大规模高性能分布式存储系统设计与实现视频教程、负载均衡 本文转自 skinglzw 51CTO博客,原文链接:http://blog.51cto.com/skinglzw/1958055,如需转载请自行联系原作者
setclLvalue(L, L->top, cl); 这是个宏展开是这样: ((L->top)->value_).gc = obj2gco(cl); //top valud gc 设置为 clsour的 gc (L->top)->tt = ctb(LUA_TLCL) //设置top的值为 checkliveness(L,io); //做一个检测操作 这个函数的功能是 设置state L 的TOP的gc为clousre的gc并设置类型为closure. luaD_inctop 将luastate top+1 也就是将top指针再上指一下 出处:http://www.cnblogs.com/zhangdongsheng/ 作者:张东升
ddd 安装heartbeat 普通yum源装不了 rpm -qa |grep epel 使用epel 源来安装 需先更新下面的阿里源才能安装 yum install heartbeat* -y 上不了网 route -n 查看路由 cat /etc/resolv.conf echo "nameserver 8.8.8.8" >> /etc/resolv.conf yum 源 用阿里de mirrors.aliyun.com 安装heartbear 之前需要的设置如下图 把rmp 包留存下来 ,默认会把rpm 包删掉的 yum install heartbeat -y 不要 装这3个就可以了 tree /var/cache/yum/x86_64/6/ LANG=EN 本文转自 skinglzw 51CTO博客,原文链接:http://blog.51cto.com/skinglzw/2063005,如需转载请自行联系原作者
oracle rman冷备shell脚本(我这里是全备份,创建了2个通道c1、c2)可以在这基础上更改 文本: #!/bin/bash #Author:wangergui Email:291131893@qq.com Date:2016-08-17 #Function:oracle_rman_cold_backup ( Full backup ) [ "${USER}" == "oracle" ] || exit 2 [ ! -d ${ORACLE_BASE}/myrman ] && mkdir ${ORACLE_BASE}/myrman rman target / <<END shutdown immediate; startup mount; run{ shutdown immediate; startup mount; allocate channel c1 type disk; allocate channel c2 type disk; #通道只能在run块儿中定义,不能单独定义,所以要使用run块儿! backup database format '${ORACLE_BASE}/myrman/%d_%s.bak'; alter database open; release channel c1; release channel c2; } END 本文转自 wangergui 51CTO博客,原文链接:http://blog.51cto.com/wangergui/1839737,如需转载请自行联系原作者
今天在虚拟机上安装oracle10g,默认的swap交换空间不满足安装的最低要求,因为我分配的物理内存是1G,那么就按照要求需要2G的swap交换空间,默认只有1G的交换空间。添加swap交换空间的步骤如下: 第一步:确保系统中有足够的空间来用做swap交换空间,我使用的是vmware,准备在一个独立的文件系统中添加一个swap交换文件,在/opt/image中添加2G的swap交换文件 第二步:添加交换文件并设置其大小为2G,使用如下命令 [root@oracle ~]# mkdir /opt/image [root@oracle ~]# dd if=/dev/zero of=/opt/image/swap bs=1024 count=2048000 2048000+0 records in 2048000+0 records out 第三步:创建(设置)交换空间,使用命令mkswap [root@sense image]# mkswap /opt/image/swap Setting up swapspace version 1, size = 2097147 kB 第四步:检查现有的交换空间大小,使用命令free [root@oracle /]# free -m total used free shared buffers cached Mem: 1010 997 13 0 4 802 -/+ buffers/cache: 190 820 Swap: 799 0 799 第四步:启动新增加的2G的交换空间,使用命令swapon [root@sense image]# swapon /opt/image/swap 第六步:确认新增加的2G交换空间已经生效,使用命令free [root@oracle /]# free -m total used free shared buffers cached Mem: 1010 996 14 0 4 800 -/+ buffers/cache: 191 819 Swap: 2799 0 2799 第五步:修改/etc/fstab文件,使得新加的2G交换空间在系统重新启动后自动生效 在文件最后加入: /opt/image/swap swap swap defaults 0 0 [oracle@oracle ~]$ cat /etc/fstab /dev/VolGroup00/LogVol00 / ext3 defaults 1 1 LABEL=/boot /boot ext3 defaults 1 2 tmpfs /dev/shm tmpfs defaults 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 /dev/VolGroup00/LogVol01 swap swap defaults 0 0 /opt/image/swap swap swap defaults 0 0 mount -a OK,系统的swap交换空间添加成功 本文转自 xxl714 51CTO博客,原文链接:http://blog.51cto.com/dreamgirl1314/1024745,如需转载请自行联系原作者
一.网络字节序与主机字节序 1.大端和小端存储 大端(Big Endian):高位存低地址。符合人类的正常思维。网络字节序采用大端(网络传输的是字节流)。 小端(Littile Endian):低位存低地址。 如果将一个32位的整数0x12345678存放到一个整型变量(int)中,这个整型变量采用大端或者小端模式在内存中的存储由下表所示。 --------------------------- 地址偏移 大端模式 小端模式 0x00 12 78 0x01 34 56 0x02 56 34 0x03 78 12 --------------------------- 如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。 --------------------------- 地址偏移 大端模式 小端模式 0x00 12 34 0x01 34 12 --------------------------- 例: int main(int argc,char** argv) { int num = 0x12345678; unsigned char* pc = (unsigned char*)(&num); printf("local order:\n"); printf("[0]: 0x%X addr:%u\n", pc[0], &pc[0]); printf("[1]: 0x%X addr:%u\n", pc[1], &pc[1]); printf("[2]: 0x%X addr:%u\n", pc[2], &pc[2]); printf("[3]: 0x%X addr:%u\n", pc[3], &pc[3]); num = htonl(num); printf("htonl order:\n"); printf("[0]: 0x%X addr:%u\n", pc[0], &pc[0]); printf("[1]: 0x%X addr:%u\n", pc[1], &pc[1]); printf("[2]: 0x%X addr:%u\n", pc[2], &pc[2]); printf("[3]: 0x%X addr:%u\n", pc[3], &pc[3]); return 0; } SPARC平台上的输出: local order: [0]: 0x12 addr:4290770212 //高位字节存放在低地址处,则是大端法; [1]: 0x34 addr:4290770213 [2]: 0x56 addr:4290770214 [3]: 0x78 addr:4290770215 //低位字节存放在高地址处; htonl order: [0]: 0x12 addr:4290770212 //由此看出,主机字节序与网络字节一样; [1]: 0x34 addr:4290770213 [2]: 0x56 addr:4290770214 [3]: 0x78 addr:4290770215 X86平台上的输出: local order: [0]: 0x78 addr:4289157020 //低位字节存放在低地址处,则是小端法; [1]: 0x56 addr:4289157021 [2]: 0x34 addr:4289157022 [3]: 0x12 addr:4289157023 //高位字节存放在高地址处; htonl order: [0]: 0x12 addr:4289157020 //由此看出,主机字节序与网络字节不一样; [1]: 0x34 addr:4289157021 [2]: 0x56 addr:4289157022 [3]: 0x78 addr:4289157023 2.字节序转化使用htons()还是使用htonl()?还是两者都不行? 首先这两个函数不是随便使用的,单字节数据无需也不能转化,2字节数据只能使用htons()转换,4字节数据只能使用htonl() 原因:例子:对于2个short数据0x1234和0x5678,存储如下 --------------------------- 地址偏移 大端模式 0x00 12 0x01 34 0x02 56 0x03 78 如果使用long 转化函数。发送端假如为大端,则0x1234 0x5678使用htonl()转化成网络字节序后,任然为0x1234 0x5678; 接收端如果为小端,使用ntohl()转化后变为0x5678,0x1234这两个数据交换了位置。 --------------------------- 地址偏移 小端模式 0x00 78 0x01 56 小端0x5678 0x02 34 0x03 12 小端0x1234 --------------------------- 所以2字节和4字节的转换不能混用。那么问题来了,8字节的double,怎么转换? 解答:如果当前主机为小端,接收时先使用ntohl()转换前4字节,再使用ntohl()转换后4字节,然后交换前后4字节。 在使用socket传输类于T_WfsTpMsg结构体的数据时,msg部分由于转换时不确定数据类型,给转换带来了难度,所以一定要定义好msg的数据类型,方便转换。msg最好能是字符。 转化错了会存在倒序的问题。 3.字节对齐对字节序的影响 如结构体 #pragma pack(4) typedef struct { char a; int b; }AM; void main(void) { AM a={1,2}; unsigned char *p=(unsigned char *)(&a); int i=0; while(i<8) { printf("%4X",(INT)p[i]); cout<<endl; i++; } } 打印该结构体数据保存为:(大端) 1 CC CC CC 2 0 0 0 htonl(*((int *)(&a)))==30198988==0x01CCCCCC !=1 所以如果使用&AM指针,像msg一样用htonl()来转化,那么肯定错了。msg申明了#pragma pack(1),这样使得数据的存储是紧凑的,虽然可以规避该问题,但那样不分数据类型直接全部使用htonl()转换,任然存在一些问题。 二、字节对齐 如何修改编译器的默认对齐值? 1.在VC IDE中,可以这样修改:[Project]|[Settings],c/c++选项卡Category的Code Generation选项的Struct Member Alignment中修改,默认是8字节。 2.在编码时,可以这样动态修改:#pragma pack(2) .注意:是pragma而不是progma. 字节对齐可能带来的隐患:代码中关于对齐的隐患,很多是隐式的。比如在强制类型转换的时候。例如: unsigned int i = 0x12345678; unsigned char *p=NULL; unsigned short *p1=NULL; p=&i; *p=0x00; p1=(unsigned short *)(p+1); //在有些CUP的体系结构,不支持字节非对齐访问。 *p1=0x0000; 最后两句代码,从奇数边界去访问unsignedshort型变量,显然不符合对齐的规定。 在x86上,类似的操作只会影响效率,但是在MIPS或者sparc上,可能就是一个error,因为它们要求必须字节对齐. 如何查找与字节对齐方面的问题: 如果出现对齐或者赋值问题首先查看 1. 编译器的big little端设置 2. 看这种体系本身是否支持非对齐访问 3. 如果支持,看设置了对齐与否,如果没有则看访问时需要加某些特殊的修饰来标志其特殊访问操作。 结构体所占用的存储单元数的计算(即使用sizeof所计算出来的大小)- 字节对齐:即各个数据类型的地址从哪里开始,以及占多少个存储单元。 2个定理:(解决所有问题) 同步定理:结构体自身和有效对齐与最大成员同步 整数倍定理:结构体或普通数据类型的起始内存地址为有效对齐字节的整数倍,并且结构体或普通数据类型所占字节数一定是其有效对齐字节的整数倍 1.首先结构体中的3个对齐概念: 数据类型自身对齐:32位系统中char 1,short 2,int 4,long 4,float 4,double 8 数据类型指定对齐:使用#pragma pack(x) 指定的系统使用x字节对齐方式。 数据类型有效对齐:数据类型自身对齐与指定对齐中较小者作为数据类型的有效对齐字节数。 同步定理:结构体自身和有效对齐与最大成员同步 2.各个数据类型所占内存的字节数计算 #pragma pack(x) char:起始地址(有效对齐)为1和x中较小者,占1个字节 short: 起始地址(有效对齐)为2和x中较小者,占2个字节 int: 起始地址(有效对齐)为4和x中较小者,(如果x=2,则地址位于2的整数倍位置),占4个字节 double: 起始地址(有效对齐)为8和x中较小者,(如果x=4,则地址位于4的整数倍位置),占8个字节 整数倍定理:结构体或普通数据类型的起始内存地址为有效对齐字节的整数倍,并且结构体或普通数据类型所占字节数一定是其有效对齐字节的整数倍 3.结构体所占字节数计算 分3步计算: (1)分别计算各个成员所占的内存空间(这个对于简单数据类型int/char等是固定的,但对于结构体需要计算得出)。 (2)以初始地址0为坐标,按有效对齐(起始地址),依次放置各个成员;计算第一个成员到最后一个成员的内存长度。 (3)根据定理(结构体所占字节数一定是其有效对齐字节的整数倍),补齐内存长度,即为最后结构体所占的内存长度。 以struct A{int a;char b;short c;char d;};结构体为例#pragma pack(4) 1.各成员所在内存地址及所占字节(该计算与结构体无关):int 0:4;char 4,1;short 6:2,char 8:1 一共占了9个地址空间 2.结构体有效对齐与成员中自身对齐最大的成员的有效对齐相同为:成员中最大的为4,指定对齐为4,故有效对齐为4(两者中较小者),所以最后结构体所占的内存空间一定是4的整数倍 3.所以结构体所占的字节数为 (9/4+1)*4=12 ,上述结构体与struct A{int a;char b;short c;char d;char e;char f;};所占的空间是一样的。 计算结构体大小时回答3个问题: 1.各成员占几个字节 2.各成员起始地址从哪里开始(由有效对齐值决定) 3.结构体所占空间是几的整数倍 struct A{ //#pragma pack(4) int a; //0:4 char b;//4:1 short c;//6:2 char d;//8:1 int e;//12:4 char f://16:1 最后占了17个字节,结构体所占空间是4的整数倍,故该结构体占20个字节 }; struct A{ //#pragma pack(2) int a; //0:4 char b;//4:1 short c;//6:2 char d;//8:1 int e;//10:4 char f://14:1 最后占了15个字节,结构体所占空间是2的整数倍,故该结构体占16个字节 }; struct A{ //#pragma pack(1) int a; //0:4 char b;//4:1 short c;//5:2 char d;//7:1 int e;//8:4 char f://12:1 最后占了13个字节,结构体所占空间是1的整数倍,故该结构体占13个字节 }; 本文转自 a_liujin 51CTO博客,原文链接:http://blog.51cto.com/a1liujin/1684314,如需转载请自行联系原作者
一、 命令学习 1、echo $SHELL 查看使用何种shell 2、getent passwd 显示所有用户 3、touch /etc/nologin 可使普通用户无法登陆 4、type + command 查看该命令是内部还是外部命令 5、enable -n +内部命令 禁用该内部命令 enable 内部命令 启用该内部命令 6、hash -d ifconfig 清除hash中的ifconfig命令 7、tty 查看用户登录终端号。例如:dev/pts/0 8、init init命令是Linux下的进程初始化工具,init进程是所有Linux进程的父进程,它的进程号为1。init命令是Linux操作系统中不可缺少的程序之一,init进程是Linux内核引导运行的,是系统中的第一个进程。 init0表示停机 init1单用户模式 init2多用户模式,没有NFS(和级别3相似,会停止部分服务)init3 完全多用户模式 init4 没有用到 init 5x11(Xwindow) init6 重新启动 与之相关的命令: 查看系统进程命令:ps -ef |head 查看init的配置文件:more /etc/inittab 查看系统的运行级别:runlevel 9、df 查看分区 10、cal 查看日历 cal 9 1752 11、cat 命令用来连接文件并打印到标准输出设备上 -n或-number:有1开始对所有输出的行数编号; -b或--number-nonblank:和-n相似,只不过对于空白行不编号; -s或--squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行; -A:显示不可打印字符,行尾显示“$”; -e:等价于"-vE"选项; -t:等价于"-vT"选项; 12、clear 清屏 13、ls 用于打印目录列表 ls -l -a -a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出); -A:显示除影藏文件“.”和“..”以外的所有文件列表; -C:多列显示输出结果。这是默认选项; -l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列; -F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符; -b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出; -c:与“-lt”选项连用时,按照文件状态时间排序输出目录内容,排序的依据是文件的索引节点中的ctime字段。与“-l”选项连用时,则排序的一句是文件的状态改变时间; -d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表; -f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果; -i:显示文件索引节点号(inode)。一个索引节点代表一个文件; --file-type:与“-F”选项的功能相同,但是不显示“*”; -k:以KB(千字节)为单位显示文件大小; -l:以长格式显示目录下的内容列表。输出的信息从左到右依次包括文件名,文件类型、权限模式、硬连接数、所有者、组、文件大小和文件的最后修改时间等; -m:用“,”号区隔每个文件和目录的名称; -n:以用户识别码和群组识别码替代其名称; -r:以文件名反序排列并输出目录内容列表; -s:显示文件和目录的大小,以区块为单位; -t:用文件和目录的更改时间排序; -L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录; -R:递归处理,将指定目录下的所有文件及子目录一并处理; --full-time:列出完整的日期与时间; --color[=WHEN]:使用不同的颜色高亮显示不同类型的。 14、chvt number 切换虚拟终端 15、pwd 查看用户当前所在目录 16、lscpu 查看CUP的情况 17、lsblk查看分区 18、cat /proc/meminfo 查看内存 19、strace 系统调用 20、logout 命令用于退出当前登录的Shell,logout指令让用户退出系统,其功能和login指令相互对应。21、exit 退出 exit命令同于退出shell,并返回给定值。在shell脚本中可以终止当前脚本执行。执行exit可使shell以指定的状态值退出。若不设置状态值参数,则shell以预设值退出。状态值0代表执行成功,其他值代表执行失败。 22、nano 字符终端文本编辑工具,适合新手 gedit文本编辑工具 vim 23、date +%F 显示年月日 实例:利用touch `date +%F`.log 生成每天的日志 24、touch f1 f2 f3 相当于 touch f{1,2,3,4,5} touch f{1,2,3,4,5}.{text,log} 25、显示昨天的日期 date -d yesterday +%F date -d ‘-2 day’ +%F date -d ‘+2 day’ +%F 26、history cat .bash_history 断网不会很快的写入文件,如果断电 重新执行某条命令 !100执行第100条命令!-4 !!执行上一个命令。!-1也可。ctrl +p也可以 !?go 执行命令中带go的最近的命令。 搜索历史命令 ctrl+R键。 !! !-1 向上键 ctrl+p cat /etc/issue !$前一条命令的参数 按住esc松手 加 . 按住alt不松手 敲. !^上一条命令的第一个参数 !$上一条命令的最后一个参数 ll!*将上一个命令的所有参数都能调出 !:2 把上一个命令的第二个参数调出 unalias ls 取消别名 alias >hash> !n:^调用第n条命令的第一个参数 !n:$调用第n条命令的最后一个参数 !n:m调用第n条命令的第m个参数 !n:*调用第n条命令的所有参数 cat !l:3调用以l开始的命令的第三个参数 echo $HISTSIZE 查看历史记录有多少 history -d 155删除命令记录 history n显示最近的n条记录 history -c清空的是内存的记录 若要删除所有记录(文件、内存) 首先,rm -f .bash_history ,删除文件,再次,history -c history -a 追加本次回话新执行的命令是文件 history -n读历史文件中未读过的行到历史列表 -r: 读历史文件附加到历史列表 -w:保存历史列表到指定的历史文件 -p:展开历史参数成多行,但不存在历史列表中 -s:展开历史参数成一行,附加在历史列表后 变量修改是临时生效的 HISTTIMEFORMAT=’%F %T ’ 可以为命令设置时间 存放位置 /etc/profile(针对所有用户) 或者~/.bash_profile alias vinet=’vim /etc/sysconfig/network-scripts/ifcfg-eth0’ .bashrc 别名的存放位置 alias grep=”grep --color=auto” alias vi=vim HISTIGNORE=’passwd:pwd’ 忽略这些命令 HISTIGNORE=’cat*’ HISTCONTROL= “ignoredups” HISTCONTROL=”ignorespace” HISTCONTROL=”ignoreboth” echo centos |passwd --stdin wang更改wang用户的口令 27、查看目录结构的命令tree 1、tree的安装:rpm -i/media/Centos_6.8_Final/Packages/tree-1.5.3-3.el6.x86/-64.rpm rpm -i /run/media/root/CentOS 7 x86_64 2、tree的常见使用 tree -d 只列目录,不列文件 tree -d -L 1 / 只列一级目录 文件系统对大小写敏感与否,而非linux对大小写敏感。 /boot :引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放于此目录 /bin:供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序。 /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序 /lib:启动时程序依赖的基本共享库文件以及内核模块文件(、lib/modules) /lib64:专用于x86_64系统上的辅助共享库文件存放位置 /etc:配置文件目录 /home/USERNAME:普通用户家目录 /root:管理员的家目录 /media:便携式移动设备挂载点 /mnt:临时文件系统挂载点 /dev: 设备文件及特殊文件存储位置 b:block device,随机访问 c:character device,线性访问 /opt:第三方应用程序的安装位置 /srv:系统上运行的服务用到的数据 /tmp:临时文件存储位置 二、使用帮助的实现 第一步:使用type先去判断是内部命令还是外部命令 第二部:内部命令可以使用help + command 外部命令可使用command --help 或者man command或者 info command 注意:在第二步的操作中,假如是外部命令,可以使用whatis +命令去判断要查询的命令在man手册的第几页。 whatis数据库等一段时间。centos7使用man db创建数据库,centos6使用makewhatis. whatis rm 可以知道这个命令大概的作用。不够详细。 man 5 passwd 列出第五章的帮助,可以利用whatis command查看哪些章节有帮助 man命令介绍 man的章节 1:用户口令 === 2:系统调用 3:C库调用 4:设备文件及特殊文件 5:配置文件格式 === 6:游戏 7:杂项 8:管理类的命令 === see also 可以参考别的帮助 man中也支持搜索可以 /+keyword 按q退出 --help得到的帮助是一个大概的描述,man得到的帮助时详细的 apropos 用于搜索whatis数据库 man -M 指定路径 需要修改配置文件 man -a command 可以列出命令的所有帮助 man命令的操作方法,使用less命令实现 info帮助也常用,也非常详细 通过本地文档查询 README 文档 第三方程序官方文档,如红帽 http://kbase.redhat.com http://www.redhat.com/docs http://access.redhat.com the linux document project Openstack filetype:pdf 以PDF形式搜索 man -f 等价于whatis 如果想要了解详细用法 内部命令使用help 命令 help command 举例:help -m cd 外部命令使用command --help man帮助 whereis ls 可以看到放置man帮助的路径。 .gz代表压缩文件、红色 /uar/share/man man的存放路径 passwd 是用来改口令的。 本文转自 ping9527 51CTO博客,原文链接:http://blog.51cto.com/babyhanggege/1830400,如需转载请自行联系原作者
一、ls命令 列出目录内容(默认按照数字,小写字母,大写字母排序),使用man ls 和ls --help查找ls手册 -a,打印所有目录 -A,打印所有目录但不包括. .. -s, --block-size=MB,以兆为单位 -h,易读的格式 -R,递归 -d, 只显示目录本身 -1,分行显示 -S,按照文件大小从大到小排序 -r,文件从小到大排序 -U,按照目录里存放的次序 -u,配合t来使用。 课堂练习:按照修改时间列出目录和文件 2、将文件大小转换成人易读的文件大小 3、一个可以这么做的参数是--si。这个参数和-h参数类似,但是-si以1000为单位,而-h以1024为单位。 二、stat命令 查看文件状态 access是指访问时间access time是文档最后一次被读取的时间。因此阅读一个文档会更新它的access时间,但它的modify时间和change时间并没有变化。cat、more 、less、grep、sed、tail、head这些命令都会修改文件的access时间。 modify是文本本身的内容发生了变化。 change是指文档的索引节点(inode)发生了改变(比如位置、用户属性、组属性等);chmod, chown,create,mv等动作会将Linux文件的change time修改为系统当前时间 我使用nano对某个文件进行了写入操作,结三者时间均发生了变化,且access的时间早于modify和change的时间。这是因为访问时间就是指你进入文件的时间,改完内容后,退出的时间不计入访问时间。 在使用touch后,三个时间全部发生变化。更新为最新的时间。 然后紧接着使用了cat命令,读取了一下相关文件的内容,发现改变的确实只有访问时间。 通过此命令可以修改时间touch -t 201010010908 文件名,此时改动的时间为access和modify。 对文件内容追加的命令 echo mtime is change >> filename将文件内容追加至文件 三、glob命令 文件通配符 *匹配零个或者多个字符 ?匹配单个字符 ~当前用户家目录 ~username用户家目录 ~+当前工作目录 ~-前一个工作目录 [0-9]匹配一个数字范围 [a-z]既包含大写,也有小写 [A-Z]既包含大写,也有小写 [weq]匹配其中任意一个的字符 [^weq]刨除列表中的所有字符以外的字符 [:digit:]一个数字 [:lower:]一个小写字母 [:upper:] [:alpha:]一个字母 [:alnum:]数字和字母 四、touch命令 创建空文件或者刷新时间戳 -a 只刷新access time -c 存在的文件只刷新时间,不存在的文件会创建新的文件 在使用touch后,三个时间全部发生变化。更新为最新的时间。 touch -t 200810101930.20 filename touch -d yesterday filename 小知识:echo $PWD显示目录 echo $? 判断上条命令是否成功执行 cd -P init.d 切换至实际的目录(注:init.d为软链接文件) cd ~wang切换到wang的家目录 五、cp命令 复制文件或者目录的命令 -a 保留相关属性,同时要注意权限的问题,不是所有属性都会保留下来 -i 交互式 -r,-R 递归复制目录及内部所有内容 -a 归档,相当于-dR--preserv=all -d不复制原文件,只复制链接名 -p保留原文件的相关属性 -v 显示过程 -f 强制、 我在同一目录下将A文件复制到同目录下文件名也为A的文件。这个操作会有提示。为了验证操作是否确实执行,我利用stat查看文件时间,并且利用echo $?进行判定。发现这个操作确实没有发生。 六、tree命令 tree显示目录树 -d 只显示目录不显示文件; -L level:显示的层级树 七、mkdir命令 创建目录 -p,存在于不报错,且可以自动创建所需的歌目录 -v,显示详细信息 -m,创建目录时直接指定权限 rmdir,删除空目录,用法与mkdir相似。 *简单实用的小技巧 技巧一:生成随机数 echo $[$RANDOM%80] 技巧二:闪烁字段 echo -e “\033[41:32:5m***\033[0m” 技巧三:触发对新硬盘搜索 cd /sys/class/scsi_host/host2/ echo “- - -” > /sys/class/scsi_host/host2/scan 技巧四:查看某一目录大小 du -sh /usr 技巧五:在root的家目录下,通过nano 创建了一个 -h的文件,如何删除? rm /root/-h -f 技巧六:通过零设备创建文件 dd if=/dev/zero of=/etc/filename bs=1k count=2 hexdump -v f1查看二进制文件 hexdump -C f1 查看十六进制 技巧七:如何在用户访问文件程序时进行安全地删除文件操作 > /testdir/f1 学习扩展:小工具的安装 二进制编辑工具hexedit安装rpm -i /run/media/root/CentOS\7\x86_64/Packages/hexedit-1.2.13-5.el7.x86_64.rpm 二进制转换工具dos2unix安装rpm -i /run/media/root/CentOS\7\x86_64/Packages/dos2unix-6.0.3-4.el7.x86_64.rpm 本文转自 ping9527 51CTO博客,原文链接:http://blog.51cto.com/babyhanggege/1831670,如需转载请自行联系原作者
什么是NIC Teaming? NIC Teaming 就是将两个或更多的网络适配器组合在一起,从而达到容错和带宽聚合作用。NIC Teaming 中的每个网络适配器都是物理存在的(虚拟机中的网络适配器也算物理存在的,因为需要绑定物理网卡。)并且各自连接独立的网络电缆。 在Windows Server早期的版本中,NIC Teaming只能通过第三方软件来实现,例如Intel。然而在Windows Server 2012 R2中,NIC Teaming 可以直接通过系统实现,而不需要安装额外的软件和硬件。 NIC Teaming 的优点 随着网络的发展,我们容忍服务器离线的时间也越来越短,甚至为0。在Windows Server 2012 R2中通过使用NIC Teaming技术,将多个网络适配器组成一个Team(组)进行工作,即使其中一个网络适配器出现故障,另一个依然可以工作,保持网络的连通性。 也可以使用该技术将多个网络适配器组合成一个逻辑(虚拟)的网络适配器,从而达到更高的网络吞吐量。例如,一个服务器上面有两个1Gbps的网络适配器,将它们组合成一个逻辑的网络适配器后,那么此时的网络适配器的速度是2Gbps。 配置NIC Teaming 在Windows Server 2012 R2中部署NIC Teaming有三种“成组模式”。 静态成组 也叫做交换机依赖组,由于这种NIC组合需要交换机参与到组合中,所以NIC组中的所有适配器都必须连接到相同的交换机上面,不能分散在多个不同的交换机上。需要交换机支持IEEE802.3ad标准。 交换机独立 该NIC组合无需交换机参与到组合中,所以每个适配器可以连接到不同的交换机,也在交换机级别提供了基本的容错。 LACP 链路汇聚控制协议(Link Aggregation Control Protocol,LACP),该组合可以自动将多个NIC组合成一股逻辑(虚拟)的网络适配器。需要交换机支持LACP,并设置为活动。 选择好成组模式后,还需要选择使用哪种负载平衡模式,Windows Server 2012具有如下三种负载均衡模式。 地址哈希 NIC组接收到一个数据包后,首先对其进行检查,然后对目的地址的信息(如,IP地址、端口等)通过哈希算法,根据结果NIC组决定将数据包通过那个NIC发出。由于是通过哈希算法,无法控制流量走向,大量数据会流向同一个网卡。 Hyper-v端口 如果你的服务器运行多个hyper-v虚拟主机的时候,建议使用此模式。当使用该模式后,虚拟机会将数据通过外部虚拟交换机发送到特定的NIC上,从而使数据有更好的预测性。 动态 流量可以通过一个叫做Flowlets的概念来实现动态LBFO,这个概念实际上就是将一个大的数据包分割成多个较小的数据包,通过不同NIC发送出去。 在Windows Server 2012 R2中创建和管理NIC Teaming是个非常简单的事情,可以通过图形界面或Powershell来完成。 1、打开服务器管理器,选择左边的“本地服务器”;可以看到“NIC组合”默认选项是“已禁用”;选择“已禁用”; 2、打开NIC组合窗口后,在服务器选项下面选择服务器(使用服务器管理器管理多个服务器的时候),可以通过“组”选项的任务窗口选择“新建组”,或通过选择“适配器和接口”选项中,选择要添加到组的网卡,选择“添加到新组”;如果要添加网卡到已有组可以通过选择左边的组,右击右边的网卡,右击选择“添加到选定组”(添加网卡到先有组可以通过右击现有组,然后选择“属性”,通过勾选,选择要添加到组的网卡。); 3、打开新建组窗口,在“组名称”对话框中输入组的名称,在“成员适配器”对话框中选择要添加到组的网络适配器;再其他属性中选择合适的模式;(注:除了“交换机独立”模式,其他模式都无法使用“备用适配器”; 4、此时可以在“组”选项卡中看到刚刚创建的额组;刚配置好,可能会出现警告,并且再右边会看到有一个网卡“已出错,连接挂起”;过十秒左右就会恢复正常。 5、这时会在网络连接窗口里面看到一个新的网络连接(NIC Teaming组的名称);右击查看已经添加到组的网络适配器的详细信息的时候,发现里面什么也没有,右击新网络连接的时候,可以看到详细信息里面的网络信息; 使用PowerShell创建NIC Teaming 使用“New-NetLbfoTeam”命令创建 参数说明: -Nameteam1 team1是创建NIC Teaming的组的名称; -TeamMembers Ethernet2,Ethernet3 Ethernet2,Ethernet3是网络连接的名字(本地连接); -TeamingMode Static Static即成组模式中静态成组【SwitchIndependent(交换机独立),LACP。】; -LoadBalancingAlgorithm dynamic dynamic即负载平衡模式中的动态【HyperVPort(hyper-v端口),这里的地址散列根据不同的哈希被分成了:TransportPorts(传输端口),IPAddresses(IP地址),MacAddresses(Mac地址)】; 更多关于“New-NetLbfoTeam”命令请查看: https://technet.microsoft.com/en-us/library/jj130847.aspx 在输入完命令,回车后,会有个确认提示,选择“Y”或“A”即可。 注意事项: 1、在物理服务器上,Windows Server 2012 R2最多只支持32个NIC Teaming; 2、在虚拟机(hyper-v)中,成组模式只支持“交换机独立”,负载平衡模式只支持“地址哈希”; 3、不支持这些类型的“网络适配器”:WLAN、Bluetooth、WWAN、Infiniband 4、只能在NIC上面组建组,不能在组的基础上创建组; 5、在虚拟机中,只支持两个网卡,但在实验测试时,可包含更多的网卡; 本文转自 as900 51CTO博客,原文链接:http://blog.51cto.com/yupeizhi/1678255,如需转载请自行联系原作者
saltstack的探索-grains 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 saltstack的探索-grains 利用grains可以得到主机的信息 [root@server200-21 salt]# salt '*' grains.items test230: ---------- SSDs: biosreleasedate: 08/14/2012 biosversion: V1.9 cpu_flags: - fpu - vme - de - pse - tsc - msr - pae - mce - cx8 - apic - sep - mtrr - pge - mca - cmov - pat - pse36 - clflush - mmx - fxsr - sse - sse2 - ht - syscall - nx - mmxext - fxsr_opt - pdpe1gb - rdtscp - lm - constant_tsc - rep_good - nopl - nonstop_tsc - extd_apicid - aperfmperf - pni - pclmulqdq - monitor - ssse3 - cx16 - sse4_1 - sse4_2 - popcnt - aes - xsave - avx - lahf_lm - cmp_legacy - svm - extapic - cr8_legacy - abm - sse4a - misalignsse - 3dnowprefetch - osvw - ibs - xop - skinit - wdt - lwp - fma4 - nodeid_msr - topoext - perfctr_core - arat - cpb - hw_pstate - npt - lbrv - svm_lock - nrip_save - tsc_scale - vmcb_clean - flushbyasid - decodeassists - pausefilter - pfthreshold cpu_model: AMD FX(tm)-8120 Eight-Core Processor cpuarch: x86_64 domain: ec.office fqdn: test230.ec.office fqdn_ip4: - 127.0.0.1 fqdn_ip6: gpus: |_ ---------- model: RV370 [Radeon X300] vendor: unknown host: test230 hwaddr_interfaces: ---------- eth0: d4:3d:7e:32:17:d1 lo: 00:00:00:00:00:00 id: test230 ip4_interfaces: ---------- eth0: - 192.168.1.230 - 192.168.1.249 lo: - 127.0.0.1 - 192.168.1.130 ip6_interfaces: ---------- eth0: - fe80::d63d:7eff:fe32:17d1 - 192.168.1.249 lo: - ::1 ip_interfaces: ---------- eth0: - 192.168.1.230 - 192.168.1.249 lo: - 127.0.0.1 - 192.168.1.130 ipv4: - 127.0.0.1 - 192.168.1.130 - 192.168.1.230 - 192.168.1.249 ipv6: - ::1 - fe80::d63d:7eff:fe32:17d1 kernel: Linux kernelrelease: 3.8.13-26.2.2.el6uek.x86_64 locale_info: ---------- defaultencoding: UTF8 defaultlanguage: en_US localhost: test230.ec.office machine_id: c9ec7e74ec20b51a158cd26500000015 manufacturer: MSI master: 10.0.200.21 mem_total: 7956 nodename: test230.ec.office num_cpus: 8 num_gpus: 1 os: OEL os_family: RedHat osarch: x86_64 oscodename: osfinger: Oracle Linux Server-6 osfullname: Oracle Linux Server osmajorrelease: 6 osrelease: 6.5 osrelease_info: - 6 - 5 path: /sbin:/usr/sbin:/bin:/usr/bin productname: MS-7693 ps: ps -efH pythonexecutable: /usr/bin/python pythonpath: - /usr/bin - /usr/lib64/python2.6/site-packages/thrift-0.9.0-py2.6-linux-x86_64.egg - /usr/lib64/python26.zip - /usr/lib64/python2.6 - /usr/lib64/python2.6/plat-linux2 - /usr/lib64/python2.6/lib-tk - /usr/lib64/python2.6/lib-old - /usr/lib64/python2.6/lib-dynload - /usr/lib64/python2.6/site-packages - /usr/lib64/python2.6/site-packages/gtk-2.0 - /usr/lib/python2.6/site-packages - /usr/lib/python2.6/site-packages/setuptools-0.6c11-py2.6.egg-info pythonversion: - 2 - 6 - 6 - final - 0 saltpath: /usr/lib/python2.6/site-packages/salt saltversion: 2014.7.0 saltversioninfo: - 2014 - 7 - 0 - 0 selinux: ---------- enabled: False enforced: Disabled serialnumber: To be filled by O.E.M. server_id: 549806356 shell: /bin/sh virtual: physical zmqversion: 3.2.4 本文转自 pcnk 51CTO博客,原文链接:http://blog.51cto.com/nosmoking/1613370,如需转载请自行联系原作者