1.内核负责的主要功能

  系统内存管理、软件程序管理、硬件设备管理、文件系统管理

2.GNU工具链

  Linux内核是系统的核心,控制着内存、程序和硬件等是如何与对方交互的。内核还需要工具链来执行一些标准功能,比如控制文件、文本和进程等。

3.terminfo数据库

  Linux需要知道你模拟的哪个终端,及在和终端模拟器通信时使用哪些控制码,terminfo数据库是一组文件,系统将每种终端类型的terminfo数据作为单独文件存储在terminfo数据库目录(随发行版不同而不同,有可能为/usr/share/terminfo、/etc/terminfo、/lib/terminfo)。特定终端的单独文件被存储在其名称对应的字母目录下,比如/usr/share/terminfo/v里是VT终端模拟器

4.大多数Linux发行版默认shell都是 GNU bash shell,能够提供对Linux系统的交互式访问,它是作为常规程序运行的,通常都是在用户登录终端时启动。登录时启动的shell依赖于用户账户的配置(/etc/passwd每行的最后一列为启动时默认的shell)。

5.硬链接相当于变量别名(有相同的索引节点号),一改全改,但是删除一个,另一个还可以访问;软链接相当于快捷方式,当目标文件删除时,快捷方式失效。

6.启动bash shell有3中方式:

  1).登录时当做默认登录shell

  2).作为非登录shell的交互式shell

  3).作为运行脚本的非交互shell

7.用户管理命令useradd,userdel,usermod,passwd,chsh;用户组管理命令groupadd,groupdel,groupmod

8.useradd -D 查看添加用户时的默认配置信息,后跟参数可以修改系统默认配置信息



$ useradd -D
GROUP=100 #用户所属组
HOME=/home #用户家目录所在目录
INACTIVE=-1 #账号密码过期后是否禁用此用户
EXPIRE= #过期时间
SHELL=/bin/bash #用户登录后的默认shell
SKEL=/etc/skel #系统会将/etc/sekl目录下的文件复制到用户home目录下
CREATE_MAIL_SPOOL=yes #是否为用户创建一个用于接收邮件的文件



  修改参数

索尼 PS1模拟器 Bios 下载_数据库

  比如



useradd -D -s /bin/tsch



9./etc/passwd,/etc/shadow,/etc/group

10.sudo

  用来以其他身份来执行命令, 预设的身份为root, 在/etc/sudoers中设置了可执行sudo指令的用户, 若其未经授权的用户企图使用sudo, 则会发出警告的邮件给管理员, 先输入密码, 之后有5分钟的有效期限, 超过期限则必须重新输入密码

必须使用visudo命令编辑, 之所以使用visudo有两个原因, 一是它能够防止两个用户同时修改它, 二是它也能进行有限的语法检查, 所以, 即使只有你一个超级用户, 你也最好用visudo来检查一下语法

11.read, 如果输入个数多于指定变量的个数, 最后一个指定变量将存放剩余所有输入, 如果没有指定变量, 则把输入存放到 REPLY 全局变量

  -p 指定打印

  -t 设定超时时间

  -s 是否隐藏输入

12.当使用重定向符号时, Linux会用重定向指定的文件描述符来替换原有文件描述符

13.大多数Linux操作系统在重启时会自动删除/tmp中的所有文件

14.所有账户都有权限在/tmp文件夹中读写, 而且不用管理清除

15./etc/cron.*ly 如果不精确的定时执行, 可以把执行文件放在其目录中, 比如 cron.dayly 目录, 其内文件每天执行一次

16.

  boot的含义,boot是bootstraps(鞋带)的缩写,启动就好像拎着鞋带把自己提起来那么纠结(Pull oneself up by one's bootstraps),必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序

  按下电源

  BIOS(Basic Input/Output System,是存储在ROM(Read Only Memory)上的一段程序)系统通电自检(Power-On Self-Test即POST)

    1.会检查各种硬件是否正常,比如内存松动就会报错无法启动,如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息

    2.根据我们在BIOS中设置的系统启动顺序(比如Windows中BIOS系统中设置磁盘/CD/DVD/...为第一启动)把控制权转交给排在第一位的储存设备,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备,这最前面的512个字节,就叫做"主引导记录"(Master boot record,缩写为MBR)

    3.就会将MBR内容复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了,以下以grub为例

  启动内核,grub会解析grub的配置文件/boot/grub/grub.conf,然后加载内核镜像到内存中,并将控制权转交给内核

  

init进程,是一个由内核启动的用户级进程,内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。所以,init始终是第一个进程(其进程编号始终为1)。会读取/etc/inittab文件获取运行级别

  rc.d: run control directory

  最先运行的服务是放在/etc/rc.d 目录下的文件

17.sed(stream editor)被称作流编辑器,与文本编辑器(比如Vim)不同,不是以键盘命令来交互式的插入、删除或替换数据中的文本,而是基于预先提供的一组规则来编辑数据流。

  sed编辑器每次从输入中读取一行,用提供的编辑器命令匹配数据、安命令中制定的方式修改流中的数据,然后将生成的数据输出到STDOUT,在流编辑器将所有命令与一行数据进行匹配完成后,会读取下一行数据并重复这个过程。sed只支持基本正则表达式(BRE)、而不支持扩展正则表达式(ERE,有"问括花管加")。



sed options script file



地址范围 + 操作" 组成

  -e script 在处理输入时,将script中制定的命令添加到运行的命令中

  -f file 在处理输入时,将file中制定的命令添加到运行的命令中

  -n 不打印,可以调用p命令打印匹配行



#s替换(substitute)
#d删除(delete)
#c更换(change)
#y转换(transform)
#i添加(insert)
#a添加(append)
#p打印(print)
#n切换到下一行,清空sed编辑器的工作空间,将数据流中的下一文本行移动到其中,空间中只保持一行(next)
#N多行处理命令,不清空sed编辑器的工作空间,把数据流中的下一行文本添加到空间中,会把将两行当做一行进行处理
#D多行删除命令,在多行时,只删除空间中的匹配行 sed '/^${N; /header/D}' filename
#P多行打印命令,在多行时,p只打印多行工作空间中的第一行,P打印多行
#h将模式空间复制到保持空间(hold space)
#H将模式空间附加到保持空间
#g将保持空间复制到模式空间
#G将保持空间附加到模式空间
#x交换模式空间和保持空间的内容 sed -n '/first/{h;p;n;p;g;p}'
#w写入文件(write)
#l打印不可见字符(list)

#寻址方式(address)
#"行号", $表示末尾行
#"行号,行号"
#"/匹配行/"
#"/匹配行/,/匹配行/"

#插入以下的i可以更改为a,i、a分表表示address前和后插入
#[address]i\newline

#删除
#[address]d

#修改行
#[address]c\newline #多行时会合并为一行newline

#替换行
#[address]s/oldchars/newchars/

#转换行
#[address]y/inchars/outchars/

#指定行多命令模式
#[address]{command1; command2; command3}

#对匹配行的下一行进行操作
#[address]{n;d} #删除匹配行的下一行

#对匹配行和下一行进行操作,即当成一行来处理
#[address]{N;s/\n/ /} #合并匹配行和下一行
#sed 'N;s/System.Administrator/Desktop User/' filename #查找和替换被分隔成两行的两个单词

#每行多命令模式
#-e 'command1; command2'

#向文件写入
#[address]w filename

#从文件中读取,其中address只能是行号或者匹配,不能是范围
#[address]r filename

#注意是单引号,注意最后的 "/"
echo "This is the test" |sed 's/test/big test/'

#多条命令用 -e 选项,并且用 ";" 隔开
echo "This is the test" |sed -e 's/This/That/; s/test/big test/'

#从文件中读取命令
echo "This is the test" |sed -f 'mysed.script'

#处理指定数量行
echo "This is the test" |sed '1s/test/big test/'

#处理指定匹配行
echo "This is the test" |sed '/test/s/test/big test/'

#在单行上执行多条处理命令
echo "This is the test" |sed "1{s/This/That/; s/test/big test/}"

#删除行
sed 1d filename #删除1行
sed 2,3d filename #删除2-3行
sed 6,$ filename #删除从6行到结尾行
sed /test/d filename #删除匹配行
sed /test1/,/test2/d filename #删除两个匹配行之间的行

#添加行
echo 'aaaaa' |sed 'i\bbbbb' #在前插入一行 注意此处是反斜线
echo 'aaaaa' |sed 'a\bbbbb' #在后插入一行
sed '3i\bbbbb' filename #在第3行前插入一行
sed '3a\bbbbb' filename #在第3行之后插入一行
sed '$i\bbbbb' filename #在最后一行之前插入一行
sed '$a\bbbbb' filename #在最后一行之后插入一行

#修改行
sed '3c\This is a changed line of text' filename #把文件的第三行修改为如上内容
sed '/test/c\This is a changed line of text' filename #把文件中所有能匹配"test"的行替换为如上内容
sed '2,3c\This is a new line of text' filename #把2~3行替换为一行如上内容

#转换
sed 'y/123/789/' filename #把文件中每一行中1、2、3分别转换为7、8、9

#打印指定行
sed -n '2,6p' filename
sed -n '/3/{p; s/line/test/p}' filename #含有数字3的

#打印行,并且列出不可打印的ASCII字符
sed -n 'l' filename #This\tline\tcontains\ttabs.$

#向文件中写入
[address]w filename
sed '2,3w mydata.txt' filename

#从文件中读取
[address]r filename
sed '3r mydata.txt' filename



18.awk 提供一个类编程环境,修改和重新组织文件中的数据,它提供了一种编程语言而不只是编辑器命令,相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题



awk options program file



  option program 格式为 "BEGIN{xxx}expr{xxxx}expr{xxx}...END{xxx}"

  -F 指定分隔符

  -v var=value 将外部变量传入,也可以直接使用 '$varname',注意变量外必须带上单引号!

  -f 将file中制定的命令添加到运行的命令中

  变量: $0表示本行数据,$1表示第一个字段,也可以修改,如下:



echo "My name is Rich" | awk '{$1="Chinese"; print $1;}'



awk options 'BEGIN{...}pattern{...}END{...}' file



  '  '          引用代码块



  BEGIN   初始化代码块,在对每一行进行处理之前,初始化代码,主要是引用全局变量,设置FS分隔符



既能当匹配条件,也能当执行条件:



    1).正则表达式匹配 /xxx/



    2).关系表达式 条件操作符<、<=、==、!=、>=



匹配:awk '{if ($4~/ASIMA/) print $0}' temp 表示如果第四个域包含ASIMA,就打印整条
精确匹配:awk '$3=="48" {print $0}' temp    只打印第3域等于"48"的记录,防止字符串与变量混淆,字符串使用""
不匹配:  awk '$0 !~ /ASIMA/' temp      打印整条不包含ASIMA的记录
不等于:  awk '$1 != "asima"' temp
小于:    awk '{if ($1<$2) print $1 "is smaller"}' temp
设置大小写: awk '/[Gg]reen/' temp      打印整条包含Green,或者green的记录
任意字符: awk '$1 ~/^...a/' temp    打印第1域中第四个字符是a的记录,符号’^’代表行首,符合’.’代表任意字符
或关系匹配: awk '$0~/(abc)|(efg)/' temp   使用|时,语句需要括起来
AND与关系:  awk '{if ( $1=="a" && $2=="b" ) print $0}' temp
OR或关系:   awk '{if ($1=="a" || $1=="b") print $0}' temp



  {}           命令代码块,包含一条或多条命令



  ;          多条命令使用分号分隔



  END      结尾代码块,在对每一行进行处理之后再执行的代码块,主要是进行最终计算或输出结尾摘要信息



 



  $0           表示整个当前行



  $1           每行第一个字段



  NF          字段数量变量



  NR          每行的记录号,多文件记录递增



  FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始



  \t            制表符



  \n           换行符



  FS          BEGIN时定义分隔符



       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)



  ~            匹配,与==相比不是精确比较



  !~           不匹配,不精确比较



  ==         等于,必须全部相等,精确比较



  !=           不等于,精确比较



  &&      逻辑与



  ||             逻辑或



  +            匹配时表示1个或1个以上



  /[0-9][0-9]+/   两个或两个以上数字



  /[0-9][0-9]*/    一个或一个以上数字



  FILENAME 当前处理的文件名



  ARGIND 当前处理的文件的顺序编号( awk 'xxxx' file1 file2)



  ARGV 类似 C 中的 argv,ARGV[n] 表示第 n 个参数



  OFS      输出字段分隔符, 默认也是空格,可以改为制表符等



  ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕



  -F'[:#/]'   定义三个分隔符



 



#只会打印偶数行(没有用if)
awk 'NR%2==1{next}{print NR,$0;}' text.txt



awk 'BEGIN{ "date" | getline out; print out }' test



  输出重定向



echo | awk '{print ("hello word!n") > "datafile"}' 或 echo | awk '{printf("hello word!n") >> "datafile"}'



#注意:重定向符号后面的文件名必须带上双引号,因为awk类型中是字符串
awk '{print > "file"}' file



  把shell中的变量带入awk中执行



a=10
awk 'BEGIN{print '$a'}'



  把 /etc/passwd 中的第二列 "x" 改为 /etc/shadow 中的用户密码



awk 'BEGIN{OFS=FS=":"}NR=FNR{a[$1]=$2}NR>FNR{$2=a[$1]; print}' /etc/shadow /etc/passwd



  continue,break 用于 for in,for,while 等循环

  exit 语句使主输入循环退出并将控制转移到END,如果END存在的话。如果没有定义END规则,或在END中应用exit语句,则终止脚本的执行。   

  a in array,判断 a键名是否在array中

  字符串函数:sub、gsub、lenth、index、match、split、substr、tolower、toupper、sprintf

  时间函数:systime()、mktime(YYYY mm dd HH MM ss)、strftime(format[, timestamp])

19.后台任务

  后台任务有两个特点:

    1.继承当前 session (对话)的标准输出(stdout)和标准错误(stderr),因此,后台任务的所有输出依然会同步地在命令行下显示

    2.不再继承当前 session 的标准输入(stdin),你无法向这个任务输入指令了,如果它试图读取标准输入,就会暂停执行(halt)

  可以看到,”后台任务”与”前台任务”的本质区别只有一个:是否继承标准输入,所以,执行后台任务的同时,用户还可以输入其他命令

  Linux系统是这样设计的:

    1.用户准备退出 session

    2.系统向该 session 发出SIGHUP信号

    3.session 将SIGHUP信号发给所有子进程

    4.子进程收到SIGHUP信号后,自动退出

  上面的流程解释了,为什么”前台任务”会随着 session 的退出而退出:因为它收到了SIGHUP信号

  那么,”后台任务”是否也会收到SIGHUP信号?  这由 Shell 的huponexit参数决定的



shopt |grep huponexit



  大多数Linux系统,这个参数默认关闭(off),因此,session 退出的时候,不会把SIGHUP信号发给”后台任务”,所以,一般来说,”后台任务”不会随着 session 一起退出

disown命令,它可以将指定任务从”后台任务”列表(jobs命令的返回结果)之中移除,一个”后台任务”只要不在这个列表之中,session 就肯定不会向它发出SIGHUP信号



# 移出最近一个正在执行的后台任务
$ disown

# 移出所有正在执行的后台任务
$ disown -r

# 移出所有后台任务
$ disown -a

# 不移出后台任务,但是让它们不会收到SIGHUP信号
$ disown -h

# 根据jobId,移出指定的后台任务
$ disown %2
$ disown -h %2



  使用disown命令之后,还有一个问题,那就是,退出 session 以后,如果后台进程与标准I/O有交互,它还是会挂掉,这是因为”后台任务”的标准 I/O 继承自当前 session,disown命令并没有改变这一点,一旦”后台任务”读写标准 I/O,就会发现它已经不存在了,所以就报错终止执行,为了解决这个问题,需要对”后台任务”的标准 I/O 进行重定向



python test.py>result 2>&1



  还有比disown更方便的命令,就是nohup

  nohup命令会对进程做三件事

    1.阻止SIGHUP信号发到这个进程

    2.关闭标准输入,该进程不再能够接收任何输入,即使运行在前台

    3.重定向标准输出和标准错误到文件nohup.out。

  也就是说,nohup命令实际上将子进程与它所在的 session 分离了,但是,nohup命令不会自动把进程变为”后台任务”,所以必须加上&符号

Screen

  除了专用工具以外,Linux系统有自己的守护进程管理工具 Systemd ,它是操作系统的一部分,直接与内核交互,性能出色,功能极其强大,我们完全可以将程序交给 Systemd ,让系统统一管理,成为真正意义上的系统服务

查看环境变量



env



系统提示符变量



PS1



查看当前内存详细信息



cat /proc/meminfo



查看文件类型



file filename



查看文件详细信息



stat filename



a