分类 "基础笔记综合整理" 下的文章

数组的赋值(声明)

1. declare -a  数组名
2. 数组名=(value1 value2 value3 value4 value5....)

调用数组中的所有值
~]# echo ${ar[]}
~]# echo ${ar[@]}
数组长度的获取,数组中的元素的个数
${#ar[
]}
元素长度的获取
~]# echo ${ar[1]} |wc -L #统计一行的字符数
~]# echo -n ${ar[1]]} |wc -L #去掉换行符统计
数组的叠加
a=(1,3,5,7)
b=(2,4,6)
数组的切片

${abc[*]:1}  从属组下标为1(指定值)开始取值,一直到属组尾部,为0时不写
${ab[*]:1:3}  从数组下标为1处开始取三个值
${ab[*]:(-2):2}  从倒数第二个下标开始取两个值

元素的切片:

    ${ar[1]:2:3}  将ar[1]中的字符从下标为2处开始取三位值
    ${ar[1]:2}  将ar[1]中的字符从下标为2处开始取值,取余下所有的字符
数组的替换(替换为空即删除)
    ${ar[*]  /旧字符/新字符}  "一个斜杠" 被匹配元素中字符无论出现几次,只替换数组中最开始匹配到的一次。
    ${ar[*] //旧字符/新字符}  "两个斜杠"  被匹配到元素中全部替换
    ${ar[*] /#字符 /新字符}  替换行首的字符
    ${ar[*] /%字符/新字符}  替换行尾的字符
~]# rev    #将字符反向输出

计划任务
单次计划任务
服务atd必须开机启动
~]# at 时间(确切时间)|now +#(minutes|hours|days)

>需要执行的操作
>Ctrl+D提交操作

at的黑白名单配置文件:
/etc/at.deny 默认存在且为空
/etc/at.allow 默认不存在,如果存在,优先级比at.deny高

  1. 当白名单不存在,却黑名单为空的时候,所有用户都可以使用at命令
  2. 当黑名单和白名单同时存在时,只有白名单中的用户可以使用at命令,且不受黑白名单影响,白名单的优先级比黑名单优先级高。

    ~]# atq #查看at任务
    ~]# at -c 任务号 #查看at任务
    ~]# atrm # #删除指定任务号

循环计划任务:按照给定的时间周期,进行有规律的进行任务的执行
服务:crond 必须开机自启
命令:crontab


分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-7,0/7为星期日)
!!周和日一般不同时设置
时间的频率: */# 每几(分/时/日)
连续的时间1-5 (周一到周五,1日到5日)
不连续的时间 1,3,5 1,3,5日 周1、3、5

  • 指定范围内的任意时间
    ~]# crontab -e    #命令的绝对路径或具有执行权限的脚本
    * * * * * /PATH/TO/SOMEWHERE/scripts
    

日志收集服务器实验
服务器搭建:
~]# vim /etc/rsyslog.conf #修改日志配置文件
选择使用UDP或者TCP传输,建议使用UDP,不占用连接资源。
开启模块:$ModLoad imtcp
开启端口:$InputTCPserverRun 514

客户机搭建:
~]# vim /etc/rsyslog.conf #修改配置文件
将对日志的操作定向到其他主机
@IP:514 采用UDP传输
@@IP:514 采用TCP传输
一般来说日志服务的端口为514
linux不依靠主机名识别,但日志的记录需要通过主机名区分
且主机名在日志记录时,使用的是简化的主机名(完整主机名中第一个点号之前的字符)

只有rsyslog识别的服务才能写入配置文件中
日志服务[连接符号] 日志等级 日志的记录位置
“.” 将日志大于、等于指定等级的日志全部记录下来
“.=” 只记录指定等级的日志
“.!” 除了该等级外的日志都记录
日志等级:
debug 一般的调试信息说明
info 基本的通知信息
notice 普通信息,又一定的重要性
warning 警告信息,但是还不影响到服务或系统的运行
err 错误信息,一般达到err等级的信息可以影响到服务或系统的运行
crit 临界状态信息,比err等级严重
alert 警告状态信息,比crit严重,必须立即采取行动
emerg 疼痛等级信息,系统已经无法使用

备份管理:
数据的安全性(防护),和完整性(备份)
需要备份的数据:
系统层面:配置文件、用户资料(家目录)、相关密码
应用层:web:http:网页目录、配置文件目录、日志
mysql:配置文静、数据库文件(有专门的备份工具)、mysqlhotcopy、mysqldump、log-bin日志(记录所有对数据库进行增删改的操作,实时备份)
其他日志,如mysql的运行日志、慢查询日志。
如何进行备份:
选择备份工具:diff、cpio、cp、tar、zip……scp(ssh+cp)远程复制
备份工具应当有事高效率、安全、稳定
备份地点:
同端备份:在同一设备上复制成多份
多端备份:在不同设备上保存多份
异地备份(灾备):异地将文件保存多份(数据库一定要做灾备)
云备份:不安全,但是双双重备份,成本低。
备份的时机:
热备:数据不停止读写时进行备份
温备:仅停止数据写入,进行备份
冷备:停止数据的读写进行备份
备份周期
视备份数据重要程度、文件大小选择适当的时机
不得在服务器高负载时进行备份
备份的频率取决于数据的安全等级和数据量大小
备份结束后需要检查备份策略是否正常执行
测试备份数据的可用性,在测试服务器上进行测试恢复。

差异备份:先进行一次完整备份,每一次备份都是基于原始备份更新,因此备份会越来越大。
完整备份:完整备份就是将所有的数据全部备份,好处是恢复数据方便,但是占用资源庞大。

需要永久保存的文件至少保存两份
差异备份也属于增量备份的类型
差异备份相当于每一次备份时,都与原始备份进行比较。
增量备份:第一次为原始备份,之后的备份是以上一次备份数据作为参照进行的。

我们备份一个数据时,支持0-十个备份级别,第一次备份应当使用0级别,会将所有的数据完整的备份一次,第二次备份就可以使用1级别了,它会0级别的数据进行比较,把0级别备份后发变化的数据进行备份,。
只有在备份整个分区或者硬盘时,才能支持1-9的增量备份级别,而如果只备份某个文件或者不是分区的目录时,只能使用0级别进行完整备份。
~]# dump —level #(0-9) 指定备份的级别,也可使用 -#指定备份级别
增量备份:先指定0,再指定1-2-3-4-5…..
差异备份:先指定0,再指定1-1-1-1-1….
-f 指定备份文件的名称
-u 备份文件系统时(分区),记录备份的时间于/etc/dumpdates中
-j 调用bzip2压缩库,压缩的文件后缀为”.bz2”
一般来说,dump备份文件时以dump.*作为后缀方便理解
dump —level 0 -uj -f /root/boot.dump.bz2 /boot(操作对象)
dump -0uj -f /root/boot.dump.bz2 /boot
~]# restore 恢复备份命令,需事先切换到需要恢复的目录下再执行,否则恢复到当前目录
~]# restore -r #还原模式,还原数据
~]# restore -i #交互模式,可以有选择的恢复
add 文件名|标记
extract 进行指定恢复的交互界面: >1 (固定值) >n (no)
~]# restore -t DumpFile #查看备份文档中的内容
~]# restore -C -f DumpFile #将备份文件与源文件进行比较
~]# restore -C 只能检查原始数据文件中丢失了哪些文件,对于新增的文件无法识别
~]# restore -W #查询系统内进行过DUMP别分的分区,以及备份级别和备份时间

日志管理:一般是自己编写管理脚本
日志的管理服务:syslog—->rsyslog(rsyslog向前兼容)
rsyslog只针对系统相关日志,分析日志的类型,将日志保存到指定的位置,支持将日志通过TCP协议簇汇总到日志服务器,汇总后的日志通过主机名进行区分

常见的日志文件(系统默认的日志)
/var/log/cron 记录了定时任务相关的日志
/var/log/cpus 记录了打印信息的日志
/var/log/dmesg 记录了系统在开机时内核自检的信息,也可以使用dmesg命令查看内核自检信息。
/var/log/btmp 记录错误登录日志,这是一个二进制文件,不能使用vim等文本查看工具直接打开,需要使用lastb命令查看。
/var/log/mail/log 记录邮件信息
/var/log/lastlog 记录系统中最后一次登录时间的日志,这个文件是二进制文件,需要使用lastlog命令查看。
/var/log/message 记录系统产生的重要信息日志,这个日志文件记录了linux系统的巨大多数重要信息,如果系统出现问题,首先要检查这个文件。
/var/log/secure 记录验证和授权方面的信息,只要涉及账号密码的操作都会记录到这个文件中。
/var/log/wtmp 永久记录所有用户的登录,注销信息、同时记录系统的启动、重启、关机事件、二进制文件,需要使用last命令进行查看。
/var/run/utmp 记录当前已登录用户的信息,这个文件会随着用户的登录和注销而不断变化、只记录挡圈登录用户的信息,使用w/who/users等命令查询
/var/log/httpd RPM包的apache服务的默认日志目录
/var/log/mail RPM包安装的邮件服务的额外日志目录
/var/log/samba RPM包安装的samba服务的日志目录
/var/log/sssd 守护进程安全服务目录
源码包的日志安装在指定的目录下

日志文件中的格式
事件的发生时间
服务器的主机名
服务名或者程序名
事件的集体信息

rsyslog配置文件
/etc/rsyslog.conf
第一列为日志类型和日志优先级的组合,每个类型和优先级的组合称为选择器。
第二列为保存日志的文件、服务器,或输出日志的终端,syslog根据选择器决定如何操作日志。

1. 日志的类型和优先级使用"."进行分隔
2. 规则定义越详细优先级越高,如:kernel、debug的优先级大于debug
3. "*"表示所有,如:*.debug表示所有类型的调试信息
    kernel.* 表示内核产生的所有消息
4. 可以使用逗号","分割多个日志类型,使用分号";"分割多个选择器
    日志类型.none表示此类型日志不记录

对日志的操作:

1. 将日志输出到文件:/var/log/message,/dev/console
2. 将消息发送给用户,多个用户使用逗号分隔
3. 通过管道将消息发送给用户程序,程序放到管道符后
4. 将消息发送给其它主机上的rsyslog进程

只有rsyslog识别的服务才能写入配置文件中
日志服务[连接符号] 日志等级 日志的记录位置
“.” 将日志大于、等于指定等级的日志全部记录下来
“.=” 只记录指定等级的日志
“.!” 除了该等级外的日志都记录
日志等级:
debug 一般的调试信息说明
info 基本的通知信息
notice 普通信息,又一定的重要性
warning 警告信息,但是还不影响到服务或系统的运行
err 错误信息,一般达到err等级的信息可以影响到服务或系统的运行
crit 临界状态信息,比err等级严重
alert 警告状态信息,比crit严重,必须立即采取行动
emerg 疼痛等级信息,系统已经无法使用
日志的轮替:
主要目的是为了防止单个文件过大,按照我们的规则对日志进行相应处理
主要依赖/etc/logrotate.conf配置文件,dateext参数实现日志的处理
weekly 每周对日志进行依次轮替
rotate 在轮替的过程中,自动创建信息的文件
dateext 使用日期作为日志文件的后缀
compress 是否压缩进行轮替的日志
size 大小,日志只有大于指定大小才进行轮替
missingok 如果日志不存在忽略该日志的警告信息
notifempty 如果日志为空文件,则不进行日志的轮替

系统自动进行日志轮替的原因:
/etc/cron.daily/下有一个脚本,每天都运行,查看是否有符合轮替的日志,然后进行相应处理。
rsyslog所管理的服务:系统服务
logratate能管理绝大部分的日志,rpm包安装的包能够被logrotate管理,但是需要加入规则
将产生的日志按照预设的参数进行轮替。
日志文件类型改为压缩类型后,之前产生的日志将永久保存,不会删除。
~]# logrotate -vf /etc/logratate.conf 强制执行日志的轮替
~]# split FileName
-b 按大小对文件进行切割(会切断行),单位自行指定
-l 按行进行切割
-d 声明文件切割后的文件前缀
-a 3 指定以数字作为后缀,且以三位数值显示

将工具(脚本)模块化的思路:

  1. 写成函数文件/函数
  2. 将每一个功能单独实现,在一个主脚本中去调用
    日志(受rsyslog管理的日志),改名、移动后均会向其中写入日志,删除后不会创建新文件,也不会记录日志。?需要在产生日志的环境下验证,比如httpd日志

linux进程及作业管理
CPU划分为时间片(timeslice),分配给程序使用,根据优先级确定给哪个程序使用
内核负责进程的管理
CPU中有一个指针指令寄存器,其中记录的是下一条命令的指针(地址),保存当前进程的状态
内核的功能:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能
进程有生命周期,进程在内核中称为任务
task,struct,任务结构体,linux内核存储进程信息(元数据)的固定格式。
数组在内存中必须是连续的空间
链表在尾部加上指针,指向下一个数据
多个任务的task,strct组成的链表:task list任务列表
当中断发生时,必须由内核接管CPU
进程的创建:进程都是由父进程创建, 如果不写入数据则公共使用共享数据,只有在子进程需要写入数据时再copy一份进行写入操作,COW,写时复制。
 子进程是父进程为完成某个功能创建的,子进程结束后由父进程销毁。

进程的优先级:0-139
0-99 (0很少使用)实时优先级,数字越大优先级越高
100-139 用户可调整优先级,数字越小,优先级越高
nice值:(-20)到(+19),对应100-139
通过调整nice值改变进程的优先级:
每个优先级有两个队列,一个为运行队列,一个为过期队列,每次只扫描140个运行队列的首部,当运行时间结束,与过期队列调换继续在CPU上运行。

内核负责资源的分配:
为了完成现代操作系统的管理,内核将自身在占用以外的内存划分为4K大小(页框),用于存放页面数据,页框:page Rfame
内核采用虚拟内存机制,使得每个程序都认为自己是独占内存,线性地址。线性地址与实际地址的对应关系由内核管理。
MMU:memory management unit,CPU中的内存管理单元,负责实时转换线性地址为真实地址。
缺页异常:内存中的页面不存在了,可能是被交换出去了,也可能在硬盘上存储,内存中的数据不是所有都可以交换的。
必须存在于内存中的,称为常驻内存级;
可以交换出去的,称为虚拟内存级。
IPC:Inter porcess communication 进程间通信
同一主机:single发信号
shm:shared memory
跨主机:socket 套接字
RPC:Remote Procecure Call 远程过程调用
linux内核:抢占式多任务
进程类型:
守护进程daemon,在系统引导过程过程中启动的进程,根终端无关的进程
用户进程:前台进程,跟终端相关,通过终端启动的进程。
进程状态:
运行态:running
就绪态(睡眠态)
可中断睡眠:Interruptable
不可中断睡眠:uninterruptable 等待数据载入
当一个进程向内核申请从磁盘获取数据时,内核先间数据载入内核空间,再将数据复制到进程内存中啊,一次IO分两段运行
停止态:stopped,暂停于内存中,但是不会被调度,除非手动启动
僵死态:Zombie,没有被回收的进程

进程分类:
CPU-Bound CPU密集型,一般为非交互式
IO-Bound IO密集型,一般为交互式,交互式需要立即反应,因此优先级较高

家目录下的配置文件,只针对单个用户生效
~/.bashrc 定义别名等
~/.bash_profile 定义PATH环境变量
/etc/针对所有用户生效的配置文件
/etc/bashrc PS1、PATH、UID
/etc/profile PATH、EUID(进程的有效用户ID)
/etc/profile.d/.sh
环境的执行顺序
~/.bash_profile —> ~/.bashrc —> /etc/bashrc —> /etc/profile —> /etc/profile.d/
.sh
~/bash_logout该配置文件(脚本)会在正常退出终端时执行
~]#id -ru #显示用户的真实UID
/etc/issue 登录显示的信息
/etc/issue.net 远程登录时显示的登录信息(需要开启ssh调用),在登录完成后显示
/etc/ssh/sshd_config中Banner开启并指向/etc/issue.net文件
/etc/motd 不区分登录方式显示提示信息
~]# stty -a #查看所有快捷键

centOS6中让自己写的脚本或者源码支持chkconfig
向放入/etc/init.d/下的脚本中添加两行信息

# chkconfig: 2345(生效的级别)  10(启动的顺序)  90(关闭的顺序)
# description: 服务的描述信息

~]# chkconfig -add 脚本名
验证是否成功:echo $?
~]# chkconfig —list |grep 服务名 #检查是否安装加入开机自启动

模块加载:
/lib/modules/2.6.32./kernel
~]# lsmod #列出当前已启用的所有模块
~]# modinfo Mode_Name #查看指定模块的详细信息,所有支持的模块都能够查看
~]# modprobe Mode_Name #装载指定的模块到内核
当新加入一个模块(复制到目录下)时,本机不能够立即识别,需是同平台模块。
~]# depmod #扫描模块,将新的模块信息写入
/lib/mudulles/2.6.32.
/modeles.dep 保存模块信息的模块,只有在modules.dep文件
~]# modprobe -r MOD_NAME #卸载指定模块
系统管理:
进程是一个状态,是计算机中的程序关于某数据集合上的一次活动
线程是进程处理的最小单位,也称为轻量级进程
例如用户访问80的请求为线程
程序是代替人管理操作系统,完成特定的任务,解决特定问题的一段代码集合

~]# ps aux (以BSD风格显示)
USER 由哪个用户产生
PID 进程号
%CPU CPU使用百分比
%MEM 内存使用占比
VSZ 虚拟内存级,占用虚拟内存的大小
RSS 常驻内存级,占用真实内存的大小
tty 登录终端
STAT 进程状态
S 休眠状态
R 正在运行的程序

    +  处于前台的进程
    N  优先级较低的进程
    <  优先级较高的进程
    !  多进程的(包含有子进程)
    s  进程的领导者
    D  无法中断的休眠状态(uninterruptable)
    T  停止或被追踪
    Z  僵尸进程,有些情况下,父进程被销毁,但是子进程驻留内存
    L  被锁定进内存的进程,与系统启动相关
      当windows蓝屏时报错为段内存地址空间,可通过这个地址判断蓝屏的原因
    START  进程启动时间
    TIME  进程运行的时间(在CPU上运行的总时间)
    COMMAND  由哪个命令产生的此进程

~]# ps -le
F 当前进程的权限
1 进程可复制
4 进程使用超级管理员权限
PPID 父进程
S 进程状态
C CPU使用占比
PRI 进程优先级(80或-40)
PRI决定了进程获取资源的优先级
NI nice值
[PRI最终值=PRI原值+NI(可修改)]
可通过修改NI值来影响进程的优先级
ADDR 进程在内存中的地址(不锁定不显示)
SZ(size) 进程占用内存大小
WCHAN 进程是否运行(”-“表示正在运行)
优先级:
NI的范围:(”-20”到”+19”)
普通用户只能调大NICE值0-19

  1. nice -n # service httpd start #服务启动时指定优先级
  2. renice -# PID #更改指定进程的优先级
    默认NI为0
    PRI为80

    ~]# top [option]
    -d 秒数,指定刷新时间,默认为3秒
    -b 使用批处理模式
    -n # 指定次数,常与-b一同使用
    -p PID #查看指定PID进程
    -u 用户名,只看某一用户运行的进程
    -s 安全模式,避免在交互式下出现错误
    ~]# pstree [option] #进程树查看
    -p 显示程序进程号
    -u 显示进程的用户
    ~]# kill [signal] PID #默认使用15信号,正常关闭
    HUP (1) 通知进程重新加载配置文件
    INT (2) 终端,同ctrl+C只能终端前台(占用终端的)进程
    TERM (15) 终止,正常退出
    CONT (18) 继续运行
    STOP (19) 暂停—Ctrl+Z
    ~]# killall [signal] 进程名 #杀死一类进程
    -I(大) 忽略大小写
    ~]# pkill -t 终端号 #结束终端用户的登录

进程号:不区分终端
工作号:区分终端(工作号只能在相应终端中查看)
工作号只有位于后台的进程才有
~]# jobs -l #显示PID(进程号),查看工作
fg #(工作号) #将指定工作号调回前台执行,默认调回工作号后带”+”号的。
bg #(工作号) #将后台进程(停止的)运行起来,依旧运行在后台。
将命令放入后台的方式:

1. 命令 &    #在命令后加上"&"符,将命令放入后台
2. Ctrl+Z ; bg    #将前台的进程放入后台,在执行后台的作业

一般来说进程都是与终端相关联的,只要终端关闭,其进程也会关闭
使命令脱离终端运行的方式

  1. 写入/etc/rc.local(不建议)
  2. 写入cron定时任务计划任务
  3. nohup 命令 操作对象 & #使命令脱离终端运行
    系统资源查看
    ~]# vmstat #监控系统资源
    procs 进程
    r 运行队列中进程数量
    b 阻塞队列的数量
    Memory内存
    swap 如这个值大于0,则表示物理内存不够用
    si 每秒从磁盘读入内存的大小
    so 每秒从内存读入磁盘的大小
    system
    in 每秒CPU的中断数,包括时钟中断
    cs 每秒上下文的切换次数(资源调用的次数)
    ~]# dmesg #查看内核的检测信息
    /var/log/dmesg #只记录这一次开机时的检测信息
    ~]# free #查看内存的使用情况
    -b 以字节为单位显示
    -k 以KB为单位显示
    -m 以MB为单位显示
    -g 以GB为单位显示

查看CPU信息

  1. 逻辑CPU个数
    cat /proc/cpuinfo |grep “processor” |wc -l
  2. 物理CPU的个数
    cat /proc/cpuinfo |grep “physicalid” | sort -u | wc -l
  3. 每个物理CPU中core(核心)个数
    cat /proc/cpuinfo |grep “cpu cores” | uniq | awk -F “:” ‘{print $2}’
  4. 查看core id的数量,即为物理CPU上的core的个数
    cat /proc/cpuinfo |grep “core id” |uniq |wc -l
    非超线程CPU算力强
    超线程CPU:能同时执行更多的进程,线程为核心数的两倍

    ~]# uptime #系统启动时间和平均负载(一般使用top)
    ~]# uname #查看系统与内核相关信息
    ~]# lsb_release -a
    ~]# lsof #列出进程打开或者正在使用的文件信息
    ~]# lsof -p PID #查看某进程运行时所调用的资源
    ~]# lsof -u UID #查看指定用户运行的进程调用了哪些文件
    ~]# ldd COMMAND PATH #查看指定命令执行时要调用的库函数文件
    !!有些恶意软件写入函数文件中,在特定的条件下才会被触发,列如执行某个命令,此时需要排查函数文件的文件数据修改时间,如果发现异常,替换为安全的文件。