1、程序和进程

进程:当程序被触发后,执行者的权限、属性,程序代码和所需资料都会被存入一个“结构体”,并被赋予一个PID。
也就是说,不同账户执行同一个程序,其权限属性和PID是不同的。
image.png

比如登录Shell,进程中会记录账户的UID和GID:
image.png

进程之间的关系:子进程和父进程

在一个进程中调起另一个进程,那前者就是后者的父进程。
利用ps -l可以查看到父子进程的关系:
image.png

fork&exec

在Linux 的程序呼叫通常称为fork-and-exec 的流程 (注1 )!程序都会藉由父程序以复制(fork) 的方式产生一个一模一样的子程序, 然后被复制出来的子程序再以exec 的方式来执行实际要进行的程式,最终就成为一个子程序的存在。

常驻程序:服务(daemon)

常驻于内存的进程,比如Apache, named, postfix, vsftpd… 等等

这些网路服务比较有趣的地方,在于这些程式被执行后,他会启动一个可以负责网路监听的埠口 (port) ,以提供外部用户端(client) 的连线要求。

一般daemon 类型的程式都会加上d 在档名后头,以此来判断进程是否是daemon,比如httpd, vsftpd

Linux 的多人多工环境

linux系统不会因为一个程序卡死而导致系统崩溃。
当前bash卡死的话,可以按下[Alt]+[F1]…..[F7] 来切换到其他的终端机界面,然后以ps -aux找出刚刚的错误程序,然后给他 kill一下

在bash下同时执行多个程序

在命令最后加上&即可让该子程序在背后运行,如:
**cp file1 file2 &**
指令完成后,系统将会在你的终端介面显示完成的消息

2、工作管理(job control)

举例来说,我们在登入bash 后, 想要一边复制档案、一边进行资料搜寻、一边进行编译,还可以一边进行vim 程式撰写!当然我们可以重复登入那六个文字介面的终端机环境中,不过,能不能在一个bash 内达成?当然可以啊!就是使用job control 啦!

  • 前景:你可以控制与下达指令的这个环境称为前景的工作(foreground);
  • 背景:可以自行运作的工作,你无法使用[ctrl]+c 终止他,可使用bg/fg 呼叫该工作;
    • 暂停
    • 运作中

直接将指令丢到背景中『执行』的&

比如将/etc/ 整个备份成为 /tmp/etc.tar.gz 且不想要等待:
image.png

  • [1]指的是背景的第一个job
  • 然后还给了这个子进程的PID:14432

当子进程完成后,屏幕输出其本身的命令:
image.png
注意:此时程序输出是屏幕,因此你可能会看到眼花缭乱的信息,一个解决方法是:数据重定向
image.png
这里的2>&1意思是,把错误流和输出流合并,导入输出流的地方,也就是log.txt。

将当前程序丢到背景中并暂停:ctrl-z

注意:ctrl-c是直接中断当前进程
image.png

观察目前的背景工作状态: jobs

image.png

那个+ 代表预设的取用工作。所以说:『目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入fg 时,那么那个[2] 会被拿到前景当中来处理』! 其实+ 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有+/- 符号存在了!

将背景工作拿到前景来处理:fg (foreground)

fg -取出-标注的任务
fg 1取出1号job
image.png

让工作在背景下的状态变成运作中: bg

[ctrl]-z 可以将目前的工作丢到背景底下去『暂停』
如何让一个工作在背景底下『 Run 』呢?
**bg %3 **让3号任务变成运行态,同时该指令最后会自动加上&,表示在背景运行

管理背景当中的工作: kill

kill -signal %jobnumber 给标号为jobnumber的任务发送signal信号,不同的信号表示不同含义
kill -l查看信号列表
常见信号:1(reload),9(强制结束),15(企图正常结束)
image.png

注意:kill job时,需要加上%进行区分;正常kill 进程使用进程号即可

离线执行任务nohup

尽管使用&将任务放到后台执行,但是这里的后台指的是bash的后台,当离线时,所有任务会终止。
使用nohup可以在离线或登出系统时,继续执行任务:
image.png
注意:nohup不支持bash内建指令

3、程序管理

  • 程序的权限:
    • 首先,本章一开始就谈到的,我们在操作系统时的各项工作其实都是经过某个PID 来达成的(包括你的bash 环境), 因此,能不能进行某项工作,就与该程序的权限有关了。
  • 程序的资源占用:
    • 再来,如果您的Linux 系统是个很忙碌的系统,那么当整个系统资源快要被使用光时, 您是否能够找出最耗系统的那个程序,然后删除该程序,让系统恢复正常呢?
  • 管理程序:
    • 此外,如果由于某个程式写的不好,导致产生一个有问题的程序在记忆体当中,您又该如何找出他,然后将他移除呢?
  • 程序优先级:
    • 如果同时有五六项工作在您的系统当中运作,但其中有一项工作才是最重要的, 该如何让那一项重要的工作被最优先执行呢?

观察程序

那么我们如何查阅系统上面正在运作当中的程序呢?很简单啊!利用静态的ps 或者是动态的top,还能以pstree 来查阅程序树之间的关系喔! 鸟哥个人认为ps 这个指令的man page 不是很好查阅,因为很多不同的Unix 都使用这个ps 来查阅程序状态, 为了要符合不同版本的需求,所以这个man page 写的非常的庞大!

ps :将某个时间点的程序运作情况撷取下来

image.png

  • 仅观察自己的bash 相关程序: ps -l
  • image.png
  • 观察系统所有程序:ps aux
  • image.png

top:动态观察程序的变化

image.png

管理程序

程序优先级

观察系统资源