Linux技术研究-基础篇(进程和shell及软件安装)

Linux技术研究-基础篇(进程和shell及软件安装)

计算机中的资源
计算机系统中的资源包括硬件资源和软件资源.
   硬件资源有处理器,存储器,外部设备;
   软件资源有程序和数据.
现代计算机系统一般采用多任务并发执行方式,而且有的计算机系统由多个用户同时联机使用,这使得计算机的资源不是由一个程序在运行时独占使用,而是由多个并发运行的程序共享使用.如果由各并发运行的程序自己决定如何使用资源,则会各行其事,造成冲突,混乱,使系统无法顺利高效运行,因此要有一个地位高于各应用程序之上的软件来进行自动的,统一的管理,这个软件就是操作系统.操作系统的目标之一就是统一管理分配计算机系统资源,在保证各并发执行的应用程序书里运行的前提下提高资源利用率.

单任务单用户和多任务多用户
单处理器系统中,程序有两种运行方式:单道程序顺序执行(单任务单用户)和多道程序并发运行(多用户多任务).
单道程序顺序执行:要执行的多个程序按一定次序依次执行,一个程序运行完毕才能运行下一个程序,既在一个程序运行期间不插入运行其他程序.这种运行方式的优点是实现简单,不需要在多个进程之间进行转换;缺点是资源利用率低,因为在系统运行的郑国过程中,始终是一道程序独占系统全部资源,一般一道程序不会同时进行计算和输入输出操作,这使得处理器和设备串行工作,在处理器忙时,设备空闲,在设备忙时处理器空闲,并且这样的系统无法提供多用户同时联机使用方式.
多道程序并发执行:在内存中同时存放多道程序,按一定策略调度多道程序交叉运行,形成"微观上串行,宏观上并行"的情况,使得处理器和设备可以并行工作,当某个进程输入输出操作时,可以同时有另一个进程在处理器上进行计算.
从直观上看这种方式肯定比单道程序执行方式的资源利用率高.
在多任务多用户的系统中,多个进程交替运行,这样进程在其生存期内肯定有多种状态,至少有运行和不运行两种状态,进程的状态数量是操作系统按照一定的管理策略设置的,进程状态转换时操作系统实施进行管理的一个基本操作.操作系统使用模块提供的功能来管理进程的状态切换.


1.认识进程
linux在执行每一个程序时,就会在内存中为这个程序建立一个进程,以便让内核可以管理这个运行中的进程.内核会记录这个程序执行期间分配的内存空间以及使用过的资源,所以linux在内核中为每一个执行中的程序建立一个资料库,记录该程序执行过程中都开启了哪些文件,使用了哪些资源,等等信息.这个资料就是进程.进程就是linux系统中用来记录执行过程中程序各种信息的资料.
进程是系统分配各种资源,进程调度的基本单位.
进程的活动是通过在CPU上执行一系列程序和对应数据进行操作来体现的,因此程序和它的操作数据是进程存在的实体,但这两者仅是静态的文本,没有反应出动态性,为此,还需要一个数据结构来描述进程当前的状态、本身的特性等,这种数据结构称为进程控制块PCB(Process Control Block),简称进程控制块.

2.进程的组成:
进程分为三部分:1.程序部分. 2.数据集合. 3.PCB
进程的程序部分描述进程所要完成的功能,而数据结构集是执行时不可少的工作区和操作对象,这两部分是进程完成所需功能的物质基础.由于这两部分内容与控制进程的执行及完成进程功能直接相关,因而,在大部分多道系统系统中,这两部分内容放在内存中,直到该进程执行时再调入内存.所以进程实体通常由程序,数据集合和PCB三部分组成,也成为进程映像.
PCB(Process Control Block),简称进程控制块.
包含一个进程的描述信息,控制信息和资源信息.有些系统中还有进程调度等待所使用的现场保护区.PCB集中反映一个进程的动态特性.
在创建进程时,就为它创建PCB,然后根据PCB中的信息对进程实施有效的管理和控制.当一个进程完成其功能后,系统释放PCB,进程也随之消亡.所以,PCB是进程存在的唯一标志。
PCB又分为四部分
   1.进程标示符
   用于唯一地标识一个进程,一个进程通常有以下两种标示符.
   1) 进程内部标示符.在所有操作系统中,为每一个进程赋予一个唯一的数字标识符
     它通常是一个进程的序号,设置内部标示符主要是为了方便系统使用.
   2) 进程外部标示符.它由创建者提供,通常是由字母、数字组成,往往由用户(进程)在访问该进程时
     使用。为了描述进程的家族关系,还应设置父进程标识及子进程标识。
   2.处理器状态
   处理器状态信息主要由处理器的各种寄存器中的内容组成。处理器在运行时,许多信息放在寄存器中
   当处理器被中断时,这些信息都必须保存在PCB中,以便在该进程重新执行时能从断点继续执行。
   3.进程调度信息
   1) 进程状态。指明进程当前的状态,座位进程调度和对换的依据
   2) 进程优先级。用于描述进程使用处理器的优先级别的整数,优先级高的进程应优先获得CPU
   3) 进程调度所需的其他信息。他们与所采用的进程调度算法有关,如等待CPU的时间,已运行时间等
   4) 事件或阻塞原因。指进程由执行状态转变为阻塞状态所等待发生的事件。

   4.进程控制信息
   1) 程序和数据的地址,指进程的程序和数据所在的内存或外存的地址,以便再次调度到该进程执
      行时,能从PCB中找到其程序和数据。
   2) 进程同步和通信机制,指实现进程同步和进程通信时必须的机制,如消息队列指针、信号量等
   3) 资源清单,是一张列出了除CPU以外、进程所需的全部资源及已经分配到该进程的资源清单。
   4) 连接指针,给出了本进程PCB所在队列的下一个进程PCB的首地址。

3.进程的创建和终止.
1) 创建 通过调用创建原语 Creat()
   1.申请空白PCB.为新进程申请获得唯一的进程标示符,并从PCB集合中索取一个空白PCB
   2.分配进程资源.包括创建进程的程序、数据及用户栈所需的内存空间。
   3.初始化PCB.包括初始化标识信息,如进程标示符,父进程标示符;
    处理器将新进程的状态设置为就绪状态,以及进程的优先级等.
   4.将新进程插入到就绪态对立.
2) 终止 通过调用终止原语来终止进程
   1.根据被终止进程的标示符,从PCB队列中检索出该进程的PCB,从中读出该进程的状态.
   2.若被终止进程正处于执行状态,则立即终止该进程的执行,该进程被终止后应重新进程调度.
   3.检查该进程有无子孙进程,若有,则将其所有子孙进程终止.
   4.释放终止的进程所占用的资源,将其归还它的父进程或系统.
   5.将被终止的进程从它的PCB队列中移除.

4.进程的运行方式
1) fork()函数系统调用
   通过复制来创建子进程,子进程继承父进程的上下文,是父进程的一个副本,与父进程使用同一段代码,
   在该系统调用之后,两个代码相同的进程并发执行.
2) exec()函数系统调用
   在现有进程上执行,不会产生子进程,通常,进程的末尾写一条exit(),使进程自我终止,来标识进程的
   退出状态,而exec调用方式则是在进程自身上执行这条exit(),所以会将当前进程退出.
3)source()函数系统调用
   以exec类似,只是进程的末尾没有exit(),故不会退出当前进程


怎么查看进程
ps 命令
# ps aux|head -n 2
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1 0.0 0.2   2064   624 ?        Ss   10:28   0:00 init [3]                    USER:程序的执行者
PID:进程的ID号
%CPU:占用CPU的百分比
%MEM:占用内存的百分比
VSZ:预分配的内存量,也就是程序所能使用的内存数量 KB单位
RSS:真实内存占用大小;在预分配的范围中已经使用的大小 单位KB
STAT:进程运行的状态
   R 进程已经准备好指令,等待让CPU执行,或CPU正在执行
   T 进程的暂停状态,一般都是由运行状态状态转换而来,等待某种特殊处理,如调试跟踪的程序,每执行到一个断点,就转入暂停状态,等待新的输入信号.
   S 进程可中断的睡眠模式 (可中断,就是程序接收到一种信号后可以改变到另一种状态)
   Z 代表改进程目前为 zombie 状态.
   D 进程进入无法中断的睡眠模式.(不可中断,是因为硬件资源无法满足,不能被信号唤醒.必须等到所等    到等待的资源得到之后才能被唤醒)
   < 代表为高优先级
   N 代表为低优先级
   l 多线程
   L 锁在内存中,防止和虚拟内存交换
   s 会话,后台进程组
   + 前台进程组
START:进程启动时间
TIME:进程占用CPU的时间
COMMAND:进程名字
# ps lax
F   UID   PID PPID PRI NI    VSZ   RSS WCHAN STAT TTY        TIME COMMAND
4     0     1     0 15   0   2064   624 -      Ss   ?          0:00 init [3]
F    进程标识 FLAG
WCHAN 正在等待的进程资源;
PRI 内核调度的优先级
NI   nice值
查询进程的层次关系
ps auxf
pstree -p PID

时时监视进程
top


修改进程的优先级
renice -20 -p 3895
renice 19 -p 3895

进程运行时就指定优先级
nice 19 sleep 120
nice --20 sleep 110

结束进程
# kill -l
# man 7 signal
1) SIGHUP   9) SIGKILL   15) SIGTERM
1.作用于不同的进程其功能不一样
   与终端机建立关联的形成: 通知进程终端机将关闭.
   Daemon 进程:重置执行环境
9.通知内核立刻结束进程
15.请求进程自我结束

kill PID
pkill http*
killall httpd
进程的前后台切换
find /usr -type f &> /dev/null
CTRL+Z 暂停前台进程放到后台
bg 1 启动后台进程
fg 1 将后台进程切换到前台
1是后台进程顺序号 可以用jobs查看
sleep 60 &
kill %1


BASH shell

SHELL的发展历史,SH-CSH-KSH-TCSH-BASH
外部命令 内部命令 别名
内部命令是BASH自带的命令 功能简单,内部命令的帮助在builtin(1)里
外部命令是就是一个小程序存在于/bin/ /sbin/ /usr/bin 等地方
别名命令是为了简化输出给一个长参数命令的整合.
别名的定义方法 alias la='ls -al' 取消别名 unalias la

命令的执行顺序
先别名 再内后外

命令补齐TAB键
简化输入 提示 防止书写错误

历史记录
上下键查
history 查询 用!ID 调用
ctrl+r 输入匹配

快捷键
CTRL+A 行首
CTRL+E 行尾
CTRL+U 删除自光标到行首串
CTRL+K 删除自光标到行尾串
CTRL+L 清屏

特殊符号
;
   一般情况我们输出完一个命令需要按一个回车,如果你想在一行上执行多个命令时中间用;分割
   touch my_file;ls my_file
* 任意字符
? 任一字符
[abc] 列表项之一
[^abc] 对列表取非 也可以使用范围 [a-z] [0-9] [A-Z]
{} 循环列表 touch_{1,2,3}会建立 touch_1 touch_2 touch_3
   控制变量名的范围 echo ${AB}C
~ 家目录 cd ~seker 进入seker用户家目录
$ 提取变量值
`` $() 命令替换touch `date +%F_\`date +%T\`` touch $(date +%F_$(date +%T))
$[] 整数计算 echo $[2+3] - * / % 浮点数用 echo "scale=3; 10/3" | bc -l
\ 转义后面的字符 echo \\ 输出 \ 线
"" '' 带空格串 将空格视为串的一部分 echo "abc xyz" echo 'abc xyz'
   转义特殊字符,防止被SHELL解释
bash中的特殊字符

`` 命令替换 取命令的执行结果
$()同上,但它弥补了``的嵌套缺陷

[root@mail ~]# ls
anaconda-ks.cfg install.log.syslog Desktop install.log
[root@mail ~]# echo ls
ls
[root@mail ~]# `echo ls`
anaconda-ks.cfg install.log.syslog Desktop install.log
[root@mail ~]# echo `echo ls`
ls
[root@mail ~]# `echo `echo ls``
ls
[root@mail ~]#
[root@mail ~]# $(echo $(echo ls))
anaconda-ks.cfg install.log.syslog Desktop install.log
[root@mail ~]#
~ 家目录
[root@mail ~]# cd ~seker
[root@mail seker]# pwd
/home/seker
[root@mail seker]#

! 取非
[root@mail seker]# ls /dev/sda[!123]
/dev/sda4 /dev/sda5
[root@mail seker]#

! 历史命令调用
[root@mail seker]# !1092
ls /dev/sda[!123]
/dev/sda4 /dev/sda5
[root@mail seker]#

! 匹配最近一次历史命令
[root@mail seker]# !ls
ls /dev/sda[!123]
/dev/sda4 /dev/sda5
[root@mail seker]#

! ls 带空格 将命令的返回值取反
[root@mail seker]# ! ls
mail
[root@mail seker]# echo $?
1
[root@mail seker]#
0-255之间,0则为真,非0位假

@ 无特殊含义

# 注释

$ 变量取值
$() 命令替换
${} 变量名的范围
[root@mail seker]# a=100
[root@mail seker]# echo $a
100
[root@mail seker]# echo 1$a
1100
[root@mail seker]# echo $a0

[root@mail seker]# echo ${a}0
1000
[root@mail seker]#

% 杀后台进程 jobs号; 取模

^ 取非 和 ! 雷同
[root@mail seker]# ls /dev/sda[!123]
/dev/sda4 /dev/sda5
[root@mail seker]# ls /dev/sda[^123]
/dev/sda4 /dev/sda5
[root@mail seker]#
^ 替换
[root@mail seker]# service xinetd restart
停止 xinetd:                                              [确定]
启动 xinetd:                                              [确定]
[root@mail seker]# ^xinetd^vsftpd^
service vsftpd restart
关闭 vsftpd:                                              [失败]
为 vsftpd 启动 vsftpd:                                    [确定]
[root@mail seker]#

& 后台执行;&& 逻辑与

* 匹配任意长度字符串;计算乘法

() 子进程执行
[root@mail ~]# (aaa=123)
[root@mail ~]# echo $aaa

[root@mail ~]# (aaa=123;echo $aaa)
123
[root@mail ~]#

变量: 分为普通变量和环境变量
[root@mail seker]# ls
    ----fork 子进程:拷贝父进程的标准输入,输出,错误+环境变量

[root@mail seker]# exec ls
    ----exec
Connection closed by foreign host.

bash---->fork
| \
|   \
|    \
wait   exec
|     /
|    /
|   /
| exit0 故:exec ls则退出了终端
|
等待用户输入

- 减号;区间;cd -;杀掉次当前jobs

_ 无特殊含义

+ 加号 ;杀掉当前jobs

= 赋值

| 管道; || 逻辑或

\ 转义;

{} 命令列表
# { ls; cd /; }

[] 字符通配; [ 测试命令 ]

: 空命令 真值
[root@mail /]# type :
: is a shell builtin
[root@mail /]# type [
[ is a shell builtin
[root@mail /]#

; 命令结束

"" 软引   ''硬引

< 输入重定向

> 输出重定向

>> 追加

<< here document

>& 合并2和1输出

, 枚举分隔符

. source ; 当前目录

/ 目录分隔符

? 单个字符

回车 命令执行


shell的多终端同步
所需软件包
# rpm -qa | grep 'tcl\|expect'
expect-5.43.0-5.1
tcl-8.4.13-3.fc6
tclx-8.4.0-5.fc6
#
   # w
03:01:23 up 15 min, 2 users, load average: 0.00, 0.04, 0.07
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.10.10.1       02:46    0.00s 0.53s 0.01s w
root     pts/1    10.10.10.1       02:58    4.00s 0.05s 0.05s -bash
#
# kibitz root # 向root用户发送邀请.
# kibitz -tty pts/1 root # 指明连接终端邀请
#
Message from [email protected] on pts/0 at 03:03 ...
Can we talk? Run: kibitz -3145
EOF
kibitz -3145 # 被邀请方 执行命令 若想退出 直接用^]或exit
Escape sequence is ^]
#
to exit kibitz, enter: exit
to suspend kibitz, press appropriate job control sequence
to return to kibitzing, enter: return
kibitz1.1> exit
#
变量
变量名称规则 只能使用字母,数字,与下划线.以字母或下划线开头
系统变量
set 和 env区别
set:显示所有变量
env:环境变量
变量赋值
VARNAME=VALUE
echo $VARNAME
删除变量 unset VARNAME

常用变量
PATH
PWD
LANG
HOME
HISTSIZE
PS1
全局变量与私有变量
# my_name=seker
# export your_name=zorro
# echo $my_name
   seker
# echo $your_name
   zorro
# bash
# echo $my_name

# echo $your_name
   zorro
# export her_name=angel
# exit
   exit
# echo $her_name

#
全局变量可以被子进程继承,子进程的全局变量随着子进程结束而消失

BASH SHELL 属性
BASH中会存储一些自身属性的参数,启用或关闭某一项功能
例如控制* .字符是否为通配
查看参数 set -o
关闭noglob参数
# set -o noglob
# ls *
   ls: *: 没有那个文件或目录
# set +o noglob
   ls *

固化设定
我们前面所学习的更改变量 属性等等都是在内存中修改 机器重新启动后就会恢复默认值
那么怎么固化这些设置 让他们永久生效呢?
这就需要了解BASH两种类型
1.登录shell 2.非登录shell
登录shell
   就是通过输入用户名 密码后 或 su - 获得的shell
非登录shell 则是通过bash命令和脚本开启的shell环境
那么他们有什么区别呢?和我们固化设定又有什么关系呢?
我们知道在linux里一切皆为文件,同样,shell的属性加载也是写到文件里的
在登陆时就会加载对应文件的内容来初始化shell环境,
非登录与登录区别就在于加载的文件不同 从而导致获得的shell环境不同
我们看看登录shell都加载了那些文件
--> /etc/profile
   --> /etc/profile.d/*.sh
     --> $HOME/.bash_profile
              --> $HOME/.bashrc
                --> /etc/bashrc
再看非登录shell加载的文件
--> $HOME/.bashrc
   --> /etc/bashrc
     --> /etc/profile.d/*.sh
可见,非登录shell加载的文件要少很多
那么我们想要固化一个配置时在哪种登录下生效,就显而易见的知道该写在哪个文件里了
通常,我们会将环境变量设置在 $HOME/.bash_profile 中
如果不管哪种登录都想使用的变量 就设置在 $HOME/.bashrc中


软件安装
在RHEL中所有的软件都是由rpm包安装而得来的,rpm是红帽特有的软件包拓展名,同时也申请了专利,在redhat-linux里所有的软件包都是以.rpm为拓展名的,他们存在于光盘的 Server/ 目录下
安装软件 rpm -ivh 升级rpm -Uvh
为解决依赖关系才有了yum
yum的配置
vi /etc/yum.conf
   [iso]
   name=RHEL 5U3 ISO
   baseurl=file:///media/Server
   gpgcheck=0
:wq
yum install vsftpd
yum remove vsftpd
yum grouplist
yum groupinstall ""

RPM源码包的安装:

1.执行rpm -i you-package.src.rpm
2. cd /usr/src/redhat/SPECS
前两步和方法一相同
3. rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件
这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)
在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。
执行rpm -i new-package.rpm即可安装完成。

tar源码包的安装
根据不同软件 会有不同的安装参数和相应的方法 具体的要查看 INSTALL or README
# tar xvjf lftp-3.7.14.tar.bz2
# ./configure
# make
# make install

你可能感兴趣的:(linux,职场,休闲,技术研究,基础篇)