计算机指令系统:
CPU实际要处理的数据全部是来自内存
不同X86架构的CPU的主要不同在于微指令集的不同,新的CPU往往有更加丰富的指令系统。(当然不同的CPU还有cache的级数、大小,频率的高低等的不同)
最新的Intel/Amd的X86架构中,重要的为指令集如下(仅供参考):
多媒体微指令集:MMX,SSE,SSE2,SSE3,SSE4,AMD-3DNow
虚拟化微指令集:Intel-VT,AMD-SVM
省电功能:Intel-speedstep,AMD-PowerNow
64/32位兼容技术:AMD-AMD64,Intel-EM64T
芯片组:
主板上最重要的设备就是主板芯片组,芯片组的功能就是将所有的设备全部汇集在一起。Intel的芯片组通常分为两个网桥来控制各个组件的沟通。分别是:(1)北桥:负责连接速度较快的CPU、主存储器和显示适配器等组件;(2)南桥:负责连接速度较慢的周边接口,包括键盘、USB、网络卡等等。
AMD与Intel不同之处在于:AMD的主存储器直接与CPU沟通而不是北桥。CPU处理的资料直接来自内存,因此AMD是为了加速两者之间的沟通,所以将内存控制组件整合到CPU当中,理论上可以加速CPU与主存储器的传输速度。这是AMD和INTEL两种CPU的主要差别。
CPU的倍频和外频:
外频是CPU与外部组件进行数据传输时的速度,倍频则是CPU内部用来加速工作效能的一个倍数(CPU与外部各组件的速度理论上应该要一致才好,但是CPU需要较为强大的运算能力,因为很多判断和计算都是在CPU内部完成的,因此CPU开发商就在CPU内再加上一个加速功能,所以CPU有所谓的倍频与外频)
磁盘的第一个扇区主要记录了两个方面的信息:
主要启动记录区和分割表(MBR),可以安装开机管理程序(446字节);分割表记录整个硬盘的分割状态,占64字节,因此最多只能有四个主分区和扩展分区。所谓磁盘的分割就是对这64字节的分割表进行设定,分割槽的最小分割单位是磁柱
MBR很重要,因为在系统开机的时候会主动去读取MBR的内容,这样系统才能找到系统并开机。
MBR:
简单的说,整个开机流程到操作系统之前的动作是这样的:
1.BIOS:开机主动执行的固件,会认识第一个可开机执行的装置。
2.MBR:第一个可开机装置中的第一个扇区内的主要启动记录区块,内有开机管理程序
3.开机管理程序(boot loader):一只可读核心档案的软件,在安装操作系统的时候装入。
4.核心档案:开始操作系统的功能
开机管理程序的主要任务(boot loader):
1.提供选单:用户可以选择不同的项目,这是多重引导的重要功能
2.转入核心档案:直接指向可开机的程序区段开始操作系统程序
3.转交给其他loader:将开机管理功能转交给其他loader负责(开机管理程序除了可以安装在MBR之外,还可以安装在每个分割槽的启动扇区(boot sector),这个特色造就了多重引导的功能)
Linux系统的开机过程:
BIOS-->MBR-->BOOT LOADER-->系统核心档案
Boot loader的功能主要有:提供选单、加载核心、转交控制权给其他loader,Boot Loader可以安装的主要地方有两个,一个是MBR,另外一个是Boot Sector。
SELinux是一个Linux系统讵问控制(Accesscontrol)的绅部讴定, 重点在于控制程序对于系统档案的讵问权限限制。
Kdump就是,当核心出现错误的时候,是否要将当时的内存内的讯息写到档案中,而这个档案就能够给核心开发者研究为啥会当机时用。 我们并不是核心开发者,而且内存内的数据实在太大了,Kdump会造成硬盘空间的浪费。 所以,这里建议不要开启Kdump的功能。
根目录:
根目录与开机过程有关,在开机过程中根目录会被挂载,其他的目录只有在开机完成后才能被挂载,因此与开机过程有关的目录,只能放在根目录下而不能放在其他的目录下。
/etc配置文件;/bin重要执行档(与开机过程有关);/dev所需要的档案装置;/lib:执行档所需的函式库和核心所需的模块(如驱动程序);/sbin:重要的系统执行文件
/bin主要放置开机时或者进入单人模式后还能被运行的指令,usr/bin主要放置软件提供的指令。/bin放置的是一般用户使用的指令,/sbin主要是系统管理员使用的指令,不过/bin和/sbin都与开机,单人模式有关。
要想复制别人的文件,必须要有读权限。
当没有加任何选项时,CP复制的是源文件而不是链接文件。复制时,一般用户的身份并不能修改档案的拥有者和群组,因此与拥有者和群组相关的,一般用户无法进行的操作,在复制时即便加上 cp --a 也无法进行拥有者和群组的修改。
档案时间:
Mtime:当档案的内容数据变更时,就会更改此时间。内容数据指的是档案的内容,而不是档案的权限或者属性。
Ctime:当档案的状态变更时,就会更改此时间,就像属性或者权限变更时,就会更改这个时间。
Atime:当档案的内容被取用,也就是档案内容被调入到内存时,会更改这个时间参数。举例来说,就是当使用CAT指令去查看某档案的内容时,该档案的access time(atime)就会改变。指令之间可以使用分号隔离,表示批量执行指令。
SUID权限:
Suid仅对二进制程序有效;
执行者对于该档案具有可执行的权限;
该权限仅在程序的执行过程中有效;
执行者在程序执行过程中具有该程序拥有者的权限。
例如:
1.vbird对于usr/bin/passwd这个程序具有X权限,表示vbird能执行passwd;
2.Passwd程序的拥有者是root帐号
3.Vbird在执行passwd过程中,暂时获得了root的权限
4./etc/shadow就可以被vbird所执行的passwd程序修改
增加和查看档案特殊属性的指令:chattr , lsattr
SGID:
当s标志在档案拥有者的x项目为SUID,那s出现在群组的X项时为SGID,
与SUID不同的是,SGID可以针对档案或者目录来设定,如果是对档案来说,SGID有如下的功能:
1.SGID对二进制程序有用;
2.程序执行者对于改程序来说,需具备x的权限;
3.执行者在执行的过程中将会获得该程序群组的支持;
除了二进制程序之外,SGID也能用在目录上,这也是非常常见的一种用途,目录设定了SGID权限后,他将具有如下的功能。
用户若是对此目录具有读和写的权限,该用户能进入此目录;
用户在此目录下的群组将会变成此目录的有效群组;
用途:若是用户在此目录下具有写的权限,则使用者所建立的新档案,该新档案的群组与该目录的群组相同。
SBIT:了解
增删档案或者目录的SUID,SGID,SBIT的属性:chmod 4 2 1
观察文件类型:file
WHICH:查找指令的指令:
Which指令根据PATH的设定顺序来搜寻指令所在的位置,用户不同,PATH变量不同,搜寻的结果也不相同。
Whereis,locate,find
Whereis和locate是通过数据库来搜寻数据,并没有实际搜寻硬盘,省时间。Find是通过搜寻硬盘来达到目的,肯定能找到,但是比较费时间。
因为linux系统会将系统内所有档案名称都记录在一个数据库中,使用whereis或者locate都是查询这个数据库,数据库的建立一般是每天更新,所有会有延迟,使用updatedb命令能更新数据库。
增加组:groupadd 增加用户:useradd
文件系统:
每个inode和block都有各自的编号。
Superblock:记录此filesystem的整体信息,包括inode/block的总体量,使用量,剩余量以及系统的格式等相关的信息;
Inode:记录档案的属性,同时记录此档案的数据所在的block的号码;
Block:实际存放档案的数据,若是档案数据太大,则会存放在多个block中。
在整体规划中,文件系统最前端有一个引导扇区,这个引导扇区可以安装开机管理程序。这是个非常重要的设计,如此一来我们可以将不同的开机管理程序安装到不同的文件系统的最前端而不用覆盖整颗硬盘唯一的MBR,这样就可以安装多个操作系统了。
Inode记录的数据
1.该档案的存取模式(rwx)
2.该档案的拥有者和群组
3.该档案的容量
4.该档案建立或者状态改变的时间(ctime)
5.最近一次的读取时间(atime)
6.最近修改的时间(mtime)
7.该档案内容的存储区块
8.该档案的特性标志(suid,sgid,sbit)
Superblock:
Superblock是记录整个filesystem相关的,没有superblock,就没有这个文件系统。他记录的主要信息有:
1.Inode和block的总量和未使用的数量
2.Block和inode的大小(block为1,2,4k,inode为128字节)
3.Filesystem的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间等文件系统的相关信息
4.一个valid bit数值,若是文件系统已经被挂载,则valid bit为0,否则为1。
此外,每个blockgroup都可能含有superblock,但是我们也说一个文件系统仅有一个superblock。事实上除了第一个block group内会含有superblock之外,后续的block group不一定含有superblock,而若是含有superblock也主要是为第一个superblock备份,用作救援。
Block bitmap(区块对照表)
当新增档案需要分配Block时使用,同样要删除某些档案时,原本这些档案占用的block号码就需要释放出来
Inode bitmap(inode对照表)
功能和blockbitmap相同
每个区段和superblock的信息都可以使用dumpe2fs指令来查询。df指令可以叫出目前挂载的装置。
目录:
在linux系统下,每个档案都会占用一个inode(不管是目录档案还是一般档案),且可以根据档案内容的大小来分配多个block给档案使用。目录的内容是在记录文件名,一般档案的实际内容是记录数据内容的地方。
当我们在linux系统下的ext2文件系统下建立一个目录时,ext2会分配一个inode与至少一块block给目录。其中inode记录该目录的相关权限和属性,并可记录分配到的那块block号码;而block则是记录在这个目录下的文件名与该文件名所对应的文件占用的inode号码。
目录的inode本身并不记录文件名,文件名的记录在block当中,因此才会提到新增/删除/更改文件名与目录的w权限相关。
由于目录树是从根目录开始读起,因此系统透过挂载的信息可以找到挂载点的inode号码,此时就能够读到根目录的inode内容,并依据该inode读取根目录的block内的文件名数据,再一层一层的往下读到正确的档案名。
新增档案文件系统的行为:
1.先确定用户对于欲新增的目录是否具有w和x的权限,若是有的话才能新增。
2.根据inode bitmap找到没有使用的inode号码,并将新档案的权限/属性写入。
3.根据block bitmap找到没有使用中的block号码,并将实际的数据写入block中,且更新inode的block指向数据。
4.将刚刚写入的inode与block数据同步更新inode bitmap与block bitmap,并跟新superblock的内容。
Linux支持的文件系统
传统的文件系统:ext2/minix/MS_DOS/FAT(用vfat模块)/iso9660(光盘)等
日志式文件系统:ext3/ReiserFS/windowsNTFS/IBM JFS/SGI XFS
网络文件系统:NFS/SMBFS
Linux VFS(Virtual Filesystem Switch)
Linux的系统都是透过VFS的核心功能去读取filesystem的,也就是说,整个linux认识的filesystem其实都是VFS在进行管理,我们使用者并不知道partition上头的filesystem是什么,VFS会主动的帮助我们做好读取的工作。
假设你的/使用的是/dev/hda1,用ext3,而/home使用的是/dev/hda2,用reiserfs,VFS帮助我们省去了自行设定读取文件系统的定义。
Df:列出文件系统的整体磁盘使用量
Df不含任何参数时默认将系统内的所有文件系统名字都列出来(不含内存内的特殊文件系统),加参数-a时将内存内的文件系统都列出来。由于df主要读取的数据几乎都是针对一整个文件系统的,因此读取的范围主要是在superblock内的信息,所以这个指令的速度非常快。另外,如果使用-a这个参数时,系统会出现/proc这个挂载点,但是里面的东西都是0。/prco的东西都是linux系统所需要加载的系统数据,而且是挂载在内存中的,所以没有加载任何的硬盘空间。
Du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
查看某一目录下各个文件占用的磁盘空间
硬连接和符号连接:(ln命令)
在linux系统下的连接档有两种,一种是类似Windows的快捷方式功能的档案,可以让你快速的链接到目标档案或目录;另一种是透过文件系统的inode连接来产生新档案名称,而不是产生新档案,这种称为实体连接。
一般来说,使用硬连接设定链接文件时,磁盘的空间和inode的数量都是不会改变的,因为硬连接只是在某个目录下的block中多写入一个关联数据而已,既不会增加inode的数量也不会消耗block的数量。事实上,hard link只能在单一文件系统中进行,不能够跨文件系统,也不能连接到目录。
符号连接就是在建立一个独立的档案,而这个档案会让数据的读取指向他连接的那个档案的档名,由于只是利用档案来作为指向的动作,当来源档案被删除之后,符号连接的档案就会开不了。
硬连接比较安全,因为即使某一个目录下的关联数据被杀掉(也就是目录所指向的block中有关该文件的项被删掉了),也没有关系,只要有任何一个目录下存在着有关数据,那么该档案就不会不见。
格式化指令:mkfs mke2fs
检查文件系统是否有错误:fsck
检查是否损坏:badblocks
系统挂载注意事项:
单一文件系统不应该被重复挂载在不同的挂载点目录中;
但一目录不应该重复挂载多个文件系统;
要作为挂载点的目录,理论上应该都是空目录。
Mknod:
在linux底下所有的装置都是通过档案来代表的,就是透过档案的major和minor的数值来替代的。
E2label:改变装置的名称
Tune2fs
使用实体分割槽建置swap
1.分割:先使用fdisk在磁盘中分隔出一个分割槽给系统作为swap。由于linux的fdisk预设会将分割槽的id设定为linux的文件系统,所以还要设定下system ID。
2.格式化:利用swap格式的mkswap装置文件名,就能格式化该分割槽成为swap格式了。
3.使用:最后将swap装置启动,swapon命令
4.观察:使用free这个指令观察内存的使用量
5.在更改完分区后,需要使用partprobe指令让核心更新partition table
Superblock和boot sector:
Superblock的大小为1024bytes;
Superblock的前面需要保留1024bytes下来,以让开机管理程序安装
如果block大于1024的话,那么superblock将会在0号,superblock其实就只有1024bytes,为了不浪费空间,第一个block中就含有boot sector和superblock两者。0-1023字节保留给boot sector使用。
磁盘的使用必须要经过:分割,格式化和挂载,惯用的指令为:fdisk,mkfs,mount三个指令。
情境模拟题:
由于我的系统原本分割的不好,我希望能够独立一个filesystem附挂在/srv/myproject目录下。并且能让这个filesystem每次开机都能够自动的挂载到该目录下面,且该目录是给project这个群组共享的,其他人不具有任何权限,且该filesystem具有5GB的容量。
1.首先,我们必须要使用fdisk来建立新的分区
2.为避免重新启动,因此使用partbrobe强制核心更新分割表
3.建立分区后,进行格式化动作 mkfs
4.建立挂载点 mkdir /srv/myproject
5.编写自动挂载的配置文件 nano /etc/fstab,在这个档案底下新增一行
6.测试自动挂载 mount -a
7.设定最后的权限
Mkisofs cdrecord
寻找刻录机:cdrecord -scanbus dev=ATA
Dd指令
Tar可以用来备份关键数据,而dd则可以用来备份整颗partion或整颗disk。使用dd指令,新分割出来的partion不需要进行格式化,因为dd可以将原本旧的partition上面,将sector表面的数据复制过来。连同superblock,boot sector,meta data等等全部也会复制过来。若是想要建两颗完全相同的磁盘,就可以使用这个指令。
Cpio指令可以备份任何的档案
开机管理程序grub(linux操作系统之奥秘)
Stage1这一步是grub中不可或缺的,主要负责bios交接给grub时,载入存在于各分区中的开机文件,也就是所谓的开机管理程序,/boot/grub/stage1文件就是MBR中bootloder的备份文件,或者说是管理程序的备份文件。
stage1.5 文件,如 e2fs_stage1_5、fat_stage1_5、jfs_stage1_5 和reiserfs_stage1_5,这些都属于 stage 1.5 阶段功能的文件,其作用就像是连接 stage1 到 stage2 的一个信道,里面唯一存放着的是该系统文件的格式。
Stage2这个文件是 GRUB 的核心程序,能让用户以选项方式将操作系统加载、新增参数、修改选项,这些全都是 stage2 的功能。对 GRUB 来说,stage2 除了不能自己激活外,剩下的事情全被 stage2 包了。stage2 文件存放在各分区的 Bootsector 中,主要的功能如下:
1.提供选项。
2.访问设置文件。
3.连接下一个 boot sector。
既然stage2是专门负责开机选项和kernel的位置的部分,假设有多个操作系统时(每个操作系统都需要支持多重开机),其他的操作系统在该分区是不需要有这三个stage中的任何一个的。因为只要有一个主要开机用的操作系统所含的stage1,加上协助加载kernel的stage2,就可以知道所有操作系统的kernel存放的位置,以便让多重开机管理系统,加载目前已经安装在各个分区中的操作系统。
Shell模式下的grub:
A:将系统分区指向第一块硬盘的第三个分区(对应方式请参考第 2.2 节“GRUB 的设置方
式”)。
B:准备安装 GRUB 至MBR。
C:将 stage1 部分资料安装至 MBR 的 bootloader 空间。
D:将stage1.5 的文件(在这里为 e2fs_stage1_5)写入MBR 后的 15 个扇区,扇区数目会因文件系统格式的不同而有差异,因为所对应的 stage1.5 的文件不同。扇区数目的算法如下:范例中的 e2fs_stage1_5 文件大小为7 616 Byte,每 512 Byte 为一个扇区,因此,需要 7 616 / 512=14.875 个扇区,但文件系统中的扇区是以区块方式分发的,不能零散地使用,因此,要用到 15个扇区。
E:告知 bootloader,当需要加载 stage2 时,其位置在第一块硬盘的第三个 partition 的
/boot/grub 目录下。
F:将 grub.conf 设置文件的位置直接告知stage2。
GRUB 与开机顺序的关系
① BIOS 将控制权交给硬盘的主引导区,MBR。
② MBR 中的 bootloader 通过内置的地址加载stage1.5。
③ bootloader 通过 stage1.5 内容,将分区中的stage2 加载。
④ stage2 此时就可以在文件系统中将 grub.conf 设置文件加载,让用户看到选项画面。
这就是 GRUB 让用户看到开机选项画面,并将操作系统加载的方式,接下来看 GRUB 的设置,以决定开机的方式。
开机选项:
开机选项代表每一个操作系统的设置值,其中每个操作系统的区域各有不同的设置,主要分成 4 个部分:
1.title
操作系统的名称,可以自行设置。
2.root
定义该操作系统所使用的 kernel 及 initrd 文件是存放在哪一块硬盘中的,在这里要用 hd(x,x)的格式注明,所以 hd(0,0)代表的是第一块硬盘的第一个分区。请记住,Linux 下很多的编号都是从 0 开始的,如果设错,便无法加载 kernel。
3.kernel
加载 kernel 的位置,当 kernel 被成功加载后,会再检查后方紧接着的 root 参数是哪一个分区,将该分区mount(Linux 下将设备链接到目录的指令)设置为“/”。 所以,虽然 hd(0,0)与/dev/sda1 是指到同样一个分区,但选项中的第一行 hd(0,0)是提供给 stage2 加载 kernel 用的;kernel 中的 root 参数则是提供加载kernel 后,使其找到“/”分区,所以其实际的意义不同,且不能省略。在 kernel 参数的最后可以加上开机时要先行加载的核心参数,比如 singlemode 或其他的参数
在程序执行过程中,使用ctrl+z的组合键可以让该程序后台执行。
Vim使用手册
中文编码的问题:
中文编码有big5和utf8两种,如果你的档案是使用big5制作的,但是vim的终端接口中你使用的是万国码(utf8),由于编码的不通,你得中文档案可能是乱码。这需要考虑很多问题:
1.你的linux系统默认支持的语系数据:这个与/etc/sysconfig/i18n有关
2.你的终端界面bash的语系:这个和LANG这个变量有关
3.你的档案原来的编码
4.开启终端的软件,例如在grome底下的窗口接口。
事实上最重要的是上头的第三点和第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的档案,否则将会看到一堆乱码。
DOS和Linux换行符的不同:
Windows下的换行符为回车和换行,Linux下的换行符就是回车。在linux底下的指令在开始执行时,他的判断依据是Enter,而linux下的Enter为回车,而Windows下的换行键是回车换行。这样的情况下,如果是一个shell scripts的程序档案,可能会造成程序无法执行的状态,因为他会误判程序所下达的指令内容。
Linux和Windows下格式转换(其实就是转换回车键)
dos2unix指令和unix2dos指令
语系编码转换:
举例来说,想要将big5转换成utf8。使用iconv这个指令即可。这个指令支持的语系非常多,除了中文的big5和utf8编码之外,也可以支持简体中文的国标2312.
Shell
为什么我妈系统上合法的shell要写入/etc/shells这个档案?这是因为系统某些服务在运作过程中,回去检查使用者能够使用的shell,而这些shell的查询是借由/etc/shells这个档案来实现的。
举例来说,某些FTP网站回去检查使用者的可用的shell,而如果你不想要让这些用户使用FTP以外的主机资源时,可能会给予使用者一些怪怪的shell,让使用者无法以其他服务登录主机。举例来说,CentOS 5,X的/etc/shells里头就有个/sbin/nologin档案的存在,这个就是我们说的怪怪的shell。
命令别名设定功能:alias
使用type指令可以知道每个指令是否是bash的内建指令。它是linux系统的一种自省机制,知道了是哪种类型,我们就可以针对性的获取帮助。比如内建命令可以用help命令来获取帮助,外部命令可以用man或者info来获取帮助。type命令的基本使用方式就是直接跟上命令名字。type -a可以显示所有可能的类型,比如有些命令如pwd是shell内建命令,也可以是外部命令。type -p只返回外部命令的信息,相当于which命令。type -f只返回shell函数的信息。type -t 只返回指定类型的信息。
Tpye也可以用来作为类似which指令的用途,是用来找指令的。
变量的设定规则:
1.变量与变量名以一个等号来连接,中间不能加空格
2.变量名称只能是英文字母与数字,但是开头不能是数字
3.变量内容若是有空格符可使用双引号或者单引号将变量内容结合起来
双引号内的特殊字符如$等,可以保持原本的特性,如下所示:
Var="lang is $LANG",则echo $Var可得lang is en_US
单引号内的特殊字符则仅为一般字符,如下所示:
Var='lang is $LANG',则echo $var可得lang is $LANG
4.可用逃脱字符将特殊字符变成一般字符
5.在一串指令中,还需要借由其他的指令提供的信息,可以用反单引号或者$(指令)。
例如想要取得核心版本的设定:
Version=$(uname -r),再echo $version
6.若变量是为了扩增变量内容时,则可以使用“$变量名称”累加内容,如下所示:
PATH="$PATH":/home/bin
7.若是该变量需要在其他子程序中执行,则需要以export来使变量变成环境变量
如export PATH
8.取消变量的方法为使用unset:例如unsetmyname
子程序
在我目前这个shell的情况下,去启动另外一个新的shell,新的那个shell就是子程序。在一般的状态下,父程序的自定义变量是无法在子程序中使用的,但是透过export将变量变成环境变量之后,就能在子程序中使用了。
反单引号:`
在一串指令中,在`之内的指令将先被执行,而其执行出来的结果将作为外部的输入信息。举个例子:我们知道,locate指令可以列出所有的相关档案档名,但是如果我想知道各个档案的权限呢?举例来说,我想知道每个crontab相关档案的权限:
可以使用ls -l`locate crontab`
环境变量的功能:
环境变量可以帮助我们达到很多的功能,包括家目录的变换,提示字符的显示,执行文件搜索的路径等等。
用env观察环境变量和常见环境变量说明
env是environment的简写,是列出所有的环境变量
$:(关于本shell的PID)
钱字号本身也是个变量,代表的是目前这个shell的线程代号,亦即是所谓的PID。想要知道我们的shell的PID,就可以用echo $$即可,出现的数字就是你得PID号码。
?:(关于上一个执行指令的回传值)
指令执行完后,都会回传一个执行后的代码。如果成功执行的话,则会回传一个零值,如果执行过程发生错误,就会回传错误代码才对,一般就是以非零值来取代。
OSTYPE,HOSTTYPE,MACHTYPE
需要注意的是,较高阶的硬件通常会向下兼容旧有的软件(因为旧有软件需要的指令新硬件都能够提供),但是低阶级的硬件不能安装高阶级的软件,因为低阶级的硬件无法提供高阶级的指令系统。
env和set的区别
两者的差异就是该变量是否会被子程序所继续引用。
当你登录linux并取得一个bash之后,你的bash就是一个独立的程序,被称为PID的就是,接下来你在这个bash底下所下达的任何指令都是这个bash所衍生出来的,那些被下达的指令都是被成为子程序了。我们原本的bash底下执行另一个bash,结果操作的环境接口会跑到第二个bash去,就是子程序,原本的bash就睡着了。子程序只会继承父程序的环境变量,而不会继承父程序的自定义变量。
Export指令
该指令可以让自定义变量变成环境变量。这个指令用在分享自己的变量设定给后来呼叫的档案或者其他程序
将环境变量转换为自定义变量declare
locale指令
查看我们的linux到底支持多少的语系,可以由locale指令查询。
为什么环境变量的数据可以被子程序所引用呢?这是因为内存配置的关系,理论上是这样的:
当启动一个shell,操作系统会分配一个记忆区块给shell使用,此内存内的变量可以让子程序取用,当父程序使用export功能,可以让自定义变量的内容写到上述的记忆区块中(环境变量),当加载另一个shell时(也就是启动了子程序,而离开了原本的父程序),子shell可以将父shell的环境变量所在的记忆区块导入自己的环境变量区块中。
Read array declare
Declare和typeset是一样的功能,都是宣告变量的类型
Unset使声明的变量变成无效的
Bash对于变量有几个基本的定义:
变量类型默认为字符串,所以若是不指定变量类型,则1+2是一个字符串而不是计算式
Bash环境中的数值运算,预设最多仅能到达整数状态,所以1/3结果是0
命令别名:alias unalias
命令的使用历史history
有些人在练习linux的时候喜欢同时开好几个bash窗口,这些bash的身份都是root,这样会有~/.bash_history的写入问题。这些bash同时都是以root的身份登入,因此所有的bash都有自己的1000笔记录在内存中,因为等到注销时才会更新记录文件,所以最后注销的那个bash才会是最后写入的数据。如此以来,其他bash的指令操作就不会被记录下来了(其实是被记录下来的,只是后来的最后一个bash把前面的给覆盖更新了)
路径和指令访问顺序:
指令运作的顺序可以这样看:
1.以相对/绝对路径来执行指令
2.由alias找到该指令来执行
3.由bash内建的指令来执行
4.透过$PATH这个变量的顺序搜寻到的第一个指令来执行
Bash的进站和欢迎信息 /etc/issue ,/etc/motd
终端机接口登录的时候会有这部分信息
指令回传值:$? && 和 ||
管线命令:
管线命令仅能处理前面一个指令传来的正确信息,也就是标准输出的信息,对于标准错误的输出并没有直接处理的能力。在每个管线后面的第一个指令必须是指令,而且这个指令必须能够接受标准输入的数据才行。例如less,more,head,tail等都是可以接受标准输入的管线命令。至于ls,cp,mv等就不是管线命令了,因为ls,cp,mv并不会接受来自标准输入的数据。
管线命令仅仅会处理标准输出,对于标准错误输出会忽略
管线命令必须能够接受来自前一个指令的数据成为标准输入继续执行才行。
截取命令: cut grep
就是将一段数据经过分析后,取得我们想要的数据
Cut的主要用途在于将同一行里面的数据进行分解,通常使用在分析一些数据或者是文字数据的时候。
Cut是将一行讯息中,取出我们想要的,而grep则是分析一行讯息,若是当中有我们想要的信息,就将该行拿出来,简单的语法就是这样的:
排序指令:sort wcuniq
双向重导向 tee
Tee会同时将数据流送到档案和屏幕中去。
字符转换命令:tr coljoin paste expand
Tr可以用来删除一段讯息中的文字,或者进行文字讯息的转换
参数代换:xargs
大于号是标准输出 小于号是标准输入(大小对出入)
关于减号 -的用途:
管线命令在bash的连续处理程序中是非常重要的。另外,在log file的分析中也是非常重要的。另外,在管线命令中,常常会使用到前一个指令的stdout作为这次的stdin,某些指令需要用到文件名(例如tar)来进行处理时,该stdin与stdout可以利用减号来替代
SHELL
由于核心在内存中是受保护的区块,因此我们需要透过shell将我们输入的指令和kernel沟通,好让kernel可以控制硬件来正确无误的工作
正规表示法:用在字符串的处理上面的一项表达式,正规表示法并不是一个工具程序,而是一个字符串处理的标准依据,即处理字符串的方法。如果想要以正规表示法的方式处理字符串,就得要使用正规表示法的工具程序才行,这类的工具程序很多,例如vim,sed等等。
正规表示法基本上就是一种表示法,只要工具程序支持这种表示法,那么该工具程序就可以作为正规表示法的字符串处理之用。例如vi,grep,awk,sed等等工具,因为他们支持正规表示法,所以这些工具就可以使用正规表示法的特殊字符来进行字符串的处理,但是例如cp,ls等指令并未支持正规表示法,所以就只能使用bash自己本身的通配符而已。
开机过程的相关程序都是在/etc/init.d/目录下
Dmesg列出核心信息
Sed后面接的动作,必须以两个单引号括住
档案比对工具 diffcmp
同一个软件包的不同版本之间,比较配置文件和原始档案的差距。
Patch:
Patch这个指令和diff有密不可分的关系。Diff可以用来分辨两个版本之间的差异。但是如果要升级呢?就是将旧的档案升级为新的档案,此时需要先比较新旧版本的差异,并将差异制作成补丁档案,再由补丁更新就档案。
Linux系统的服务启动的接口在/etc/init.d这个目录下,目录下的所有档案都是script,另外,包括开机的过程都是利用shell script来帮忙搜索系统的相关设定数据,然后再代入各个服务的设定参数的。举例来说,如果我们想要重新启动系统的注册表,我们可以使用:/etc/init.d/syslogd restart,那个syslogd就是script。
Script的撰写和执行
1.指令的执行是从上到下,从左到右的分析和执行
2.指令、选项和参数间的多个空白都会被忽略
3.空白行会被忽略,并且tab键所推开的空白同样被视为空格键
4.如果读到enter键,就尝试开始执行该串命令
5.如果一行的命令太多,就可以使用\键来延伸到下一行
6.#键可以作为批注,任何加在后面的资料都会被视为批注文字而被忽略
7.Script内所撰写的程序,都会被一行一行的执行
Shell script
指令取得的信息 $(command) 数值的运算$((计算式))
利用直接执行的方式来执行script,该script都会使用一个新的bash环境来执行脚本的指令,script是在子程序的bash内执行的。当子程序执行完之后,在子程序内的各项变量或者动作都会结束而不会传给父程序中。当使用直接执行的方法来处理script时,系统会给予一支新的bash让我们来执行script里面的指令
利用source来执行脚本,在父程序中执行
各种动作都会在原本的bash中生效。这也是为什么你不注销系统而要让某些写入~/.bashrc的设定生效时,需要source ~/.bashrc而不能使用bash ~/.bashrc是一样的道理
利用test指令的测试功能
1.关于某个档名的文件类型的判断
2.关于档案的权限侦测,如是否可读可写
3.两个档案之间的比较
4.关于两个整数之间的判定
5.判定字符串的数据
6.多重的判断条件与或非
[ ]中括号判定
在中括号中的每个组件都必须有空格键来分隔
在中括号中的变量最好都以双引号括起来
在中括号中的常数,最好都以单或双引号括起来
在bash中使用两个等号和一个等号的效果是一样的,两个等号是逻辑判断的意思,因此最好使用在做判断的是时候使用两个等号。
Shift:偏移指令
Shift后面可以接数字,代表拿掉最前面的几个参数的意思
单层、简单条件判断式:
If[ ] then
[]与[]之间可以用&&或者||来连接
Netstat指令:
这个指令可以查询到目前主机有开启的网络服务端口号 netstat-tuln
利用function功能
循环(while do done | until dodone)
Shell script的追踪和debug
sh -nvx script.sh 只检查是否有语法错误,但是并不执行script
用户和群组的关系图
Usermod 修改用户帐号的各项设定
Newgroup:有效群组的切换 限制:想要切换的群组必须是已经有支持的群组
私有群组机制和公共群组机制。SHELL:/bin/bash。系统默认的shell就写在这里,假如你得系统为mail server,你希望每个帐号都只能使用mail的收发信件的功能,而不许用户登录系统取得shell,那么可以将这里设定为/sbin/nologin,如此一来,新建的使用者预设就无法登入。
修改密码的各个字段的参数:chage
其实就是修改shadow各栏信息
Usermod指令:可以修改/etc/passwd或/etc/shadow去修改相应字段的数据
/etc/skel是用户家目录的蓝本
删除用户的相关信息:userdel
用户帐号/密码相关参数:/etc/passwd ,/etc/shadow
使用者群组相关参数:/etc/group,/etc/gshadow
用户个人相关参数:/home/username/var/spool/mail/username
使用userdel的前提是你真的确定不要让该用户在主机上使用任何数据了。使用find指令可以找到所有属于某个帐号的数据:find / -userusername
Useradd/usermod/userdel都是系统管理员使用的指令,一般用户无法使用
一般用户可以使用的有关帐号和密码操作的指令:
1.finger
列出的都是shadow当中的参数信息
找出目前在系统上面登入的用户和登入时间 finger
2.chfn changerfinger的缩写
改变finger的信息
3.chsh changeshell的缩写
-l 列出目前系统上面可用的shell,其实也就是/etc/shell的内容
-s 设定修改自己的shell
不论是chfn还是chsh,都是能够让一般用户修改/etc/passwd这个系统文件的,所以这连个档案的权限一定是SUID。
新增和移除群组:
群组的增删和修改都是/etc/group,/etc/gshadow的新增,修改和删除。
Groupadd:新增群组
Groupmod:与usermod类似,这个指令仅仅是进行group相关参数的修改
Groupdel:删除群组。当某个用户的初试群组设置为该群组时,无法删除该群租
Gpasswd:群组管理员功能
主机的系部权限规则:ACL的使用
ACL的主要目的是在提供传统的owner,group,others的read,write,execute权限之外的细部权限设定。ACL可以针对某一个单一使用者,单一档案或者目录来进行读写执行的权限规范,对于需要特殊权限的使用状况非常有帮助。
ACL主要针对下列项目:
使用者:可以针对使用者来设定权限
群组:针对群组为对象来设定权限
默认属性:还可以针对在该目录下在建立新档案/目录时,规范新数据的默认权限
由于acl是传统的unix-like操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行,目前绝大多数的文件系统都支持ACL的功能。CentOS预设使用ext3是启动ACL支持的。
/etc/fstab是文件系统配置文件,可以更改其设置,来使文件系统默认启动对ACL的支持。
ACL的设定技巧:getfacl setfacl
Getfacl:取得某个档案或者目录的ACL
Setfacl:设定某个档案或者目录的ACL
Setfacl
1.针对特定用户的方式 p505
2.针对特定群组的方式
3.针对有效权限mask的设定方式
如果一个档案设定了ACL参数后,它的权限部分就会多出一个+号,但是此时你看到的权限与实际权限会有误差,这时必须使用getfacl命令来观察它的权限设定。
Mask的意义:(有效权限)
使用者或者群组所设定的权限必须要存在与mask的设定范围内才会有效,因此称为有效的权限。我们可以使用mask来规范最大使用的权限,就能够避免不小心开放了某些权限给其他使用者或者群组了。如果想要ACL在目录底下的数据都有继承的功能,那就需要这样做。
也就是:
4.针对预设权限的设定方式
设定规范:d[ug]:使用者列表:[rwx]
单纯使用su切换成为root的身份,读取的变量设定方式为non-login-shell的方式,这种方式原本的变量不会被改变,由于没有改变属于root的环境,因此很多root惯用的指令就只能使用绝对路径来执行,其他的还有mail这个变量,当使用mail指令时,收到的邮件还是其他用户的,而不是root本身的邮件。
Sudo p511
相对于su需要了解新切换的用户密码(常常是root的密码),sudo的执行则仅仅需要自己的密码即可。甚至可以设定不需要密码就可以执行sudo。由于sudo可以让你以其他用户的身份执行指令(通常是使用root的身份来执行指令),因此并非所有人都能执行sudo,而是仅有规范到/etc/sudoers内的用户才能够执行sudo这个指令。
Sudo -b 将后续的指令放到背景中让系统自行执行,而不与目前的shell产生影响
Sudo -u 后面可以接欲切换的使用者,若是无此项目则代表切换身份是root
Shell -c “一连串指令” ---使用该方法来执行一连串的指令
我们无法使用su -sshd去切换系统账号(因为系统帐号的shell是sbin/nologin),这个时候sudo真是很好用。Sudo是以某个新用户的权限执行某个动作,但并不是要有新的bash环境
Sudo的执行流程
1.当用户执行sudo时,系统于/etc/sudoers档案中搜寻该使用者是否有执行sudo的权限
2.若是使用者可执行sudo的权限后,可以让使用者输入用户自己的密码进行确认
3.若是密码输入成功,便开始进行sudo后续接的指令(但是root执行sudo时,不需要输入密码)
4.若欲切换的身份和执行者的身份相同,那么也不需要输入密码
能否使用sudo要看/etc/sudoers的设定值,而可使用sudo者是透过输入用户自己的密码来执行后续的指令。不过该档案的内容是有一定的规范的,因此直接使用vi去编辑是不好的,可以使用visudo去修改这个档案。
无法登录:nologin
无法登录指的是这个使用者无法使用bash或其他shell来登入系统,并不是说这个帐号无法使用其他的系统资源。举例来说,打印作业由lp这个帐号在管理,www服务由apache这个帐号在管理,他们都能进行系统程序的工作,但是就是无法登录主机而已。
PAM模块设定语法
PAM借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求,我们以passwd这个指令的呼叫PAM来说明,当你执行passwd后,这支程序呼叫PAM的流程是:
1.用户开始执行/usr/bin/passwd这个程序,并输入密码;
2.Passwd呼叫PAM模块进行验证
3.PAM模块回到/etc/pam.d/passwd寻找与passwd同名的配置文件
4.依据/etc/pam.d/passwd内的设定,引用相关的PAM模块逐步进行验证分析
5.将验证结果回传给passwd这个程序
6.Passwd程序会根据PAM回传的结果来决定下一个动作(重新输入新密码或者通过验证)
(1)我们总是得先验证身份(auth)后 (2)系统才能够借由用户的身份给予适当的授权和权限设定,而且登录和注销的环境才需要设定,也才需要记录登入和注销的信息(session)。如果在运行期间需要密码修订时,才给与password的类别。
/etc/security会影响到root可登入的安全终端机,/etc/nologin会影响到一般使用者能否登入的功能之外,PAM相关的配置文件在/etc/pam.d,说明文件在/usr/share/doc/pam-版本,实际模块在/lib/security/。相关的PAM主要在/etc/security这个目录内
/etc/security/limits.conf
使用ulimits指令限制用户的操作将在这个文件内记录,这个档案的设定完成就生效了,你不用重新启动服务的。但是PAM有个特殊的地方,由于他是在程序呼叫时才予以设定的,因此你修改完成的数据,对于已经登入系统中的用户是没有效果的,要等他再次登录时才能生效。
查询使用者:w,who,last,lastlog
如果想要知道目前已登录到系统上面的用户使用w或者who来查询
如果想要知道帐号的最近登入时间,可以使用lastlog这个指令。Lastlog会去读取/var/log/lastlog档案,并将结果输出
使用者对谈:write,mesg,wall
Write是写给某个用户的,wall是写给所有在线的用户的
使用者邮件信箱:mail
使用wall,write指令要等到使用者在线才能够进行,但是在linux主机上面的用户都会具有一个mailbox,一般来说,mailbox都会放在/var/spool/mail里面,一个帐号一个mailbox。可以直接使用mail指令向该mailbox中投递信件。
例如:mail vbird1-s "nice to meet you" >filename ,可以将filename中的数据重导向到nice to meet信件中。/home/vbird/mbox为收件夹的意思,var/spool/mail/vbird为新件夹。
密码转换:pwconv pwuconv
Pwck这个指令在检查/etc/passwd这个帐号配置文件内的信息,与实际的家目录是否存在等信息,还可以比对/etc/passwd /etc/shadow的信息是否一致,另外,如果/etc/passwd内的数据字段错误时,会提示使用者修订。
Pwconv:这个指令的主要目的是在将/etc/passwd内的帐号和密码,移动到/etc/shadow当中。
Pwunconv:将/etc/shadow内的密码栏数据写回/etc/passwd当中,并且删除/etc/shadow档案。
Chpasswd:它可以读入未加密前的密码,并且经过加密后,将加密后的密码写入到/etc/shadow当中。它可以由标准输入读入数据。
VFAT文件系统不支持Linux Quota功能
Mount 可以用来查询文件系统的类型
手动开启文件系统quota功能
Mount -o remount,usrquota,grpquota /home
当你重新挂载时,系统会同步更新/etc/mtab这个档案,所以你必须要确定/etc/mtab已经加入usrquota,grpquota的支持到你所要想设定的文件系统中。不过手动挂载的数据在下次重新挂载的时候就会消失,因此最好写入配置文件中。可以修改/etc/fstab文件系统配置文件。
其实quota是透过分析整个文件系统中,每个使用者(群组)拥有的档案总数和总容量,再将这些数据记录在这个文件系统的最顶层目录,然后在该目录文件中再使用每个帐号(或群组)的限制值去规范磁盘的使用量的。所以,这个quota记录文件就非常重要
扫描文件系统并建立quota的记录文件:quotacheck指令
Quota启动,关闭与限制值设定
Quotaon 启动
系统的初始化脚本:/etc/rc.d/rc.sysinit
关闭quota的服务:quotaoff
Edquota:编辑帐号/群组的限值和宽限时间
Quota限制值的报表
针对文件系统的限额做报表:repquota
直接到/etc/mtab中搜寻具有quota标志的文件系统,并报告quota的结果。
Warnquota:对超过限额者发出警告信
/etc/warnquota.conf
Setquota:直接在指令中设定quota限额
不像edquota是呼叫vi来进行设定,setquota直接由指令输入所必需的各项设定值
Linux工作排程的种类:at,cron
两种工作排程的方式:
一种是例行性的,就是每隔一定的周期要办的事项
一种是突发性的,就是每次做完之后就没有的那一种
在linux下使用at和crontab这两个东西
At是个可以处理仅仅执行一次就结束排程的指令,不过要执行at时,必须要atd这个服务的支持,但是在某些distribution中,atd可能预设是没有启动的,centos预设是启动atd服务的
Crontab这个指令所设定的工作将循环的一直执行下去。Crontab除了可以使用指令执行外,还可以编辑/etc/crontab来支持。让crontab可以生效的服务则是crond这个服务。
Linux上的常见例行性工作
1.进行登录档的轮替(log rotate)
2.登录文件分析logwatch的任务
如果发生软件问题,硬件问题,资安问题等,绝大部分的错误信息都会被记录到登录文件中,因此系统管理员最重要的任务之一就是分析登录档。Centos 提供了一个程序logwatch来主动分析登录记录
3.建立locate的数据库 系统会主动的进行updatedb操作
4.Whatis数据库的建立 whatis是与man page有关的一个查询指令,但是要使用whatis指令时,必须先建立whatis数据库
5.RPM软件登录文件的建立 RPM是一种软件管理的机制。由于系统可能会常常变更软件,包括软件的新安装,非经常性更新,都会造成软件文件名的差异。为了方便未来追踪,系统也帮我们将文件名做个排序的记录。有时候系统也会透过排序过程来帮忙RPM数据库的重新建置。
6.移除暂存档系统通过tmpwatch指令来删除暂存档
7.与网络服务有关的分析行为
单一排程的运作:atd
Atd的启动和at运作的方式:/etc/init.d/atdrestart
Checkconfig atd on
At的运作方式:当我们使用at这个指令来产生所需要运作的工作,并将这个工作以文本的形式写入到/var/spoll/at/目录中,该目录便能等待atd这个服务的取用和执行了。
我们可以利用/etc/at.allow与/etc/at.deny这两个档案来进行at的使用限制
1.现寻找/etc/at.allow这个档案,写在这个档案中的使用者才能使用at,没有在这个档案中的使用者不能使用at(即使没有写在at.deny当中)
2.如果/etc/at.allow档案不存在,就寻找/etc/at.deny这个档案,若是写在这个at.deny的使用者则不能使用at,而没有在这个档案中的使用者可以使用at
3.如果两个档案都不存在,那么只有root可以使用at这个指令了
实际运作单一工作排程:P588
At -mldv TIME 执行at指令会进入at shell,让你下达多重指令进行等待动作,使用at下达指令时,最好使用绝对路径来下达相关的指令,比较不会出问题
At的执行和终端环境有关,而所有的standard output/standard input/standard error output都会传递到执行者的mailbox中去,所以在终端机中看不到任何信息。可以通过终端机的装置来处理。假如你是用tty1登录,则可以使用echo"hello">/dev/tty1来取代
系统会将at工作独立出你得bash环境,直接交给系统的atd程序来接管,所以当你下达了at的工作之后就立刻脱机了,剩下的工作就完全交给linux管理即可。所以,如果有长时间的网络工作时,使用at可以让你免除网络断线的困扰。
At错误指令的移除:atq(查询) atrm(移除)
Batch:系统有空时才进行背景任务
其实batch是利用at来进行指令的下达,只是加入一些控制参数而已,batch会在CPU工作负荷小于0.8的时候,才进行你所下达的任务。CPU的工作负荷表示CPU在单一时间点所负责的工作数量,也就是执行的线程或进程的数量。CPU的工作负载大,代表CPU必须在不同的工作之间进行频繁的工作切换。
Batch的指令下达和at完全相同,只是若那个时间点系统忙,则batch下达的指令不会被执行。
循环执行的例行性工作安排
相对于at仅执行一次的工作,循环执行的例行性工作排程则是由cron这个系统服务来控制的。Linux系统上面原本有很多例行性的工作,因此这个系统是默认启动的
使用者的设定 P591
/etc/cron.allow /etc/cron.deny两个文件来管理允许和拒绝的使用者。以优先级来说,/etc/cron.allow比/etc/cron.deny要优先,这两个档案只能选择一个来限制而已,因此只要保留一个。
当使用crontab这个指令来建立工作排程之后,该项工作会被记录到/var/spoll/cron/里面去,例如dmtsai使用crontab后,他的工作会被记录到/var/spool/cron/dmtsai里头去。Cron执行的每一项工作都会被记录到/var/log/cron这个登录档案中。
Crontab编辑各自段的含义 p591
系统的配置文件:/etc/crontab
这个crontab -e是针对使用者的cron来设计的,如果是系统的例行性任务,只要编辑/etc/crontab这个档案就可以了。有一点需要特别注意,那就是crontab -e这个crontab其实是/usr/bin/crontab这个执行档,但是/etc/crontab可是一个纯文本挡,可以使用root的身份编辑一下这个档案。
Cron这个服务的最低侦测限制是分钟,所以cron会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容,因此只要编辑完成/etc/crontab这个档案后,并且将他储存之后,那么cron的设定会自动的被用来执行了。
Anacron
Anacron并不是取代crontab,它的存在的目的就是在于处理非24小时一直启动的linux系统的crontab的执行。所以anacron并不是指定何时执行某项任务,而是以天为单位或者在开机后立刻执行
Anacron是一个程序而并不是一项服务,在crontab中会调用这个程序,是系统的例行性行为。
系统默认的例行性命令都放置在/etc/cron.*里面,所以可以查看/etc/cron.daily/,/etc/cron.weel/,/etc/cron.monthly/这三个目录中记载。
程序:
程序被执行后,执行者的权限和属性,程序的程序代码和所需要的数据都会被加载到内存,操作系统会给予这个内存内的单元一个标识符(PID),所以,进程就是在运行中的程序。
父程序和子程序:
当我们登入系统后,会取得一个bash的shell,然后,我们利用这个bash提供的接口再去只想能够另一个指令,例如/usr/bin/passwd或者是touch等等,那些另外执行的指令也会被触发成为PID。那个后来执行指令才产生的PID就是子程序了,而我们原来的bash环境,就称为是父程序了。连续执行两个bash后,第二个bash的父程序就是前一个bash,因为每个程序都有一个Parent PID(PPID)。
使用ps -l来查看系统中正在执行的程序
Fork and exec:过程调用的流程
1.系统先以fork的方式复制一个与父程序完全相同的暂存程序,这个程序和父程序唯一的差别就是PID不同,但是这个暂存程序会有一个PPID的参数,PPID如前所述,就是父程序的程序标识符
2.暂存程序开始以exec的方式加载实际要执行的程序,新的程序名称改变。
常驻在内存的程序通常都是负责一些系统所提供的功能以服务用户各项任务,因此这些常驻内存的程序就被我们称为是服务。系统服务非常多,但是大致上可以分为系统本身所需要的服务:crond,atd,还有syslog等等,还有一些负责网络联机的服务,例如apache,named,postfix,vsftpd等等。这些程序被执行后,他会启动一个可以负责忘了监听的端口号,以提供外部客户端的联机要求。Linux不会出现当机的时候,因为可以在任何时候,将某个被困住的程序杀掉,然后再重新执行该程序而不用重新启动。
Ps -aux,然后kill
Bash环境下的工作管理(job control)
当我们登入bash之后,就是取得一个名为bash的PID了,而在这个环境底下所执行的指令,就几乎都是所谓的子程序了。在这个单一的bash接口下,我是否可以进行多个工作,意思就是不产生新的bash,而是让程序交给系统,到后台去执行
/etc/security/limits.conf里面设定了使用者可以同时登入的联机数,某些使用者可能仅能以一个联机来工作。
放入背景的工作想要正常运转,他必须不和使用者进行互动,而且不能使用ctrl +c来进行终止。
进行bash的job control必须要注意的限制:
1.这些工作所触发的程序必须来自于你shell的子程序(管理自己的bash)
2.前景:你可以控制与下达指令的这个环境称为前景的工作
3.背景:可以自行运作的工作,你无法使用ctrl+c来终止,可以使用bg/dg呼叫该工作
4.背景中执行的程序不能等待terminal/shell的输入
如前所述,当我们想要在只有一个bash'的环境下进行多项工作,那么可以将某些工作直接丢到背景环境中去执行,也就是使用&
在背景中执行的指令,如果有stdout或者stderr时,他的数据依旧还是会输入到屏幕当中,我们会无法看到提示字符,也无法完全的掌握前景工作,最佳的情况就是利用数据流重导向,将要输出的数据传送到某个档案中。
将目前的工作丢到背景中去执行暂停:ctrl+z
观察目前的背景工作状态:jobs-lrs
+号代表预设的取用工作,也代表最近被放到背景的工作号码,-代表最后第二个被放到背景中的工作号码,如果仅输入fg时,那么+号任务将会被放到前景来处理。
将背景工作拿到前景来处理:fg
将工作在背景下的工作状态变成运作中:bg
Kill -signal %jobnumber signal是告诉程序该怎么做
要注意的是,我们在工作管理中提到的背景指的hi终端机模式下可以避免ctrl+c中断的一个环境,并不是放到系统的背景下去,所以,工作管理的背景依旧和终端机有关,在这种情况下,如果是以远程联机的方式连接到你的linux主机,并且将工作以&的方式放到背景中去,在工作尚未结束的情况下,万一脱机,该工作是不会继续的,而是被中断掉。在这种情况下,可以考虑at来处理。因为at是将工作放到系统背景,而与终端机无关。另外,如果不想使用at的话,可以尝试使用nohup这个指令来处理。这个nohup可以让你在脱机或者注销后,还可以继续进行。但是nohup并不支持bash内建的指令,因此你的指令必须要是外部指令才行。 P609
程序的观察
利用静态的ps或者是动态的top,还能以pstree来查阅程序树之间的关系。一个可以查询自己bash程序的ps -l,一个则是可以查询所有系统运作的程序ps -aux。使用ps -l仅列出与你的操作环境bash相关策程序而已,亦即最上层的父程序只会是你得bash而没有延伸到init这只程序去
程序的状态:
R:该程序正在运作中
S(SLEEP):该程序正在睡眠状态,但可以被唤醒(signal)
D:不可被唤醒的睡眠状态,通常这支程序可能在等待I/O的情况(例如正在打印)
T:停止状态(stop),可能是工作控制(背景暂停)或出错状态
Z(Zombie):僵尸状态,程序已经终止但是却无法从内存中移除。
TTY:登入者的终端机的位置,若为远程登录则使用动态终端接口(pts/n)
观察系统所有程序的状态:ps-aux
僵尸程序的成因是该程序已经执行完毕或者因故应该要终止了,但是该程序的父程序却无法将该程序结束掉,而造成那个程序一直存在在内存当中。
事实上,僵尸程序已经无法管控,而直接是交给init这支程序来负责的,但是init程序使系统的第一支执行的程序,他是所有程序的父程序,我们无法杀掉init程序,所以很多时候我们只能使用reboot的方式来将僵尸程序抹去。
Ps是截取一个时间点的程序状态,但是使用top指令可以动态的观察程序的状态
Kill -signal PID
如果要确认有没有重新启动过syslog,可以参考登录档的内容,使用下面指令查看就行
Tail - n /var/log/message 里面放了程序的状态
Killall -signal 指令名称
可以将系统中该指令名称启动的程序全部删除
优先级:pri nice值的和才是程序的优先级
Nice值可调整的范围是-20-19
Root可随意调整自己或他人程序的nice值,且范围是-20-19
一般用户只能调整自己程序的nice值,且范围是0-19(避免一般用户抢占系统资源)
一般使用者仅能调高nice值
使用nice指令 调整程序的优先级
例如将备份程序的优先级调低,只有当系统比较空的时候,才执行不太重要的备份指令
如果要调整的是已经存在的某个程序的话,那就只能使用renice指令来调整程序的优先级
指令:renice -nPID
Nice值是可以在父程序,子程序之间传递的,父程序的nice值如果被修改了,那么子程序的nice值也自动会改变
系统资源的观察:free
/etc/security/limits.conf设定了使用者可以同时登录的联机数量,放入背景的工作要想运作时,他必须不用和用户交互
Bash只能管理自己的工作而无法管理其他bash的工作,即使是root,也不能将其他bash底下的工作拿过来由自己来执行。在背景中执行的指令不能被ctrl+c来中断
将目前的工作放到后台中暂停:ctrl+z
将背景工作拿到前台来处理:fg%jobnumber
让工作在背景中继续运行:bg%jobnumber
管理背景中的工作:kill –signal%jobnumber
&指的是在终端机中的背景是不能被ctrl+c来中断的,并不是真正放到系统的背景中去,在bash退出之后,所有的工作都将被停止。At是将作业放到系统背景中去执行,而与终端机没关系。
系统程序的查询:只是查询自己的bash中运行的程序,ps –l,另外一个是查询整个系统中运行的程序ps –aux
F是程序旗标,代表该程序的权限,4代表root,1表示只进行fork而没有exec,S代表程序的状态
R (Running):该程序正在运作中
S (Sleep):开程序目前正在睡眠状忞(idle),但可以被唤醒(signal)
D :不可被唤醒的睡眠状态,通常这支程序可能在等待 I/O 癿情况(ex>打印)
Ps是静态攫取一个时间点的程序状态,top可以持续的监测整个系统的状态。Bash的PID可以由echo $$来取得
Pstree,free,netstat,uptime
Socket file可以沟通两个程序之间的信息,因此程序可以取得对方传过来的资料。
Dmesg:分析核心的讯息
系统在开机的时候,核心会去侦测系统的硬件,你的某些硬件有没有被捉到,那就和这个时候的侦测有关,所有核心侦测的讯息,不管是开机时候还是系统运作的过程中,反正只要是核心产生的讯息,都会被记录到内存的某个保护区段。Dmesg这个指令就能够将该区段的讯息读出来。
Vmstat:侦测系统资源的变化
/proc/*代表内存中的数据