Mac下pip的安装

第一种 在系统自带的python2.7的路径下

1、pip是python的包管理工具,在Python2.7的安装包中,easy_install.py是默认安装的,而pip需要我们手动安装。
打开终端:

sudo easy_install pip

第二种 在python3的路径下

curl https://bootstrap.pypa.io/get-pip.py | python3

安装后

查看版本

pip --version

查看相应的包

pip3 list

安装和更新pip

pip install --upgrade pip

CentOS8.0安装迅搜(XunSearch)引擎报错的解决办法

安装报错,百度上找到这个文章保存下,目前官方还没更新,靠这个方法可以解决问题哦

在一些小型项目上需要应用全文搜索引擎时,我比较喜欢使用迅搜,因为部署方便,调用简单,今天给客户部署系统安装迅搜时,竟然有报错(极少遇到报错的情况),花了一些时间查资料,终于解决了,分享一下经验

首先是定位原因,因为我已经在起码五六台Centos主机上安装过迅搜,前面都顺利安装完成了,所以应该是不迅搜本身有什么问题,更大可能是跟运行环境是有关系的,看了一下,目前这台机子安装的是Centos8.0,我之前安装的系统都是7.X的,所以极有可能是和操作系统的版本有关系的。

看了一下在安装界面的信息,内容如下:

bufferevent_openssl.c:237:2: note: (near initialization for ‘methods_bufferevent’)
bufferevent_openssl.c:228:19: error: storage size of ‘methods_bufferevent’ isn’t known
static BIO_METHOD methods_bufferevent = {
^~~~~~~~~~~~~~~~~~~
make[2]: *** [Makefile:793: bufferevent_openssl.lo] Error 1
make[2]: Leaving directory ‘/usr/local/src/xunsearch-full-1.4.14/libevent-2.0.21-stable’
make[1]: *** [Makefile:857: install-recursive] Error 1
make[1]: Leaving directory ‘/usr/local/src/xunsearch-full-1.4.14/libevent-2.0.21-stable’
make: *** [Makefile:1182: install] Error 2

看样子应该是在编译过程中报错了,这个比较棘手,因为这是C写的代码,我总不能直接去改它的源码,于是只能从什么问题导致了编译错误入手,各种查询之后,发现有位网友曾经遇到过这个问题,以下是引用这位网友的内容:

这个问题的原因及解决思路如下:
原因在于libevent 2.0.x需要openssl < 1.1.0
常用的几个Linux发行版已经把系统的openssl升级到了1.1.0+
即对应需要libevent 2.1.x+
而libevent 2.1.x改了头文件.. 如果不更换系统openssl版本.
那就可以去手动下载一个 libevent-2.1.11-stable.tar.gz
自己换成bz压缩格式(libevent-2.1.11-stable.tar.bz2)
放进 packages,记得删掉原来的libevent

作者:一件小毛衣
链接:https://www.jianshu.com/p/2bd166d48f42
来源:简书

后面具体的步骤没有参考他的,因为我和他使用的迅搜版本是不同的,具体解决的方法跟他的有所不同,所以下面继续说我的解决过程:
首先,先去下载一下2.1.X版本的libevent安装包,可以直接搜索libevent,然后在官方的网站上下载,很多时候官方的链接是github上的,如果直接在linux系统上用wget下载有点慢,这种情况下可以先在咱们自己的浏览器上下载好,再通过winscp上传上去,更加快。
我下载的版本是libevent2.1.12,下载链接是:https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz

下载好后上传到服务器上放xunsearch的目录下,我的目录是/usr/local/src/,然后将这个文件解压,并重新压缩成bz2格式,参考代码如下:

//先将libevent解压(以便压缩成所需格式)
tar -zxvf libevent-2.1.12-stable.tar.gz
//压缩成bz2格式,这是迅搜安装包的支持的格式
tar -cjf libevent-2.1.12-stable.tar.bz2 libevent-2.1.12-stable
//复制到xunsearch下的packages文件夹内
cp libevent-2.1.12-stable.tar.bz2 xunsearch-full-1.4.15/packages/
//进入安装包的目录并将原来自带的libevent安装包删除(xunsearch1.4.15自带的是2.0.X)
cd xunsearch-full-1.4.15/packages/
rm -f libevent-2.0.X(删除原来的,我的具体是:
rm -f libevent-2.0.21-stable.tar.bz2)
//返回上一步的文件夹(即迅搜安装包的根目录),然后执行setup.sh就可以了,
//迅搜会自动检查安装包文件内的libevent开头的安装包,如果没找到会报错,如果找到了就会自动解压并编译安装
cd ..
./setup.sh

然后安装过程就愉快地完成了
————————————————
版权声明:本文为CSDN博主「风柏杨」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/one_and_only4711/article/details/110926096

Linux查找某个时间内的文件

1、 n天内修改的(-ctime)

find . -type f -ctime -1| xargs ls –l

说明:

(1) -type f 只搜索文件,不包含文件夹

(2)ctime中的c-change的意思

(3)-ctime +n: n天前修改的;-ctime –n:n天内修改的,修改日期过去n天的

ctime参数指文件日期等状态性参数修改,mtime参数指内容改变:

find . -type f -mtime -1| xargs ls –l
2、n天内访问过的(-actime)

find . -type f -atime -1

说明:

(1) atime中的a-access的意思;
3、 atime、ctime、mtime区别

from: http://blog.csdn.net/abcdef0966/article/details/7607545

(1)atime是指access time,即文件被读取或者执行的时间,修改文件是不会改变access time的。网上很多资料都声称cat、more等读取文件的命令会改变atime,但是我试验时却发现使用cat、more时atime没有被修改。这个问题需要另外做研究探讨。

(2)ctime即change time文件状态改变时间,指文件的i结点被修改的时间,如通过chmod修改文件属性,ctime就会被修改。

(3)mtime即modify time,指文件内容被修改的时间。
4、查看文件的时间等属性

stat./00/00/wKjn3lmeuLqEGxCHAAAAAAAAAAA617.jpg

File: ‘./00/00/wKjn3lmeuLqEGxCHAAAAAAAAAAA617.jpg’

Size: 391552 Blocks: 768 IO Block: 4096 regular file

Device: 801h/2049d Inode: 545906 Links: 1

Access: (0644/-rw-r–r–) Uid: ( 0/ root) Gid: ( 0/ root)

Access: 2017-08-24 19:30:13.537917208 +0800

Modify: 2017-08-24 19:30:02.641824935 +0800

Change: 2017-08-24 19:30:02.641824935 +0800

Birth: –
5、以分钟为单位的时间范围查找

与atime,ctime,mtime类似,对应的参数为amin, cmin,mmin
————————————————
版权声明:本文为CSDN博主「hongweigg」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hongweigg/article/details/77552198

MySQL数据库备份之逻辑备份和物理备份概述

一. 前言

逻辑备份和物理备份各有优劣,一般来说,物理备份恢复速度比较快,占用空间比较大,逻辑备份速度比较慢,占用空间比较小。逻辑备份的恢复成本高。

二. 逻辑备份

逻辑备份是备份sql语句,在恢复的时候执行备份的sql语句实现数据库数据的重现。

1)mysqldump

mysqldump是采用SQL级别的备份机制,他将数据表导成SQL脚本文件,是最常用的逻辑备份方法。

三. 物理备份

物理备份就是备份数据文件了,比较形象点就是cp下数据文件,但真正备份的时候自然不是的cp这么简单。

1)使用 xtrabackup 工具

是一个用来备份 MySQL数据库的开源工具。

主要特点:

<1>. 在线热备份。可以备份innodb和myisam。innodb主要应用recovery原理。myisam直接拷贝文件。

<2>. 支持流备份。可以备份到disk,tape和reomot host。–stream=tar ./ | ssh user@remotehost cat “>” /backup/dir/

<3>. 支持增量备份。可以利用lsn和基础备份目录来进行增量备份。

<4>. 支持记录slave上的master log和master position信息。

<5>. 支持多个进程同时热备份,xtrabackup的稳定性还是挺好的。

2)LVM

特点:热备、支持所有基于本地磁盘的存储引擎、快速备份、低开销、容易保持完整性、快速恢复等。

3)cp + tar

使用直接拷贝数据库文件的方式进行打包备份,需要注意的是执行步骤:锁表、备份、解表。

恢复也很简单,直接拷贝到之前的数据库文件的存放目录即可。

注意:对于Innodb引擎的表来说,还需要备份日志文件,即ib_logfile*文件。因为当Innodb表损坏时,就可以依靠这些日志文件来恢复。

4)mysqlhotcopy

mysqlhotcopy是一个perl程序,是lock tables、flush tables 和cp或scp来快速备份数据库。

它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表文件、数据文件、索引文件)所在的机器上。

mysqlhotcopy只能用于备份MyISAM。

5)使用mysql主从复制

mysql的复制是指将主数据库的DDL和DML操作通过二进制文件(bin-log)传送到从服务器上,然后在从服务器上对这些日志做重新执行的操作,从而使得从服务器和主服务器保持数据的同步。

四. 参考出处

《How innobackupex Works》http://www.percona.com/doc/perconaxtrabackup/innobackupex/how_innobackupex_works.html

《使用xtrabackup做数据库的增量备份》 http://www.cnblogs.com/cosiray/archive/2012/03/09/2388113.html

《MySQL备份和同步时使用LVM》 http://imysql.cn/?q=node/102

《三种mysql备份方法》 http://www.doc88.com/p-617721704574.html

《10种mysql备份教程推荐》 http://database.chinaunix.net/a2011/0822/1235/000001235979.shtml

转自:https://blog.51cto.com/horizon49/1163797

 

另外阿里云上也有关于RDS物理备份和逻辑备份恢复到自建服务器上详细介绍:

RDS MySQL 物理备份文件恢复到自建数据库:
https://help.aliyun.com/knowledge_detail/41817.html

RDS MySQL逻辑备份文件恢复到自建数据库:
https://help.aliyun.com/document_detail/97438.html

epoll讲解

转自知乎

首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。
    不管是文件,还是套接字,还是管道,我们都可以把他们看作流。
    之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,但是服务器还没有把数据传回来),这时候该怎么办?
阻塞:阻塞是个什么概念呢?比如某个时候你在等快递,但是你不知道快递什么时候过来,而且你没有别的事可以干(或者说接下来的事要等快递来了才能做);那么你可以去睡觉了,因为你知道快递把货送来时一定会给你打个电话(假定一定能叫醒你)。
非阻塞忙轮询:接着上面等快递的例子,如果用忙轮询的方法,那么你需要知道快递员的手机号,然后每分钟给他挂个电话:“你到了没?”
    很明显一般人不会用第二种做法,不仅显很无脑,浪费话费不说,还占用了快递员大量的时间。
    大部分程序也不会用第二种做法,因为第一种方法经济而简单,经济是指消耗很少的CPU时间,如果线程睡眠了,就掉出了系统的调度队列,暂时不会去瓜分CPU宝贵的时间片了。
    为了了解阻塞是如何进行的,我们来讨论缓冲区,以及内核缓冲区,最终把I/O事件解释清楚。缓冲区的引入是为了减少频繁I/O操作而引起频繁的系统调用(你知道它很慢的),当你操作一个流时,更多的是以缓冲区为单位进行操作,这是相对于用户空间而言。对于内核来说,也需要缓冲区。
假设有一个管道,进程A为管道的写入方,B为管道的读出方。
假设一开始内核缓冲区是空的,B作为读出方,被阻塞着。然后首先A往管道写入,这时候内核缓冲区由空的状态变到非空状态,内核就会产生一个事件告诉B该醒来了,这个事件姑且称之为“缓冲区非空”。
    但是“缓冲区非空”事件通知B后,B却还没有读出数据;且内核许诺了不能把写入管道中的数据丢掉这个时候,A写入的数据会滞留在内核缓冲区中,如果内核也缓冲区满了,B仍未开始读数据,最终内核缓冲区会被填满,这个时候会产生一个I/O事件,告诉进程A,你该等等(阻塞)了,我们把这个事件定义为“缓冲区满”。
假设后来B终于开始读数据了,于是内核的缓冲区空了出来,这时候内核会告诉A,内核缓冲区有空位了,你可以从长眠中醒来了,继续写数据了,我们把这个事件叫做“缓冲区非满”
    也许事件Y1已经通知了A,但是A也没有数据写入了,而B继续读出数据,知道内核缓冲区空了。这个时候内核就告诉B,你需要阻塞了!,我们把这个时间定为“缓冲区空”。
这四个情形涵盖了四个I/O事件,缓冲区满,缓冲区空,缓冲区非空,缓冲区非满(注都是说的内核缓冲区,且这四个术语都是我生造的,仅为解释其原理而造)。这四个I/O事件是进行阻塞同步的根本。(如果不能理解“同步”是什么概念,请学习操作系统的锁,信号量,条件变量等任务同步方面的相关知识)。
    然后我们来说说阻塞I/O的缺点。但是阻塞I/O模式下,一个线程只能处理一个流的I/O事件。如果想要同时处理多个流,要么多进程(fork),要么多线程(pthread_create),很不幸这两种方法效率都不高。
    于是再来考虑非阻塞忙轮询的I/O方式,我们发现我们可以同时处理多个流了(把一个流从阻塞模式切换到非阻塞模式再此不予讨论):
while true {
for i in stream[]; {
if i has data
read until unavailable
}
}
    我们只要不停的把所有流从头到尾问一遍,又从头开始。这样就可以处理多个流了,但这样的做法显然不好,因为如果所有的流都没有数据,那么只会白白浪费CPU。这里要补充一点,阻塞模式下,内核对于I/O事件的处理是阻塞或者唤醒,而非阻塞模式下则把I/O事件交给其他对象(后文介绍的select以及epoll)处理甚至直接忽略。
    为了避免CPU空转,可以引进了一个代理(一开始有一位叫做select的代理,后来又有一位叫做poll的代理,不过两者的本质是一样的)。这个代理比较厉害,可以同时观察许多流的I/O事件,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有I/O事件时,就从阻塞态中醒来,于是我们的程序就会轮询一遍所有的流(于是我们可以把“忙”字去掉了)。代码长这样:
while true {
select(streams[])
for i in streams[] {
if i has data
read until unavailable
}
}
    于是,如果没有I/O事件产生,我们的程序就会阻塞在select处。但是依然有个问题,我们从select那里仅仅知道了,有I/O事件发生了,但却并不知道是那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。
    但是使用select,我们有O(n)的无差别轮询复杂度,同时处理的流越多,没一次无差别轮询时间就越长。再次
说了这么多,终于能好好解释epoll了
    epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll之会把哪个流发生了怎样的I/O事件通知我们。此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))
    在讨论epoll的实现细节之前,先把epoll的相关操作列出:
epoll_create 创建一个epoll对象,一般epollfd = epoll_create()
epoll_ctl (epoll_add/epoll_del的合体),往epoll对象中增加/删除某一个流的某一个事件
比如
epoll_ctl(epollfd, EPOLL_CTL_ADD, socket, EPOLLIN);//注册缓冲区非空事件,即有数据流入
epoll_ctl(epollfd, EPOLL_CTL_DEL, socket, EPOLLOUT);//注册缓冲区非满事件,即流可以被写入
epoll_wait(epollfd,…)等待直到注册的事件发生
(注:当对一个非阻塞流的读写发生缓冲区满或缓冲区空,write/read会返回-1,并设置errno=EAGAIN。而epoll只关心缓冲区非满和缓冲区非空事件)。
一个epoll模式的代码大概的样子是:
while true {
active_stream[] = epoll_wait(epollfd)
for i in active_stream[] {
read or write till
}
}
    限于篇幅,我只说这么多,以揭示原理性的东西,至于epoll的使用细节,请参考man和google,实现细节,请参阅linux kernel source。

chsh 查看和修改当前登录的Shell

chsh 命令本身并不复杂,它的功能比较单一,就是负责查看(显示)和修改我们系统的登录 Shell。想修改登录 Shell,首先要知道我们的系统安装了哪些 Shell。这里有两种方法可以查看。

方法一:(mac 下不行)

[roc@roclinux ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh

方法二:(mac下可以)

[roc@roclinux ~]$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
mac:
maxianwideMBP57:home maxianwei$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

其实chsh -l命令本质上也是去查看 /etc/shells 文件。

查看当前正在使用的 Shell

使用一个环境变量,就可以查看到当前正在使用的 Shell 啦:

[roc@roclinux ~]$ echo $SHELL
/bin/bash

maxianwideMBP57:home maxianwei$ echo $SHELL
/bin/bash

注意:SHELL一定要大写。可以看到,我们目前使用的 Shell 是 bash。

听说 zsh 不错,于是我们就通过在命令行执行 zsh 命令切换到了 zsh 环境。可是,为什么查看当前 Shell 类型仍然是 /bin/bash 呢?

[roc@roclinux ~]$ zsh
[roc@roclinux]~% echo $SHELL
/bin/bash
[roc@roclinux]~%

请注意,我们虽然执行了 zsh,但是所谓“当前的 Shell”是一个大环境的概念,是针对一个已登录的用户而言的。而我们执行 zsh 只是启动了一个 zsh 的解释器程序而已,并没有改变大环境。如果想改变“当前的 Shell”,那么还是要求助于 chsh 才可以。

将 Shell 环境真正切换到 zsh

[roc@roclinux ~]$ chsh -s /bin/zsh
Changing shell for roc.
Password:
Shell changed.

使用 chsh 命令的-s选项就可以修改登录的 Shell 了。

如果我们这时候满怀欣喜地执行 echo $SHELL,就会发现然输出的仍是 /bin/bash。这是因为 chsh 改变的是我们登录 Shell 的配置,我们必须退出再重新登录 Shell,才可以完全投入到 zsh 的怀抱。

真是一波三折,退出并重新登录后,终于看到了我们想要的 /bin/zsh 了:

[roc@roclinux]~% echo $SHELL
/bin/zsh

chsh -s 到底修改了哪里

chsh -s其实修改的就是 /etc/passwd 文件中和我们所登录的用户名相对应的那一行。现在我们来查看一下:

[roc@roclinux]~% cat /etc/passwd|grep ^roc
roc:x:1001:1001::/home/roc:/bin/zsh

可以发现,输出内容的最后部分已经变成了 /bin/zsh 了。重启系统的时候,Linux 就会读取这一命令来启动新的 Shell。

好了,我们要恢复正常的工作环境,把 Shell 修改回我们熟悉的 /bin/bash 了:

[roc@roclinux]~% chsh -s /bin/bash
Changing Shell for roc.
Password:
Shell changed.

系统小命令1

系统排查:
last -F -x 查看重启等时间

cat /var/log/messages |more 查看对应日志
uptime 系统运行时间

查看目录或子目录:

df -h 命令查看整个硬盘的大小 ,-h表示人可读的
du -d 1 -h 命令查看当前目录下所有文件夹的大小 -d 指深度,后面加一个数值

grep常用方法

1.将/etc/passwd,有出现 root 的行取出来
# grep root /etc/passwd

2.将/etc/passwd,有出现 root 的行取出来,同时显示这些行在/etc/passwd的行号
# grep -n root /etc/passwd

3.将/etc/passwd,将没有出现 root 的行取出来
# grep -v root /etc/passwd

4.将/etc/passwd,将没有出现 root 和nologin的行取出来
# grep -v root /etc/passwd | grep -v nologin

5.用dmesg 列出核心信息,再以 grep 找出内含 eth 那行,要将捉到的关键字显色,且加上行号来表示:
[root@www ~]# dmesg | grep -n –color=auto ‘eth’

6.用dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起捉出来显示
[root@www ~]# dmesg | grep -n -A3 -B2 –color=auto ‘eth’

7.根据文件内容递归查找目录
# grep ‘maxianwei.cn’ *      #在当前目录搜索带’maxianwei.cn’行的文件
# grep -r ‘maxianwei.cn’ *     #在当前目录及其子目录下搜索”行的文件
# grep -l -r ‘maxianwei.cn’ *    #在当前目录及其子目录下搜索’maxianwei.cn’行的文件,但是不显示匹配的行,只显示匹配的文件

具体grep相关参数可以参考:https://www.runoob.com/linux/linux-comm-grep.html

linux sed 批量替换字符串

sed是一种流编编器,它是文本处理中非常中的工具,能够完美的配合正则表达式便用,功物能不同凡响。详细的功能网上很多,这里就不多说了,项目中我要批量替换静态文件的一个域名具体操作如下:

命令如下:

sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`

例如:我要把 www.maixianwei.cn 替换为 cdn.maxianwei.cn,执行命令:

sed -i "s/www.maxianwei.cn/cnd.maxianwei.cn/g" `grep www.maxianwei.cn -rl /www`

-i 表示inplace edit,就地修改文件

-r 表示搜索子目录

-l 表示输出匹配的文件名

修改前,要注意备份文件。

如果文件太多 可以分批进行 比如:

[root@localhost html]# sed -i “s/maxianwei.cn\/upload/maxianwei.c\/upload/g” `grep admin.maxianwei.cn -rl ./12*.html`