Monthly Archives: 八月 2017

八月 27th, 2017

1    配置相关数据库

登录mysql

1
[root@web01 blog]# mysql -uroot -p123456

显示所有的数据库:

1
show databases;

显示如下:

1
2
3
4
5
6
7
8
9
10
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
test               |
+--------------------+
4 rows in set (0.05 sec)

用命令drop database test;把没有用的test数据库删除

1
2
mysql> drop database test;
Query OK, 0 rows affected (0.06 sec)

继续show databases;查看数据库数量

1
2
3
4
5
6
7
8
9
mysql> show databases;    
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

用命令create database wordpress;创建一个专用的数据库wordpress,用于存放blog数据。

1
2
mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)

用命令show databases;再查看数据库数量

1
2
3
4
5
6
7
8
9
10
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| wordpress          |
+--------------------+
4 rows in set (0.00 sec)

查看谁是数据库管理员select user();

1
2
3
4
5
6
7
mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

查看系统谁是系统管理员system whoami

1
2
mysql> system whoami
root

查看mysql数据库的所有用户select user,host from mysql.user;

1
2
3
4
5
6
7
8
9
10
11
12
mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
|      | localhost |
| root | localhost |
|      | web01     |
| root | web01     |
+------+-----------+
6 rows in set (0.00 sec)

创建wordpress用户针对于wordpress里面的所有表管理

grant all on wordpress.* to wordpress@’localhost’ identified by ‘123456’;

1
2
mysql> grant all on wordpress.* to wordpress@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

查询下刚刚增加的用户是否生效select user,host from mysql.user;

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql> select user,host from mysql.user;                                                       
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| root      | 127.0.0.1 |
| root      | ::1       |
|           | localhost |
| root      | localhost |
| wordpress | localhost |
|           | web01     |
| root      | web01     |
+-----------+-----------+
7 rows in set (0.00 sec)

查看用户对应的权限show grants for wordpress@’localhost’;

1
2
3
4
5
6
7
8
mysql> show grants for wordpress@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for wordpress@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wordpress'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |
| GRANT ALL PRIVILEGES ON `wordpress`.* TO 'wordpress'@'localhost'                                                 |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

刷新数据库,让权限生效flush privileges;

1
2
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

调整nginx+php

1
2
[root@web01 blog]# cd /application/nginx/conf/extra/
[root@web01 extra]# vim blog.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    server {
        listen       80;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.php index.html index.htm;
        }
        location ~ .*\.(php|php5)?$ {
            root   html/blog;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
    }

2    下载博客

输入地址:https://cn.wordpress.org/ 复制tar版本路径  https://cn.wordpress.org/wordpress-4.8.1-zh_CN.tar.gz

wKiom1mhrCPDGdgvAASDjkP3J3s188.jpg

然后再下载博客程序

1
2
[root@web01 extra]# cd /home/oldboy/tools
[root@web01 tools]# wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN.tar.gz

解压wordpress

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@web01 tools]# ll
total 212988
drwxr-xr-x 22 root root      4096 Aug 24 21:05 libiconv-1.14
-rw-r--r--  1 root root   4984397 Aug  8  2011 libiconv-1.14.tar.gz
-rw-r--r--  1 root root 185870973 Aug 23 19:57 mysql-5.5.49-linux2.6-x86_64.tar.gz
drwxr-xr-x  9 1001 1001      4096 Aug 19 16:11 nginx-1.6.3
-rw-r--r--  1 root root    805253 Apr  8  2015 nginx-1.6.3.tar.gz
drwxr-xr-x 17 1001 1001      4096 Aug 24 23:45 php-5.5.32
-rw-r--r--  1 root root  17773092 Aug 24 21:24 php-5.5.32.tar.gz
-rw-r--r--  1 root root   8641990 Aug  4 15:54 wordpress-4.8.1-zh_CN.tar.gz
[root@web01 tools]# tar xf wordpress-4.8.1-zh_CN.tar.gz 
[root@web01 tools]# ls wordpress
index.php        wp-admin              wp-content         wp-load.php      wp-signup.php
license.txt      wp-blog-header.php    wp-cron.php        wp-login.php     wp-trackback.php
readme.html      wp-comments-post.php  wp-includes        wp-mail.php      xmlrpc.php
wp-activate.php  wp-config-sample.php  wp-links-opml.php  wp-settings.php

拷贝到博客下面

1
[root@web01 tools]# cp -a wordpress/* /application/nginx/html/blog/
1
2
3
4
5
6
[root@web01 tools]# ls /application/nginx/html/blog/
index.html     test_mysql.php        wp-config-sample.php  wp-load.php      wp-trackback.php
index.php      wp-activate.php       wp-content            wp-login.php     xmlrpc.php
license.txt    wp-admin              wp-cron.php           wp-mail.php
readme.html    wp-blog-header.php    wp-includes           wp-settings.php
test_info.php  wp-comments-post.php  wp-links-opml.php     wp-signup.php

设置权限

1
[root@web01 tools]# chown -R www.www /application/nginx/html/blog/

查看权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@web01 tools]# ll /application/nginx/html/blog/
total 200
-rw-r--r--  1 www www     5 Aug 19 23:17 index.html
-rw-r--r--  1 www www   418 Sep 25  2013 index.php
-rw-r--r--  1 www www 19935 Jan  3  2017 license.txt
-rw-r--r--  1 www www  6956 Aug  4 15:54 readme.html
-rw-r--r--  1 www www    20 Aug 25 00:35 test_info.php
-rw-r--r--  1 www www   167 Aug 27 00:11 test_mysql.php
-rw-r--r--  1 www www  5447 Sep 28  2016 wp-activate.php
drwxr-xr-x  9 www www  4096 Aug  4 15:54 wp-admin
-rw-r--r--  1 www www   364 Dec 19  2015 wp-blog-header.php
-rw-r--r--  1 www www  1627 Aug 29  2016 wp-comments-post.php
-rw-r--r--  1 www www  2930 Aug  4 15:54 wp-config-sample.php
drwxr-xr-x  5 www www  4096 Aug  4 15:54 wp-content
-rw-r--r--  1 www www  3286 May 25  2015 wp-cron.php
drwxr-xr-x 18 www www 12288 Aug  4 15:54 wp-includes
-rw-r--r--  1 www www  2422 Nov 21  2016 wp-links-opml.php
-rw-r--r--  1 www www  3301 Oct 25  2016 wp-load.php
-rw-r--r--  1 www www 34327 May 13 01:12 wp-login.php
-rw-r--r--  1 www www  8048 Jan 11  2017 wp-mail.php
-rw-r--r--  1 www www 16200 Apr  7 02:01 wp-settings.php
-rw-r--r--  1 www www 29924 Jan 24  2017 wp-signup.php
-rw-r--r--  1 www www  4513 Oct 15  2016 wp-trackback.php
-rw-r--r--  1 www www  3065 Sep  1  2016 xmlrpc.php

检查语法,重启nginx

1
2
3
4
[root@web01 tools]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.6.3//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.6.3//conf/nginx.conf test is successful
[root@web01 tools]# /application/nginx/sbin/nginx -s reload

浏览器中输入blog.etiantian.org回车,出现如下界面说明配置对了

wKioL1mhsiaDzPGgAALaK5koAU4620.jpg

配置博客:点击上图“现在就开始”,填写如下信息,点击提交

wKiom1mhsmmx1xJtAAKPSGG2u2g734.jpg

wKiom1mhvu_AWJ7CAABJeIKBsZ0823.jpg

TAGS:
八月 27th, 2017

在Unix系统环境中可以通过各种Unix shell结合cron任务实现对MySQL的自动备份,那在Windows下要如何实现呢,其实很简单只要写好自定义的batch脚本在结合taskschd.msc(任务计划程序),就可以实现,最近需要修改调优Windows环境下的MySQL就顺便写了一个使用mysqldump做逻辑备份的batch脚本,如下:

@echo off
::mysql_backup.bat
set hour=%time:~0,2%
if "%time:~0,1%"==" " set hour=0%time:~1,1%
set now=%Date:~0,4%%Date:~5,2%%Date:~8,2%%hour%%Time:~3,2%%Time:~6,2%
::主机ip
set host=127.0.0.1
::端口
set port=3306
::用户
set username=root
::密码
set password=youpassword
::要备份数据库的名字,如果有多个库请用空格分隔
set databasename=database1 database2
:: MySQL Bin 目录
:: 如果在安装配置时添加 MySQL Bin 目录到了环境变量(PATH) ,此处可以留空
set MYSQL=D:\mysql-5.5.57-winx64\bin\
::配置SQL备份路径
set DIR=D:\backup\db\
:: 创建备份MySQL的备份目录
if not exist %DIR% (
    mkdir %DIR% 2>nul
)

if not exist %DIR% (
    echo Backup path: %DIR% not exists, create dir failed.
    goto exit
)

echo start mysqldump ...

for %%i in (%databasename%) do (
    %MYSQL%mysqldump -h%host% -P%port% -u%username% -p%password% %%i > %DIR%%%i-%now%.sql 2>nul
)

echo end mysqldump
::记录主库状态,且做日志记录
%MYSQL%mysql -h%host% -P%port% -u%username% -p%password% -Bse "select now();show master status\G" > %DIR%MySQL_status-%now%.log
echo delete files before 60 days
::删除60天前的备份
forfiles /p "D:\backup\db" /m *.* /d -60 /c "cmd /c del @file /f"

:exit

在写好batch脚本后最后再在taskschd.msc中添加每天定时触发执行,具体的配置方法如下:

image

这里需要注意的是,这里一定要勾选上使用最高权限运行,以免造成运行失败

image

这里触发条件选择每天一次,具体时间可以视实际生产环境判断,开始任务则为按预定计划

image

在这里填上batch脚本的路径以及初始目录,其中需要注意的是一定需要配置初始目录,不然没有把batch脚本添加入PATH环境变量中该任务会找不到batch脚本从而执行失败

image

条件这里可以根据实际情况选择

image

这里一定需要勾选 允许按需运行任务,其他的时间就实际情况而定,最后在确认保存后输入用户密码这样每天系统就会自动做mysqldump逻辑备份。

八月 27th, 2017

一、故障描述:

公司买了两台交换机H3C S5120,由于小兄弟没经验,把flash:给格式化了,交换机不停的在重启,无法进入系统。

二、解决思路:

1.下载tftp软件。

2.从另外一台交换机的flash中下载一份系统文件。

3.装系统文件上传致故障交换机的flash中,重启交换机,故障解决。

三.详细配置过程如下:

1.下载tftp软件。

 

链接:http://pan.baidu.com/s/1qYqfsle 密码:751q

 

 (1)把电脑本地网卡配置:

IP地址:10.10.10.2

子网掩码: 255.255.255.0

 (2)打开tftp软件:

下载的软件目录data中已存有交换机的系统文件(s5720li-v200r010c00spc600.c)

    如果在遇到相同型号的设备,可省略第2步。直接上传到故障交换机即可。
2.从另外一台交换机的flash中下载一份系统文件(s5720li-v200r010c00spc600.cc)。

 

 (1)查看另一台交换机flash:

<HUAWEI>dir

Directory of flash:/

Idx  Attr     Size(Byte)  Date        Time       FileName

0  drw-              –  Aug 23 2016 03:00:52   dhcp

1  drw-              –  Aug 23 2016 03:00:24   user

2  drw-              –  Aug 23 2016 03:01:03   logfile

3  drw-              –  Aug 23 2016 03:00:12   $_install_mod

4  -rw-            836  Aug 23 2016 03:04:07   rr.bak

5  -rw-            836  Aug 23 2016 03:04:07   rr.dat

6  -rw-             28  Aug 23 2016 03:03:55   private-data.txt

7  drw-              –  Aug 23 2016 03:00:52   localuser

8  -rw-     64,011,164  Dec 15 2016 17:51:28   s5720li-v200r010c00spc600.cc

 (2)配置交换机VLAN1 IP为10.10.10.1:

 

#interface Vlanif1

#ip address 10.10.10.1 255.255.255.0

 (3)从交换机下载系统文件:

 

<HUAWEI>tftp 10.10.10.2 put s5720li-v200r010c00spc600.cc

Info: Transfer file in binary mode.

Uploading the file to the remote TFTP server. Please wait…

100%

TFTP: Uploading the file successfully.

64011164 byte(s) sent in 1435 second(s).

<HUAWEI>

 

3.将系统文件上传致故障交换机的flash中,重启交换机,故障解决。

 (1)机器重启生出现下面界面按Ctrl + B

INIT: version 2.88 booting

Starting udev

Starting Bootlog daemon: bootlogd.

Populating dev cache

INIT: Entering runlevel: 3ge = 5

Stopping Bootlog daemon: bootlogd.

Wind River Linux 6.0.0.30 localhost console

localhost login: root (automatic login)

login[1922]: root login on ‘console’

Jan 23 2017, 19:21:20

mknod: /dev/mvPP: File exists

BootLoad version : 020a.0001

Backup U-Boot ……………………………………………………. done

Press Ctrl+B or Ctrl+E to enter BootLoad menu:  2

(2)进入下面启动菜单:

1)选择4

Enter your choice(1-8):

 

BootLoad Menu

1. Boot with default mode

2. Enter serial submenu

3. Enter startup submenu

4. Enter ethernet submenu

5. Enter filesystem submenu

6. Enter password submenu

7. Clear password for console user

8. Reboot

(Press Ctrl+E to enter diag menu)

Enter your choice(1-8):

 2)选择4

ETHERNET  SUBMENU

1. Update BootROM system

2. Download file to Flash through ethernet interface

3. Upload Configuration file to Ftp through ethernet interface

4. Modify ethernet interface boot parameter

5. Return to main menu

Enter your choice(1-5):  

 

 3)选择1,配置下载文件,指定交换机的IP,及tftp服务器也就是电脑的IP

BOOTLINE  SUBMENU

 1. Set TFTP protocol parameters

2. Set FTP protocol parameters

3. Return to ethernet menu

Enter your choice(1-3):

‘.’ = clear field;  ‘-‘ = go to previous field;  ‘Ctrl+D’ = quit

Load File name      : s5720li-v200r010c00spc600.cc

Switch IP address   : 10.10.10.1 

Server IP address   : 10.10.10.2 

Starting to write BOOTLINE into flash … done

 4)选择3 返回

BOOTLINE  SUBMENU

1. Set TFTP protocol parameters

2. Set FTP protocol parameters

3. Return to ethernet menu

Enter your choice(1-3):

 

 5)选择2 下载文件到flash中

ETHERNET  SUBMENU

1. Update BootROM system

 2. Download file to Flash through ethernet interface

3. Upload Configuration file to Ftp through ethernet interface

4. Modify ethernet interface boot parameter

5. Return to main menu

Enter your choice(1-5): 

Use tftp to download file : s5720li-v200r010c00spc600.cc , please wait for a moment.

……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….

Download file successfully.

 6)选择5 返回

ETHERNET  SUBMENU

1. Update BootROM system

2. Download file to Flash through ethernet interface

3. Upload Configuration file to Ftp through ethernet interface

4. Modify ethernet interface boot parameter

5. Return to main menu

Enter your choice(1-5):

 6)选择1 设置默认启动模式

BootLoad Menu

 1. Boot with default mode

2. Enter serial submenu

3. Enter startup submenu

4. Enter ethernet submenu

5. Enter filesystem submenu

6. Enter password submenu

7. Clear password for console user

8. Reboot

(Press Ctrl+E to enter diag menu)

Enter your choice(1-8):

Now, the current startup file is flash:/s5720li-v200r010c00spc600.cc

Info: Check signature, please wait…………

System total memory is 0x15200000

Start to initialize the LSW …

Initializing the LSW ……………………………………………… done

Initializing netlink ……………………………………………… done

Initializing fast netlink …………………………………………. done

Backup BootLoad ………………………………………………….. done

Backup Kernel ……………………………………………………. done

Backup RamDisk …………………………………………………… done

Stack status : enable

ECM Stack status : run

Initializing FSP task begin …

Initializing DEV module …………………………………………… done

Initializing hardware system ………………………………………. done

Begin to start the system …

Registering IPC and VP callback to platform …………………………. done

Initializing VFS ………………………………. Done

Checking startup system-software …………………………………… done

Reading PAF file …………………………………………………. done

Initializing VOS monitor ……………………….. Done

CFM initialization advance ……………………… done

Initializing PAT ………………………………. Done

Initializing HA ……………………………….. done

VFS registering to HA ………………………….. Done

VRP root begin …

VRP root end

CFG initialization begin ……………………….. done

CFM initialization begin ……………………….. done

CLI initialization begin ……………………….. done

Registering VRP all link command begin …………… Done

Creating task begin …

Creating task end

Task initialization begin …

Task initialization end

ECMM status : run

Cmd registering begin …

Cmd registering end

Task awake begin …

Task awake end

Recover configuration begin …

Recover configuration end

Press ENTER to get started.

Login authentication

Username:admin

Password:

 7)启动到输入用户名和密码的界面,证明交换机系统恢复完成。输入默认用户名和密码登录交换机:

用户名:admin

密码:admin@huawei.com

TAGS:
八月 27th, 2017

psutil是一个跨平台,能够轻松实现获取系统运行的进程和利用率(包括CPU、内存、磁盘、网络等)信息。主要应用域系统监控,分析和限制系统资源及进程管理。它实现了同等命令行工具提供的功能,如ps/top/lsof/netstat/who/df/kill/nice/free/nice/ionstat/iotop/uptime/pidof/tty/taskset/pmap等。支持从2.4到3.4的python版本。

psutil大小单位一般都采用字节。

安装psutil

1
2
3
4
5
wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz --no-check-certificate
tar -xzvf psutil-2.0.0.tar.gz
cd psutil-2.0.0
python setup.py install   #psutil/_psutil_linux.c:12:20: 致命错误:Python.h:没有那个文件或目录
yum install python-devel.x86_64

1、cpu信息

linux操作系统的CPU利用率有以下几个部分:

user time,执行用护进程的时间百分比

system time,执行内核进程和中伏案的时间百分比

wait io,由于IO等待而使CPU处于idle(空闲)状态的时间百分比;

Idle,CPU处于idle状态的时间百分比

我们使用python的psutil.cpu_times()方法可以非常简单地得到这些信息,同事也可以获取CPU的硬件相关信息,比如CPU的硬件相关信息,比如CPU的物理个数域逻辑个数。

1
2
3
4
5
6
7
8
>>> psutil.cpu_times()                  #查看cpu所有信息
scputimes(user=762.76, nice=4.47, system=428.97, idle=4012472.08, iowait=207.27, irq=0.0, softirq=7.07, steal=0.0, guest=0.0, guest_nice=0.0)
>>> psutil.cpu_times().user             #查看用户的cpu时间比
762.77
>>> psutil.cpu_count()                  #查看cpu逻辑个数
2
>>> psutil.cpu_count(logical=False)     #查看cpu物理个数
2

2、内存信息

linux系统的内存利用率信息涉及total(内存总数)、used(已使用的内存数)、free(空闲内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数)等。分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息。

1
2
3
4
5
6
7
8
9
10
11
>>> import psutil
>>> mem = psutil.virtual_memory()           #使用psutil.virtual_memory方法获取内存完整信息
>>> mem
svmem(total=3975487488L, available=2716561408L, percent=31.7, used=2024685568L, free=1950801920L, active=1328680960, inactive=484872192, buffers=1433600L, cached=764325888)
>>> mem.total                               #获取内存总数
3975487488L
>>> mem.free                                #获取空闲内存
1950801920L
>>> psutil.swap_memory()                    #获取SWAP分区信息
sswap(total=1073737728L, used=0L, free=1073737728L, percent=0.0, sin=0, sout=0)
>>>

3、磁盘信息

磁盘利用率使用psutil.disk_usage方法获取,

磁盘IO信息包括read_count(读IO数),write_count(写IO数),read_bytes(IO写字节数),read_time(磁盘读时间),write_time(磁盘写时间),这些IO信息用psutil_io_counters()获取。

1
2
3
4
psutil.disk_io_counters()        #获取磁盘总的IO个数
psutil.disk_partitions()        #获取磁盘的完整信息
psutil.disk_usage('/')   #获取/分区(参数)的使用状态
psutil.disk_io_counters(perdisk=True)    #perdisk=True参数获取单个分区IO个数、读写信息

4、读取网络信息

网络信息与磁盘IO信息类似,涉及到几个关键点,包括byes_sent(发送字节数),byte_recv=xxx(接受字节数),pack-ets_sent=xxx(发送字节数),pack-ets_recv=xxx(接收数据包数),这些网络信息用psutil.net_io_counters()方法获取。

1
2
psutil.net_io_counters()  #获取网络总IO信息
psutil.net_io_counters(pernic=True)     #pernic=True输出每个网络接口的IO信息

5、获取当前系统用户登录信息

1
2
3
4
psutil.users()      #获取当前登录系统的用户信息
import psutil,datetime
psutil.boot_time()     #获取开机时间,以linux时间格式返回
datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H: %M: %S"#转换成自然时间格式

6、系统进程管理方法

获取当前系统的进程信息,获取当前程序的运行状态,包括进程的启动时间,查看设置CPU亲和度,内存使用率,IO信息、socket连接、线程数等。

(1)获取进程信息

查看系统全部进程

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
psutil.pids()    #列出所有进程ID
 = psutil.Process(2423)     #实例化一个process对象,参数为一进程PID
 p.name()   #进程名
 p.exe()    #进程的bin路径
 p.cwd()    #进程的工作目录绝对路径
 p.status()   #进程状态
 p.create_time()  #进程创建时间
 p.uids()    #进程uid信息
 p.gids()    #进程的gid信息
 p.cpu_times()   #进程的cpu时间信息,包括user,system两个cpu信息
 p.cpu_affinity()  #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
 p.memory_percent()  #进程内存利用率
 p.memory_info()    #进程内存rss,vms信息
 p.io_counters()    #进程的IO信息,包括读写IO数字及参数
 p.connectios()   #返回进程列表
 p.num_threads()  #进程开启的线程数

(2)psutil的Popen类启动应用程序,可以跟踪程序的相关信息

1
2
3
4
5
6
from subprocess import PIPE
= psutil.Popen(["/usr/bin/python""-c""print('hello')"],stdout=PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times()           #得到进程运行的CPU时间
TAGS: ,
八月 27th, 2017

关于nginx防盗链的方法网上有很多教程,都可以用,但是我发现很多教程并不完整,所做的防盗链并不是真正的彻底的防盗链!

一般,我们做好防盗链之后其他网站盗链的本站图片就会全部失效无法显示,但是您如果通过浏览器直接输入图片地址,仍然会显示图片,仍然可以右键图片另存为下载文件!

依然可以下载?这样就不是彻底的防盗了!那么,nginx应该怎么样彻底地实现真正意义上的防盗链呢?

首先,我们来看下nginx如何设置防盗链

如果您使用的是默认站点,也就是说,您的站点可以直接输入服务器IP访问的,使用root登录,修改 /usr/local/nginx/conf/nginx.conf 这个配置文件。

如果您新建了站点,那么修改/usr/local/nginx/conf/vhost/你的域名.conf 这个配置文件,找到:

1
2
3
4
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
 expires      30d;
}

把这一段删掉,修改成:

1
2
3
4
5
6
7
8
location ~* \.(gif|jpg|png|jpeg)$ {
    expires     30d;
        valid_referers none blocke *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;
    if ($invalid_referer) {
    rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg;
    #return 404;
    }
}

第一行: location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

其中“gif|jpg|jpeg|png|bmp|swf”设置防盗链文件类型,自行修改,每个后缀用“|”符号分开!

第三行:valid_referers none blocked *.it300.com it300.com;

就是白名单,允许文件链出的域名白名单,自行修改成您的域名!*.it300.com这个指的是子域名,域名与域名之间使用空格隔开!

第五行:rewrite ^/ http://www.it300.com/static/images/404.jpg;

这个图片是盗链返回的图片,也就是替换盗链网站所有盗链的图片。这个图片要放在没有设置防盗链的网站上,因为防盗链的作用,这个图片如果也放在防盗链网站上就会被当作防盗链显示不出来了,盗链者的网站所盗链图片会显示X符号。

这样设置差不多就可以起到防盗链作用了,上面说了,这样并不是彻底地实现真正意义上的防盗链!

我们来看第三行:valid_referers none blocked *.it300.com it300.com;

valid_referers 里多了“none blocked”

我们把“none blocked”删掉,改成

valid_referers  *.it300.com it300.com;

 

nginx彻底地实现真正意义上的防盗链完整的代码应该是这样的:

1
2
3
4
5
6
7
8
location ~* \.(gif|jpg|png|jpeg)$ {
    expires     30d;
    valid_referers *.hugao8.com www.hugao8.com m.hugao8.com *.baidu.com *.google.com;
    if ($invalid_referer) {
    rewrite ^/ http://ww4.sinaimg.cn/bmiddle/051bbed1gw1egjc4xl7srj20cm08aaa6.jpg;
    #return 404;
    }
}

这样您在浏览器直接输入图片地址就不会再显示图片出来了,也不可能会再右键另存什么的。

第五行:rewrite ^/ http://www.it300.com/static/images/404.jpg;

这个是给图片防盗链设置的防盗链返回图片,如果我们是文件需要防盗链下载,把第五行:

rewrite ^/ http://www.it300.com/static/images/404.jpg;

改成一个链接,可以是您主站的链接,比如把第五行改成:

rewrite ^/ http://www.it300.com;

这样,当别人输入文件下载地址,由于防盗链下载的作用就会跳转到您设置的这个链接!

最后,配置文件设置完成别忘记重启nginx生效!

TAGS: ,
八月 27th, 2017

1、环境准备

主机名 IP 系统 Python版本
Python-01 192.168.10.9 CentOS release 6.9 (Final) 3.5.4

参考:https://www.shiyanlou.com/courses/370/labs/1191/document

2、原理

字符画是一系列字符的组合,可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。

灰度值指范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。

任何颜色都由红、绿、蓝三基色组成,假如原来某点的颜色为RGB(R,G,B),本次实验可以用以下公式来转换灰度:

1
gray = 0.2126 * + 0.7152 * + 0.0722 * b

3、实验

本次实验的核心是pillow库的Image模块和argparse模块。

3.1 图像处理库pillow

Pillow是Python里的图像处理库,支持Python3.X,提供了广泛的文件格式支持和强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

Image类使用说明参考:http://pillow.readthedocs.io/en/latest/reference/Image.html

3.2 安装pillow库

直接用Python3自带的pip安装即可:

1
pip install pillow

widonws端可以用以下命令安装:

1
python3 -m pip install pillow

3.3 argparse模块

argparse模块使编写用户友好的命令行界面变得更容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。

3.3.1 ArgumentParser对象

add_argument()方法必须知道期望的是可选参数,例如-o 或者–output参数用来设置输出文件:

1
2
parser = argparse.ArgumentParser()
parser.add_argument('-o''--output')

add_argument()的default关键字参数,其默认值为None,指出如果命令行参数没有出现时它们应该是什么值,还可以设定其类型type,例如设定输出字符画的宽:

1
parser.add_argument('--width'type = int, default = 80)

3.4 准备图片

wKioL1mfj2mRI9J2AAB09TbRWOY101.jpg

3.5 源码

源码在Windows、CentOS和Ubuntu环境均验证成功。

1
vim test.py
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
#!/usr/bin/env python3
from PIL import Image
import argparse
# 命令行输入参数处理
parser = argparse.ArgumentParser()
parser.add_argument('file')     # 输入文件
parser.add_argument('-o''--output')   # 输出文件
# 输出字符画宽,默认值为80
parser.add_argument('--width'type = int, default = 80)
# 输出字符画高,默认值为80
parser.add_argument('--height'type = int, default = 80
# 获取参数
args = parser.parse_args()
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
# 灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号。
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 将256灰度映射到列表的70个字符上
def get_char(r,g,b,alpha = 256):
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    gray = int(0.2126 * + 0.7152 * + 0.0722 * b)
    unit = (256.0 + 1)/length
    return ascii_char[int(gray/unit)]
if __name__ == '__main__':
    im = Image.open(IMG)
    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)
    txt = ""
    for in range(HEIGHT):
        for in range(WIDTH):
            txt += get_char(*im.getpixel((j,i)))
        txt += '\n'
    print(txt)
    # 字符画输出到文件
    if OUTPUT:
        with open(OUTPUT,'w') as f:
            f.write(txt)
    else:
        with open("output.txt",'w') as f:
            f.write(txt)

3.6 运行结果

1
python3 test.py timg.jpg
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
                                      ....  ..
                           ......lB&],,,,,,,+Mp'...
                            ..8c,,,,,,,,,,,,,,,,M"`
                        . '&<,,,,,,,,,,,,,,,,,,,,,!U .
                       '+aI,,,,,,,,,,,,,,,,,,,,,,,,;|f.'
                      'ox:,,,,,,,,,,,,,,,,,,,,,,,,,,,">o\..
                     o",:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"::c@.
                  . &:"I,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f^,,lJ.
                  ^>";,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,M,,,`&
                .';",&,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"!",,,:}.
                ^,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#l,,,":]
               '",,,,^,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;!,,,,,Ix..
              ',,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,M!,,,,,,Z`
             'Z,,,,,M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l!,,,,,,^.`
           ..h:,,,,"*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ii:,,,,,,}.
            ti,,,,,:[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,k!,,,,,,,M
           .I,,,,,,,:",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,&!,,,,,,,,v
           k,,,,,,,l:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,_!:,,,,,,,"'
          Y:,,,,,,,!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l!l,,,,,,,:#
         '[,,,,,,,,l:",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ii!,,,,,,,:0
       . o^,,,,,,,!l:,,,,,",,",,,,,,,,,,,,,,,,,,":lz(,,,",,;]!:,,,,,,,0&
       .`O,,,,,,,:!!",,,j**WWMW[,,,,,,,,,,,,,,,vMMMWMM8o,,,,{!;,,,,,,,0Z.
       .80,,,,,,,:!l:,,,8,,""":",,,,,,,,,,,,,,,M",:,:::I,,,,(!!,,,,,,"0QW
      .`00",,,,,:!l{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,^?>!,,,,,,,00Q..
     .'W00",,,,,:!1*:",,,,::,,,,,,,,,,,",,,,,,,,,,,,,,,,,,,,^^!",,,,,"00Ou
     ..000",,,,,!I\JjmW;,",,,,,,,,,,,,-8^,,,,,,,,,,,,,,:,,&&,.`p;,,,,"000a.
      %000,,,,,,!)[nxxn*;:,,,,,,,,,,,,^,,,,,,,,,,,,,,,:Izunu#..'8I,,,"000O^
     .0000:,,,,;>}Mxxxxx8:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0rxxxj`   #l,,"0000B
     M0000,,,,,!1vnnxxxx\:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,vxxxxr@    ';",0000k
    .O0000I,,,!(bWxxxxxxf:,,,,,,,,,,,,:"",,,,,,,,,,,,:Ixxxxxxx'    'W,00000
    .00000},,;>a'uxxxxxx%",,,,,,,,,,,"%ujM;:,,,,,,,,,,/xxxxxxxW    . M00000,
    W00000n,,ip :xxxxxnt:,,,,!W:,,^#Mxnxxnn%C&M8WW;,,,"jxxxxunQ      ."q000o.
    000000J,-' .#xrxxxm;",,,,:;",:,"Mxxxnxv^:",":,",,,,Wnxxxv::&+    .`'800Z'
   !000000Qo ..#,,"8W^,,,,,,,,,,,,,,,Mnnxu8,,,,,,,,,,,,,,&hxB,,,,#''   . #0OJ
  .M0000QQ# .Wl,,,:o",,,,,,,,,,,,,,,,:&nx/;,,,,,,,,,,,,,,,,:<,,,,,J'       *M.
  `O000L*.. .,,,,,,;",,,,,,,,,,,,,,,,,,z*^,,,,,,,,,,,,,,,,,,M,,,,,,&.      .#.
  BQ00&`   .m,,,,,:Z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IZ,,,,,:.
  B#M..     :,,,,^#!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!:J,,,,,!.
           .",,,,;^ul!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,":i)Cl,,,,l!.
        .  `>,,,,,":Yfi!!;,,,,,,,,,,,,,,,,,,,,,,,,,,::I!I8X!I,,,,,l!.
            ;!,,,,,,":{#WIl!!!!!I;:,""",::;IIl!i!!llf&&{11!;,,,,,!!r'
            Ll!,,,,,,:,"?(t]jq8&MWWWM&&&&&##M8*X1)(1()1ll!,,,,,,I!!f
             *l!:,,,,,,,,:"::l!<_+-][{{{11{{11{[_!:!!l!:,",,,,,:l!X.
             "B!!!;,,,,,,,,,,,,,","",,,,",,,",,,:,,",:,,,,:,,:!!!a..
            .. *l!!!!",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!!!!i*.      .
                v!!!!!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,li>!o
                .<*i!!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l;` .
                  .jJI,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!-
                    `I,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!!
                    .I,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:! .
                    W!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,id
                  ..~!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!#.
                   .I!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!!
                  .+!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:i
                   %!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,iX
                   _!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!%
                  .I;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"I
                  '!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,i..
                  Y!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!;.
                 'M!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.
                . ?;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.
                ..I:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:8.
                 .l,,,,,,,,,,,,,,,,,::::::::::::::::::::::::,!&.
                  -,,,,,,,,,,,,,,,,::::::::::::::::::::::::::lh.
                . #,,,,,,,,,,,,,,,,:::::::;:::;;:::;:::::::::l1.
                   ,,,,,,,,,,,,,,,,::::;;;;;;;;;:;;;;;;;;;;;!<
                  .*I::,,,,,,,,,,,,,,,;:;:;;;;;;;;;;;;;;;;;;:M
                    #~!;,:,,,,,:,:li!!!!li!!!!!!!!!;;;;;;;;;_
                     1M;>l>!!!ill!!!}##&W#W&&1>l>l!!!!!!I;Ik .
                    (>~((fk#oaC|)|))))))))))))(\(#oMC1<ao#xW
                    aC<!i!!!((((()()))))))))))))(()(\\)){)<!
                    \~+!!!i(())))))))))))))))))))))))(i!!!!&Q.
                    (aa!!@))()))))))))))())))))))))()){I!!M!!
                     ;|["'            .               )/&lt\
                       ...                            . .;..

当然,也可以调整默认参数,来缩小输出比例:

1
python3 test_img.py  --width 30 --height 30 timg.jpg

image

4、总结

熟悉了argparse模块和Image模块。argparse是Python用于解析命令行参数和选项的标准模块,举例:

1
2
3
4
5
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print args.echo
1
2
$ python xx.py test1
test1
TAGS:
八月 25th, 2017

PHP本身没有带有ionCube loader模块, 必须到ionCube网站下载。ionCube loader是免费的,但是Encoder的价格就比较昂贵(起价$199)。

下面要介绍如何在Linux下安装ionCube Loader。

1. 下载ionCube http://www.ioncube.com/loader_download.php, 通过这个链接可以找到对应的版本,我使用wget从命令行获取Linux64版本。
wget -c http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz

2. 解压 tar -zxvf ioncube_loaders_lin_x86-64.tar.gz

3. 在解压后的文件夹了可以找到ioncube-loader-helper.php, 把它拷贝到网站的目录下,例如:
cp ioncube-loader-helper.php /var/www/html/

4. 然后在浏览器下打开ioncube-loader-helper.php,点击Server System Information链接,它会根据你的系统配置,告诉你应该使用那个ionCube-loader模块,并且告诉php.ini的路径。

5. 接下来把相关模块复制到/usr/local/(或者其他目录),根据第四步的提示在php.ini里加入一行。例如:
zend_extension = /usr/local/ioncube/ioncube_loader_lin_5.3.so
注意:如果你的php.ini里没有zend_extension,你可以把这行加在任一位置,否则,把它加在第一个zend_extension语句前。

6. 保存php.ini,重启服务器。在我们的服务器上使用到的命令是:/etc/init.d/httpd restart

另外我还在ZendChina上看到一篇关于ZendGuard 与ionCube工具比较的文章,ZendGuard也是一款对PHP源码加密的工具,ZendGuard只能用于配置了ZendOptimizer的环境中,不能独立运行。据说使用的ZendOptimizer(PHP优化引擎)可以提高20~50%的源码执行速度,如果结合ZendGuard可以把速度提高至50%以上。我们公司的网站还没有使用PHP加密和PHP优化,有机会一定要试试。

不知PHP的加密是否违背开源的理念?
ionCube loader 类似 zend 的 php 加密 工具

昨天下了一款奥瑞文的在线考试系统,打开首页,提示:
“requires the ionCube PHP Loader ioncube_loader_win_5.2.dll to be installed by the site administrator”

这是缺少ionCube loader,即ionCube解密工具的原因。

ionCube Encoder可以把PHP源代码转换成ByteCode。进行加密授权处理后的PHP代码就不在开源了,必须使用ionCube loader才可以执行加密过的PHP代码。PHP本身没有带有ionCube loader模块, 必须到ionCube网站下载。ionCube loader是免费的,但是Encoder的价格就比较昂贵(起价$199)。

好在该考试系统里面集成了loader的文件包,免去我下载的麻烦。我办公的电脑不可以连互联网,现在打字这台是查资料的电脑。

打开后,确定存在Loader ioncube_loader_win_5.2.dll文件,

然后再php安装目录下,找到php-apache2handler.ini文件。搜索其zend_extension_ts

并在其后插入一段:zend_extension_ts=”e:\phpnow\php5.2\oes\ionCube\Loader ioncube_loader_win_5.2.dll”。

Loader ioncube_loader_win_5.2.dll文件的路径自己替换成你的。

重启apache,测试效果。

英文好的,也可以查看ioncube-loader-help.php文件自行安装配置

八月 25th, 2017

1.如何在数据库中创建一个账户:

第一,启动sql*puls
第二,以system/manager登陆
第三,create user 用户名 IDENTIFIED BY 密码 (例如:bione1/bione1)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字

2.导入,导出

导入导出命令:

Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件, imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。

执行环境:可以在SQLPLUS.EXE或者DOS(命令行)中执行,
DOS中可以执行时由于 在oracle 10i 中 安装目录ora101BIN被设置为全局路径,
该目录下有EXP.EXE与IMP.EXE文件被用来执行导入导出。
oracle用java编写,SQLPLUS.EXE、EXP.EXE、IMP.EXE这两个文件有可能是被包

将D:\bione.dmp表中的数据导入到orcl数据库中。

(1)当创建完用户后,找到安装oracle的bin目录,例如C:\oracle\product\10.2.0\db_1\bin。

(2)打开cmd窗口,输入cd C:\oracle\product\10.2.0\db_1\bin,然后再输入:imp bione1/bione1@orcl file= D:\bione.dmp ignore=y;

(3)导入成功。

导出::
(1) 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中
exp system/manager@TEST file=d:daochu.dmp full=y
(2) 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:daochu.dmp owner=(system,sys)
(3) 将数据库中的表inner_notify、notify_staff_relat导出
exp aichannel/aichannel@TESTDB2 file= d:datanewsmgnt.dmp tables=(inner_notify,notify_staff_relat)
(4 )将数据库中的表table1中的字段filed1以”00″打头的数据导出
exp system/manager@TEST file=d:daochu.dmp tables=(table1) query=” where filed1 like ‘00%'”
上面是常用的导出,对于压缩,既用winzip把dmp文件可以很好的压缩。
也可以在上面命令后面 加上 compress=y 来实现。

八月 25th, 2017

上次帮主机侦探那边创建几个cpanel账户,他们来建设网站,后来他们反馈说在安装建站软件的时候说有报错,报错信息如下

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 71 bytes)

 

在网上找了一下,都没有看见有相关的解决办法,问的人到是很多~!

 

这个错误的意思是 是说,你正在进行的操作需要这么多的内存,但你现在服务器分配的内存不足。

正常情况下,服务器的内存当然是够的,只是你的配置文件需要修改。

解决这个问题的方式:

登录cpanel面板,上面有文件管理器,然后在根目录下找到并打开你的php.ini

这段语句,将其中的数字32改大一些就可以了。比如改为

(‘memory_limit’,’640M’);

 

改完后到后台清除缓存,再看看前台,应该解决了。

八月 25th, 2017

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

memory leak会最终会导致out of memory!

内存溢出就是你要求分配的内存超出了系统能给你的,系统不能满足需求,于是产生溢出。

内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问(也许你把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。一个盘子用尽各种方法只能装4个果子,你装了5个,结果掉倒地上不能吃了。这就是溢出!比方说栈,栈满时再做进栈必定产生空间溢出,叫上溢,栈空时再做退栈也产生空间溢出,称为下溢。就是分配的内存不足以放下数据项序列,称为内存溢出.

以发生的方式来分类,内存泄漏可以分为4类:

1. 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。
2. 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。
3. 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。
4. 隐式内存泄漏。程序在运行过程中不停的分配内存,但是直到结束的时候才释放内存。严格的说这里并没有发生内存泄漏,因为最终程序释放了所有申请的内存。但是对于一个服务器程序,需要运行几天,几周甚至几个月,不及时释放内存也可能导致最终耗尽系统的所有内存。所以,我们称这类内存泄漏为隐式内存泄漏