0%

摘要

作为运维人员经常会遇到等到远程主机的链接因为网络原因或者别的其他不可抗拒的原因断掉,此时远程为执行完成的命令也会断掉而导致很多任务需要重新执行。

这给大家介绍一个在这种情况下很好用的命令 screen,具体好用在那里,下面具体介绍,包括从其安装到配置到使用

What to do

在正式介绍之前,先给大家介绍下 screen 都能做什么事情

  • 通过一个SSH session使用多个shell窗口
  • 即使网络断开链接也能保持shell窗口处理激活状态
  • 可以在任何地方断开或者重连同一个shell session
  • 不用为了跑一个耗时的任务而长时间保持几个shell session处于激活状态
阅读全文 »

导语

今天在尝试 Flask-Mail 发送邮件的过程中,遇到一个小问题导致发送邮件失败,查到了半天问题,真是被自己蠢到了。
这里针对这个问题的前因后果做一个整理分享给大家,避免大家踩同样的坑。

安装 Flask-Mail

这里建议利用 virtualenv 来创建隔离的环境来测试发送邮件,关于 virtualenv相关的介绍和使用可以参考如下连接

Centos下pyenv安装python多版本-增强版

Centos下python纯净虚拟环境

阅读全文 »

Shell 颜色和闪烁控制

在Shell下有时候需要定制输出,比如给输出加上颜色,或者显示高亮,或者添加闪烁等。
然后这些颜色代码或者控制码等相对不好记住。这个时候我们可以考虑把最终想要的结果制定成对应的函数,
在使用的时候直接调用函数会方便很多

格式

echo -e "\033[字背景颜色;字体颜色m字符串\033[控制码"
阅读全文 »

导语

部门使用的代码管理仓库是gitlab,随着业务发展,代码量也越来越大,到目前已经大于100M,今天新入职员工全量拉取代码时候报错,查找原因是因为代码仓库太大导致拉取超时。 这里记录下处理过程


报错

fatal: early EOF
fatal: The remote end hung up unexpectedly
fatal: index-pack failed
error: RPC failed; result=18, HTTP code = 200

解决

因为这边使用的docker搭建的gitlab,处理方式有点不同
必须先进入到gitlab容器中去操作,重启 gitlab 也必须是进入到docker 容器中重启,
否则从服务器直接重启容器会导致配置丢失,恢复成默认值

nginx client_max_body_size

之前修改过gitlab前端nginx的 client_max_body_size 大小,确保上传下载超大文件的可能性

vi /etc/nginx/nginx.conf
client_max_body_size 50M;

## check and reload nginx config
nginx -t
nginx -s reload

gitlab timeout

## need to enter gitlab container firstly
## then edit the config
vi config/unicorn.rb
timeout 300

## then restart gitlab in container
## remember that must be in container
/etc/init.d/gitlab restart

git http.postBuffer

另外建议也修改下本地 http.postBuffer 参数

## modify in commandline 
git config --global http.postBuffer 524288000

## check config list 
git config --list

最后重新拉取,没有问题


公众号: DailyJobOps DailyJobOps

enumerate()说明

  • enumerate()是python的内置函数
  • enumerate在字典上是枚举、列举的意思
  • 对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
  • enumerate多用于在for循环中得到计数

实例

>>> goods = [['appple',70999],['banaba',2000],['orange',10000]]
>>> type(goods)
<type 'list'>
>>> for index,item in enumerate(goods):
...     print index,item
... 
0 ['appple', 70999]
1 ['banaba', 2000]
2 ['orange', 10000]
>>> for index,item in enumerate(goods):
...     print index,item[0],item[1]
... 
0 appple 70999
1 banaba 2000
2 orange 10000
>>> 

## enumerate可以有第二个参数
>>> for index,item in enumerate(goods,2):
...     print index,item[0],item[1]
... 
2 appple 70999
3 banaba 2000
4 orange 10000
>>> 

特殊说明

文件大小为83M,用python计算文件行数

实际脚本

#!/usr/bin/env python
#-*- coding:utf8 -*-

file = '/usr/local/tomcat/logs/appLog/appLog.2016-11-08.log'


## 方式一,对于文件很大的时候比较慢
#count = len(open(file,'r').readlines())
#print count


## 方式二,相对比较高效
count = 0
for index, line in enumerate(open(file,'r')):
    count += 1

print count
阅读全文 »

整理hexo遇到的各种问题和解决办法


ERROR Deployer not found: git

遇到问题

升级hexo之后,执行`hexo d` 遇到问题如下:
hexo  ERROR Deployer not found: git

解决

npm install hexo-deployer-git --save

hexo next主题博客在本地显示正常,github内容空白的问题

遇到问题

copy原有的hexo项目升级之后,推送最新的代码到github,结果hexo next主题博客在本地显示正常,deploy到github上后只显示框架,内容空白的问题

解决

进入next主题的source目录,将vendors文件的文件名改成任意其他名字,如:lcvendors

vim themes/next/_config.yml
vendors:
  # Internal path prefix. Please do not edit it.
  _internal: lcvendors

然后
    hexo clean
    hexo g
    hexo d

参考

xiangwanpeng的CSDN博客

Error: Cannot find module ‘./build/Release/DTraceProviderBindings

这里提示是DTraceProviderBindings模块没有安装

npm install -g dtrace-provider

之后再执行 Hexo 相关的命令,但是报上面的错误。

解决

执行下面的命令安装,即可解决
install hexo --no-optional

待续…


公众号: DailyJobOps DailyJobOps

针对项目的不同, flask 可以采用不同配置方式来快速开发

直接配置

app.config['HOST'] = 'www.baidu.com'
app.config.update(
    'HOST' = 'www.baidu.com',
    'PORT' = 3306
)

查看具体的配置 print app.config.get('HOST')

通过环境变量加载

export MyAppConfig='/etc/flask-setting.cfg'

app.config.from_envvar('MyAppConfig')
阅读全文 »

整理Centos系统下Nginx遇到的问题,一遍后续排查问题方便


[emerg] could not build the server_names_hash…

开始使用nginx只有一个虚拟主机,默认server_name 会使用 localhost, 今天配置nginx的server_name是一个正式存在的域名的时候,报错如下:

root@pts/0 $ nginx -t
nginx: [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32
nginx: configuration file /etc/nginx/nginx.conf test failed

How to fix

在nginx的配置文件nginx.conf的http段添加如下配置:

# vi /etc/nginx/nginx.conf
...
http {
        ...
        server_names_hash_max_size 512;
        server_names_hash_bucket_size 128;
        ...
}
...

root@pts/0 $ nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx官方对server_name的说明请参考 链接

公众号: DailyJobOps DailyJobOps

导语

在Centos7下,当前python版本是2.7.5,测试实时获取日志然后解析入库中,安装MySQL-python模块报错如
EnvironmentError: mysql_config not found,原因是缺少了 mysql 相关支持。
这里把解决过程记录一下


具体报错信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@pts/4 $ pip install MySQL-python
Collecting MySQL-python
Using cached MySQL-python-1.2.5.zip
Complete output from command python setup.py egg_info:
sh: mysql_config: command not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-kWowP9/MySQL-python/setup.py", line 17, in <module>
metadata, options = get_config()
File "setup_posix.py", line 43, in get_config
libs = mysql_config("libs_r")
File "setup_posix.py", line 25, in mysql_config
raise EnvironmentError("%s not found" % (mysql_config.path,))
EnvironmentError: mysql_config not found

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-kWowP9/MySQL-python/

mysql_config是来自于 mysql-devel ,我用的是MySQL社区版,所以实际安装的是mysql-community-devel,网上的说法是同时安装python-devel,如果你没有安装的话一起安装

yum install python-devel mysql-community-devel -y

安装完成之后尝试再次 pip 安装 MySQL-python


再次安装

1
2
3
4
5
6
root@pts/4 $ pip install MySQL-python
Collecting MySQL-python
Using cached MySQL-python-1.2.5.zip
Installing collected packages: MySQL-python
Running setup.py install for MySQL-python ... done
Successfully installed MySQL-python-1.2.5

验证

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
root@pts/1 $ python
Python 2.7.5 (default, Sep 15 2016, 22:37:39)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb
>>> MySQLdb.
MySQLdb.BINARY MySQLdb.OperationalError( MySQLdb.__hash__( MySQLdb.debug(
MySQLdb.Binary( MySQLdb.ProgrammingError( MySQLdb.__init__( MySQLdb.escape(
MySQLdb.Connect( MySQLdb.ROWID MySQLdb.__name__ MySQLdb.escape_dict(
MySQLdb.Connection( MySQLdb.STRING MySQLdb.__new__( MySQLdb.escape_sequence(
MySQLdb.DATE MySQLdb.TIME MySQLdb.__package__ MySQLdb.escape_string(
MySQLdb.DATETIME MySQLdb.TIMESTAMP MySQLdb.__path__ MySQLdb.get_client_info(
MySQLdb.DBAPISet( MySQLdb.Time( MySQLdb.__reduce__( MySQLdb.paramstyle
MySQLdb.DataError( MySQLdb.TimeFromTicks( MySQLdb.__reduce_ex__( MySQLdb.release
MySQLdb.DatabaseError( MySQLdb.Timestamp( MySQLdb.__repr__( MySQLdb.result(
MySQLdb.Date( MySQLdb.TimestampFromTicks( MySQLdb.__revision__ MySQLdb.server_end(
MySQLdb.DateFromTicks( MySQLdb.Warning( MySQLdb.__setattr__( MySQLdb.server_init(
MySQLdb.Error( MySQLdb.__all__ MySQLdb.__sizeof__( MySQLdb.string_literal(
MySQLdb.FIELD_TYPE MySQLdb.__author__ MySQLdb.__str__( MySQLdb.test_DBAPISet_set_equality(
MySQLdb.IntegrityError( MySQLdb.__class__( MySQLdb.__subclasshook__( MySQLdb.test_DBAPISet_set_equality_membership(
MySQLdb.InterfaceError( MySQLdb.__delattr__( MySQLdb.__version__ MySQLdb.test_DBAPISet_set_inequality(
MySQLdb.InternalError( MySQLdb.__dict__ MySQLdb._mysql MySQLdb.test_DBAPISet_set_inequality_membership(
MySQLdb.MySQLError( MySQLdb.__doc__ MySQLdb.apilevel MySQLdb.thread_safe(
MySQLdb.NULL MySQLdb.__file__ MySQLdb.connect( MySQLdb.threadsafety
MySQLdb.NUMBER MySQLdb.__format__( MySQLdb.connection( MySQLdb.times
MySQLdb.NotSupportedError( MySQLdb.__getattribute__( MySQLdb.constants MySQLdb.version_info
>>>
>>> MySQLdb.version_info
(1, 2, 5, 'final', 1)
>>>

公众号: DailyJobOps DailyJobOps

导语

pymongo 是目前用的相对普遍一个python用来连接MongoDB的库,是工作中各种基本需求都能满足
具体api可以参考 pymongo API
pymongo github


安装 MongoDB

为了测试pyMongo连接mongodb,首先当然需要在centos下安装mongo,详细参考 Centos下安装MongoDB

安装 pymongo

如果没有pip, 建议先安装,至于为啥要用pip你懂得

yum install python-pip

pip 安装 pymongo

pip install pymongo

查看 pymongo是否安装成功

root@pts/4 $ python
Python 2.7.5 (default, Nov 20 2015, 02:00:19) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymongo        
>>> pymongo.version
'3.2.2'

使用 pymongo

连接到 MongoDB

有两种方式,等同

>>> client = pymongo.MongoClient('192.168.100.3', 27017)
>>> print client
MongoClient(host=['192.168.100.3:27017'], document_class=dict, tz_aware=False, connect=True)
>>> client2 = pymongo.MongoClient('mongodb://192.168.100.3:27017/')
>>> print client2
MongoClient(host=['192.168.100.3:27017'], document_class=dict, tz_aware=False, connect=True)
>>> 

得到 db 和 collection

有时候在脚本中会把 db 和 collection 作为参数使用,可以参考第二种方式

直接链接
>>> db = client.report
>>> print db
Database(MongoClient(host=[‘192.168.100.3:27017’], document_class=dict, tz_aware=False, connect=True), u’report’)
>>> collection = db.source_register
>>> print collection
Collection(Database(MongoClient(host=[‘192.168.100.3:27017’], document_class=dict, tz_aware=False, connect=True), u’report’), u’source_register’)
>>>

参数链接, 这种形式又有两种方法

## 定义参数
>>> pramadb = 'report'
>>> pramacoll = 'source_register'

## get db 
>>> db2 = client[pramadb]
>>> db3 = client.get_database(pramadb)
>>> print db2
Database(MongoClient(host=['192.168.100.3:27017'], document_class=dict, tz_aware=False, connect=True), u'report')
>>> print db3
Database(MongoClient(host=['192.168.100.3:27017'], document_class=dict, tz_aware=False, connect=True), u'report')
>>> 

## get collection 
>>> coll2 = db2[pramacoll]
>>> coll3 = db3.get_collection(pramacoll)
>>> print coll2
Collection(Database(MongoClient(host=['192.168.100.3:27017'], document_class=dict, tz_aware=False, connect=True), u'report'), u'source_register')
>>> print coll3
Collection(Database(MongoClient(host=['192.168.100.3:27017'], document_class=dict, tz_aware=False, connect=True), u'report'), u'source_register')
>>> 

常规操作举例

## insert or save 
>>> mydict = {"name":"James", "age": 28}
>>> collection.save(mydict)
ObjectId('57fdf212bcd34f48c4fce15a')


## find
>>> collection.find({"name":"James"})[0]
{u'age': 28, u'_id': ObjectId('57fdf212bcd34f48c4fce15a'), u'name': u'James'}
>>> 

^^ ^^ ^^ 未完待续… ^^ ^^ ^^


公众号: DailyJobOps DailyJobOps