面试 Linux 运维工作至少需要知道哪些知识? http://blog.okbase.net/CGC1561039 bosh脚本编程 http://blog.okbase.net/CGC1561039/archive/56714.html CGC1561039 2018/8/3 20:13:57 Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計劃而编写。1989年釋出第一個正式版本,原先是計劃用在GNU作業系統上,但能运行于大多数类Unix系统的操作系统之上,包括Linux與Mac OS X v10.4都將它作為預設shell。它也被移植到Microsoft Windows上的Cygwin與MinGW,或是可以在MS-DOS上使用的DJGPP專案。在Novell NetWare與Andriod在上也有移植。1990年後,Chet Ramey成为了主要的维护者。為Bourne shell的後繼相容版本與開放原始碼版本,它的名稱來自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。

Shell中文意思叫做“壳”,在计算机中它是和用户直接交互的一个界面,而我们通常用到的是文本界面的shell:

 

bash启动的时候会运行各种不同的脚本。当bash作为一个登录的交互shell被调用,或者作为非交互shell但带有--login参数被调用时,它首先读入并执行文件/etc/profile。然后它会依次寻找~/.bash_profile,~/.bash_login,和~/.profile,读入并执行第一个存在且可读的文件。--noprofile参数可以阻止bash启动时的这种行为。当一个登录shell退出时,bash读取并执行~/.bash_logout文件,如果此文件存在。当一个交互的非登录shell启动后,bash读取并执行~/.bashrc文件。这个行为可以用--norc参数阻止。--rcfile file参数强制bash读取并执行指定的file而不是默认的~/.bashrc。如果用sh来调用bash,bash在启动后进入posix模式,它会尽可能模仿sh历史版本的启动行为,以便遵守POSIX标准。用sh名字调用的非交互shell不会去读取其他启动脚本,--rcfile参数无效。当bash以POSIX模式启动时(例如带有--posix参数)它使用POSIX标准来读取启动文件。在此模式下,交互shells扩展变量ENV,从以此为文件名的文件中读取命令并执行。bash会探测自己是不是被远程shell守护程序运行(通常是rshd)。如果是,它会读取并执行~/.bashrc中的命令。但是rshd一般不会用rc相关参数调用shell,也不会允许指定这些参数。

以上是我们对bash的简单介绍,接下来我们就说一下关于bash脚本编写的一些内容,在http://linuxlover.blog.51cto.com/2470728/1631593此篇博客中我提供过几个简单的例子大家可以去看一下。

1、bash中的变量

变量命名规则:

1.只能包含字母、数字和下划线,并且不能以数字开头

2.不应与系统中已有的变量重名

3.最好做到见名知意

1.1、变量:是指在内存中抽出一块空间,然后把这块空间命名,其内部可以放东西,类似一个有名字的容器。

环境变量:即全局变量,变量的作用域为本shell及其子shell。

本地变量:也有人叫全局变量相对局部变量而言,作用范围为整个shell自身。

局部变量:只用关键字local定义,作用范围为某段代码,一般都是在函数体中使用,函数调用结束变量撤销。

位置变量:即代表脚本各参数的位置,$0~$9,一共十个如果多余十个则需要用其他的方法,其中$0代表脚本本身。

特殊变量:具有特殊功能的变量

$# 表示传递到脚本的参数列表

$* 以一个字符串显示所有向脚本传递的参数,跟位置变量不同的是这里参数可超过9个。

$$ 表示当前运行脚本的进程ID号

$! 表示后台运行的一个进程的ID号

$@ 与$#相同,但是使用时加引号,并在引号中返回每一个参数

$- 显示shell使用的当前选项,与set命令相同

$? 显示最后命令运行的推出状态,0表示没有错误,其他任何值表示有错误

 

数值型:整型、浮点型

字符型:字符、字符串

布尔型:真、假

1.2、与变量相关的一些命令

declare 创建或显示变量

        参数-f 只显示函数名

        参数-r 创建只读变量(typeset也可以)

        参数-x 创建转出变量

        参数-i 创建整数变量

        如果参数中使用+来代替-,表示选项的含义相反。

export 创建环境变量

        参数– 表明选项结束,所有后面的参数都是实参

        参数-f 表示在”变量-值”对照中的变量是一个函数名

        参数-n 表示把全局变量转换成局部变量(也就是本地变量)。

        参数-p 显示全局变量列表

readonly 创建或显示只读变量

        参数– 表示选项结束

        参数-f 创建只读变量

set 设置或者重设各种shell

shift [n] 用来移动或调整位置变量,使$4赋给$3(也就是全都向前面移动一次),这个里面的n表示移动几位,默认是移动一位。

typeset 这个就跟declare相同了

unset 清除变量的定义

        参数– 表示选项结束

        参数-f 删除只读变量,但是不能sehll环境中制定的变量和函数。

read 用于从终端或者文件中读取输入,它读取整行输入,而末尾的换行符被翻译成 null(空字符串)。如果没有指定名称,读取的行就被赋值到特定的变量 REPLY 中。同时,read 命令还可以用来使程序暂时停下来等待用户输入回车。

        -a array 将单词清单放入 array 数组中

        first last 读取输入到第一个空格或回车,将输入的第一个单词放入 first 中,而其他的则放在 last 中

        -p prompt 打印提示,等待输入,并将输入存入 REPLY 中

        -r line 允许输入中包含反斜杠 ”\ ”

        -t timaout:指定等待接受参数的时间

        -n:表示不换行

1.3、变量替换

 

2、bash中的运算

2.1、算数运算:需要变量为数值型,但默认直接进行变量赋值时都是字符型,所以需要显示的定义可以使用declare或let命令。但bash是解释型语言(还有编译型语言),所以变量的定义非常宽泛,在定义时可以不不指明变量类型,使用时在指明就可以了。

算术运算符:

+:加

-:减

*:乘

/:整

%:取模

**:幂

运算方法:

let c=$a+$b

c=$[$a+$b]

c=$(($a+$b))

c=$(expr $a + $b) | c=`expr $a + $b`

2.2、逻辑运算:即与、或、非以及条件测试运算。

命令间的逻辑关系:

逻辑与:&& 有一个为假,结果为假

第一个条件为假时,第二个条件不再判断;

第一个条件为真时,第二个条件必须判断;

逻辑或:|| 有一个为真,结果为真

第一个条件为真时,第二个条件不再判断;

第一个条件为假时,第二个条件必须判断;

逻辑非:!

条件测试类型:

整数测试

字符测试

文件测试

条件测试的表达式:

[ expression ]  命令测试法  表达式

[[ expreession ]]  关键字测试法

test expression

整数比较(双目操作):

-eq:测试两个整数是否相等,如:[ $a -eq $b ] 测试a,b两个变量中的数是否一致,一致状态返回值为0 echo $?

-ne:测试两个整数是否不等,不等为真,相等为假

-gt:测试一个数是否大于另一个数,大于为真,否则为假

-lt:测试一个数是否小于另一个数,小于为真,否则为假

-ge:大于或等于

-le:小于或等于

文件测试:

-a file exists.

-b file exists and is a block special file.

-c file exists and is a character special file.

-d file exists and is a directory.

-e file exists (just the same as -a).

-f file exists and is a regular file.

-g file exists and has its setgid(2) bit set.

-G file exists and has the same group ID as this process.

-k file exists and has its sticky bit set.

-L file exists and is a symbolic link.

-n string length is not zero.

-o Named option is set on.

-O file exists and is owned by the user ID of this process.

-p file exists and is a first in, first out (FIFO) special file or named pipe.

-r file exists and is readable by the current process.

-s file exists and has a size greater than zero.

-S file exists and is a socket.

-t file descriptor number fildes is open and associated with a terminal device.

-u file exists and has its setuid(2) bit set.

-w file exists and is writable by the current process.

-x file exists and is executable by the current process.

-z string length is zero.

字符测试:字符串比较

双目:

>: 大于则为真

<: 小于则为真

>=:大于等于则为真

<=:小于等于则为真

==:等于则为真

!=:不等于则为真

单目:

-n String: 是否不空,不空则为真,空则为假

-z String: 是否为空,空则为真,不空则假

]]>
那一晚,我终于学会了 http://blog.okbase.net/CGC1561039/archive/56708.html CGC1561039 2018/7/30 22:26:53 来源:马哥教育

链接:https://mp.weixin.qq.com/s/9v_-pT2fRMpvhQmB2EsUxw

无论是实用性还是易用性,Python 都是学习编程最具性价比的选择。如果你学过其他的语言,再学 Python 将会让你的技能树大大地拓宽,有能力涉足更多的领域。

学习编程从入门到放弃的人不计其数,很大程度上是因为,产出和投入的精力完全不成正比。而学习 Python,几行代码就可以实现一个爬虫,几个函数就可以做简单的数据分析,写一个小工具、小游戏也是分分钟的事情……这种成就感,会激发你最原始的兴趣。

那如何系统学习Python呢?一般我们会经历以下几个阶段。

01 了解 Python 编程基础

一是变量、编程规范、基础语法等,这也是能够上手编写 Python 代码的前提。

二是数据结构,字符串、列表、字典、元组这些需要非常熟练,数据类型将贯穿你整个编程的始终。

这个部分一些简单的练习就是,自己构造一个数据类型,然后去实现基本的用法。比如你自己构造一个列表,实现列表中数据的访问、更新、删除等基本操作,比如 len()、max()、min() 函数,以及 append()、count()、extend() 等方法。

函数和方法是实现数据增删改查的基本途径,如果你在实际操作中遇到数据操作的问题,可以在具体的数据类型下查找相关用法。

02 Python函数及流程控制

学习 Python 的函数和控制语句,是真正去解决问题的过程。如何实现判断和循坏,如何将固定的功能模块封装成函数,这些不仅是写出代码的必要条件,也是训练编程思维的必经之路。

函数这个部分无外乎函数的定义、函数调用以及参数传递,但是要能够娴熟地写出函数实现对应的功能,需要注意的细节很多,也需要不断地训练。

流程控制则相对要好掌握一些,条件语句和循坏语句在不同的场景下练习几遍,知道判断和循环实现的过程,基本上就没问题了。

其实到这个地方,基本的Python知识你已经掌握了,你可以自己去做一些小项目,比如猜数字、各种转换器、记账工具……

 03 利用 Python 做些事情

通常在学习一段时间之后,你就会有自我怀疑的过程,貌似真的懂了,但是离做出实际的东西又很远,这些东西是否有用?

这个时候不妨了解一些第三方库,你可以做更多的事情。比如用pandas作数据处理,用matplotlib做数据可视化分析,用BeautifulSoup写爬虫,利用Flask搭建网站……这些别人搭好的轮子,你直接拿来用就可以了。当然像写爬虫和网站,你还需要了解其他方面的一些知识(比如HTTP、HTML、JS、数据库等)。

对于不同的库,内部的方法、函数你还需要去熟悉,开始的时候先掌握少部分最常用的方法,在遇到实际的问题的时候,再去查对应的更多的用法,这样会更高效。

 04 深入 Python 编程

其实第三个阶段反复练习实践,你已经基本具备一些工作的技能了,比如 Python 数据分析、网络爬虫、写工具脚本……

首先你要了解Python的高级特性,如迭代器、生成器、装饰器等,了解类和面向对象的理念。深入下去,你可以去探索Python的实现原理,Python的性能优化,跳出Python语言本身,去了解计算机的交互原理,还有很长的路要走,但并不是每一个人都需要这个过程。

但这些高屋建瓴的东西,又是你在这个领域立足生根的重要条件,对于坚定走技术方向的人来说,这个过程是有必要的。这个时候你再去做应用层面的一些东西,又会有更加深刻的理解。

总结下来,学习Python,最常见的坑有这些:

1.很难找到合适且优质的学习资源,难以下手,或者随便找一些材料开始学习,极其容易从入门到放弃;

2.遇到问题不知道如何寻找解决办法,甚至连问题都描述不清楚,经常被一些细小的问题卡住,学习效率不高;

3.在理论学习中无法自拔,学习很久之后,发现还是不知道如何在实际的项目中去应用,缺乏解决问题的能力;

4.看到别人的案例觉得好像是那么回事,但是自己去写代码的时候依然很困难,无法训练编程思维。

………………

如果成功的跨过了这些坑,那么恭喜你,你已经成为了一名合格的Pythoner!

]]>
关于列表 http://blog.okbase.net/CGC1561039/archive/56707.html CGC1561039 2018/7/30 22:25:17 列表是python以及其他语言中最常用到的数据结构之一。Python中使用[]来创建列表

列表中的每项是可以改变的,这一点区别于元组

列表的创建,遍历及增删改查

#创建

names = ["mike", 'jud', 'huihui', 'wang', 'tian', 'kaggle']

#遍历

for name in names:

    print(name)

#查 切片查

print(names[2])         #打印第三个名字

print(names[0 : 3])     #切片处理, 打印前三个

print(names[0 : 10])    #当切片长度大于列表长度,就按照列表长度切片

print(names[-1])        #输出列表最后一个,当数字为负数时,输出倒数第n个

print(names[2 : 3])     #左闭右开

print(names[0 : 5 : 1]) #切片操作[start : end : size]切取[start-end)区间的子序列,start默认值为0 size != 0

print(names[5 : 0 : -3])#和上一个一样

print(names[::-1])      #相当于反转

print(names[:])         #相当于0-最大长度

 

增(append, insert)

names.append('alex')

names.insert(5, 'alvin')

print(names)

 

改(重新赋值)

names = ['章叁', '李四', '王五', '赵六']

 

names[2] = "孙三"

names[0 : 2] = ["liu", 'wang']

print(names)

 

names = ['章叁', '李四', '王五', '赵六']

删(remove, del, pop(返回值))

names.remove("章叁")

print(names)

del names[0]

print(names)

del names           #names变量在内存中被析构

 

names = ['章叁', '李四', '王五', '赵六']

names.pop()

print(names)

 

其他操作 count

lists = ['to', 'be', 'or', 'not', 'to', 'be']

print(lists.count('to'))                        #查询某个元素在列表中出现的次数

 

extend 该方法可以在列表的末尾一次性追加另一个序列中的多个值

lista = [1, 2, 3]

listb = [4, 5, 6]

lista.extend(listb)

print(lista)

 

#index 该方法用于返回元素在列表中的位置

print(lista.index(3))

 

#reverse

lista.reverse()

print(lista)

 

listc = [5, 2, 4, 12, 9, 0]

listc.sort()

print(listc)

 

#深浅拷贝

names = ['章叁', '李四', '王五', '赵六']

names_copy = ['章叁', '李四', '王五', '赵六']

print(id(names))        #2438619076232

print(id(names_copy))   #2438618956936

 

for name, name_copy in zip(names, names_copy):

    print(id(name), id(name_copy))

 

#输出:

#2438618789208 2438618789208

#2438618789296 2438618789296

#2438618789384 2438618789384

#2438618789472 2438618789472

#由此可以看出names_copy的元素的地址和names的元素地址相同,是浅拷贝

 

print("------------------------")

names_copy[0] = "图像"

for name, name_copy in zip(names, names_copy):

    print(id(name), id(name_copy))

#在执行names_copy[0] = "图像"就会把原本指向'章叁'的地址的指针,指向'图像'所在的地址

 

b, d, e, *c = ['1', '2', 3, 4, 5]      #将列表中的元素赋值给等号左边变量,当左边的变量不能完全接受列表元素,会存在c列表中

print(type(b), type(d), type(c))

print(b, d, e, c)

]]>
大咖亲身分享面试 Linux 运维工作至少需要知道哪些知识? http://blog.okbase.net/CGC1561039/archive/56702.html CGC1561039 2018/7/27 8:58:48     我们已经发过不少 Linux 面试题,但是单独的面试题总感觉会过于零碎,没有体系化内容给人的帮助大。知乎上有这样一个问题:一个新手面试 Linux 运维工作至少需要知道哪些知识?其中有一个答案对这一话题的解读非常深入,今天特别分享给大家。

    一、什么是大型网站运维?

首先明确一下,全文所讲的”运维“是指:大型网站运维,与其它运维的区别还是蛮大的;然后我们再对大型网站与小型网站进行范围定义,此定义主要从运维复杂性角度考虑,运维对其它关联工种必须非常了解熟悉:网络、系统、系统开发、存储,安全,DB等;我在这里所讲的运维工程师就是指专职运维工程师。

    我们再来说说一般产品的“出生”流程:

1、首先公司管理层给出指导思想,PM定位市场需求(或copy成熟应用)进行调研、分析、最终给出详细设计。

2、架构师根据产品设计的需求,如pv大小预估、服务器规模、应用架构等因素完成网络规划,架构设计等(基本上对网络变动不大,除非大项目)

3、开发工程师将设计code实现出来、测试工程师对应用进行测试。

4、好,到运维工程师出马了。首先明确一点不是说前三步就与运维工作无关了,恰恰相反,前三步与运维关系很大:应用的前期架构设计、软/硬件资源评估申请采购、应用设计性能隐患及评估、IDC、服务性能\安全调优、服务器系统级优化(与特定应用有关)等都需运维全程参与,并主导整个应用上线项目;运维工程师负责产品服务器上架准备工作,服务器系统安装、网络、IP、通用工具集安装。运维工程师还需要对上线的应用系统架构是否合理、是否具备可扩展性、及安全隐患等因素负责,并负责最后将产品(程序)、网络、系统三者进行拼接并最优化的组合在一起,最终完成产品上线提供用户使用,并周而复使:需求->开发(升级)->测试->上线(性能、安全问题等之前预估外的问题随之慢慢就全出来了)在这里提一点:网站开发模式与传统软件开发完全不一样,网站一天开发上线1~5个升级版本是家常便饭,用户体验为王嘛,如果某个线上问题像M$ 需要1年解决,用户早跑光了;应用上线后,运维工作才刚开始,具体工作可能包括:升级版本上线工作、服务监控、应用状态统计、日常服务状态巡检、突发故障处理、服务日常变更调整、集群管理、服务性能评估优化、数据库管理优化、随着应用PV增减进行应用架构的伸缩、安全、运维开发工作

    二、运维工作师需要什么样的技能及素质

做为一名运维工程师需要什么样的技能及素质呢,首先说说技能吧,如大家上面所看到,运维是一个集多IT工种技能与一身的岗位,对系统->网络 ->存储->协议->需求->开技能方面总结以下几点:

1、开发能力,这点非常重要,因为运维工具都需要自已开发发->测试->安全等各环节都需要了解一些,但对于某些环节需熟悉甚至精通

2、系统、网络、安全,存储,CDN,DB等需要相当了解,知道其相关原理

   三、怎样才算是一个合格的运维工程师

1、保证服务达到要求的线上标准,如99.9%;保证线上稳定,这是运维工程师的基本责职所在。

2、不断的提升应用的可靠性与健壮性、性能优化、安全提升;这方面非常考验主动性和创新思维。

3、网站各层面监控、统计的覆盖度,软件、硬件、运行状态,能监控的都需要监控统计,避免监控死角、并能实时了解应用的运转情况。

接下来,我们再谈谈如何科学的管理集群,有以下关键几点:

I、监控

主要包括故障监控和性能、流量、负载等状态监控,这些监控关系到集群的健康运行,及潜在问题的及时发现与干预;

a、服务故障、状态监控:主要是对服务器自身、上层应用、关联服务数据交互监控;例如针对前端web server,我们就可以有很多种类型的监控,包括应用端口 状态监控,便于及时发现服务器或应用本身是否crash、通过icmp包探测服务器健康状态,更上层可能还包括应用各频道业务的监控,常用方法是采用面业特征码进行判断,或对重点页面进行签名,以网站被黑篡改(报警、并自动恢复被篡改数据)等等

b、其它就是集群状态类的监控或统计,为我们合理管理调优集群提供数据参考、包括服务瓶颈、性能问题、异常流量、攻击等问题。

 

 

]]>