什么是进程
- 程序(program):通常为二进制程序放置在储存媒介中(如硬盘、光盘、软盘、磁带等),以物理文件的形式存在。
- 进程(process):程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载到内存中,操作系统并给予这个内存内的单元一个标识符(PID),也就是说:进程就是一个正在运行的程序。
- 父子进程
jack@ubuntu:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 【7261】 7253 0 80 0 - 7083 wait pts/0 00:00:00 bash
0 T 1000 16097 【7261】 0 80 0 - 14574 signal pts/0 00:00:00 vim
0 R 1000 17246 【7261】 0 80 0 - 3484 - pts/0 00:00:00 ps
//可以看到, bash为父进程 PID为7261, 在这个bash中执行的 `ps`命令为bash的子进程。`wait`表示上图的虚线,bash睡着了。
//F:代表进程标识(process flags),说明进程的权限。4 means “权限为root”, and 1 means “forked but didn't exec”, 0 means that neither flag applies. 0 always means that none of the flags are set.
//S:表示基础的状态:R-Running;S-Sleep;T-stop;Z-Zombie;D-不可被幻想的睡眠状态,通常为等待I/O。
- fork and exec
进程都会通过父进程以复制(fork)的方式产生一个一模一样的子进程,然后被复制出来的子进程再以exec的方式来执行实际要进行的进程,最终就成为一个子进程的存在。
系统先以fork的方式复制一个与进程相同的暂存进程,这个进程与父进程唯一的区别就是PID不同!但是这个暂存进程还会多一个PPID的参数。然后暂存进程开始以exec的方式加载实际要执行的程序,以上述图示来讲,新的进程名为qqq,最终子进程的程序代码就会变成qqq了。
- 系统或网络服务:常驻在内存的进程
- 对于文件相关的操作如:显示文件ls、新建文件touch、管理文件rm/mkdir/cp/mv、权限管理chmod/chown/passwd,命令所触发的PID很快就结束了。常用文件操作,查考 ubuntu常用命令文件操作
- 常驻在内存中的进程成为服务(daemon),如:网络联机服务Apache、named、psotfix等,程序被执行后会启动一个可以负责网络监听的端口(port),提供外部客户端(client)的连接请求。
- linux的多用户,多任务环境
- 多用户:在linux系统上可以有多个用户,每个用户都可以有自己的环境设置(~/.bashrc),和一个管理员(root);每个用户都有对应的用户组。
jack@ubuntu:~$ adduser username // 添加用户
- 多任务: 一个进程可以看做是一个任务,一个时间点只有一个进程再CPU上运行。但是得益于CUP的高达几个GHz的运作,在CUP的调度机制下,即使是多人同时登陆系统时,也会感觉整台主机好像只为自己一个人服务。这就是多用户,多任务的环境。
- 多重登陆环境的七个基本终端界面
在linux中,默认提供了6个命令行界面登陆窗口和一个图形界面。使用[Alt]+[F1]~[F7]切换不同的终端机接口,并且每个终端机接口还可以是不同的人(利用adduser添加用户)。 - 在ubuntu的server版本中,默认登陆界面为tty1,使用[Alt]+[F1]~[F6]切换不同界面登录窗口。没有提供图形界面,需要手动安装。
- 在ubuntu的桌面版中,默认登录为图形界面,使用[Ctrl]+[Alt]+[F1]~[F7]切换不同登陆窗口。
特殊进程管理行为:如果tty1中的程序卡死了,可以切换到tty2,通过PID,用kill
命令结束结束卡死的进程,在回到tty1
- bash环境下的工作管理(job control)
前面提到了”父子进程”,当我们登陆tty1的bash之后就取得了一个PID,之后再bash中执行的命令都是他的子进程。
当在命令行界面tty1工作时,如果要执行多个任务,比如在复制一个特别大的文件的同时,还想使用vim编辑文本,这时候就只有切换到tty2,创建一个新的bash进程来工作了,比较麻烦。不如图形界面工作的时候,可以通过[ctrl]+[alt]+[t]打开新的命令行编辑文本。
如何在tty1的bash进程中工作呢?,例:
jack@ubuntu:~$ cp file1 file2 &
重点在&
,把当前的进程放在后台运行,依旧是在执行这个命令之后,在这一bash任然可以继续干其他操作,如vim编辑文本。
接下来我们重点看一下job control。
job control 重点
job control:当我们登录系统取得bash shell之后,在单一终端机下同时进行多个工作的行为管理。如:我们登陆bash后,想要一边复制,一边进行数据查找,一遍vim编程,并且在一个bash内实现,不用通过不同tty的切换,不用在图形界面打开不同的bash。
//使用过IntelliJ的都知道,在运行`idea.sh`命令之后,会持续的输出相关内容,此时bash就不能在进行其他操作了,此时我们就可以通过job control把它放到后台运行。此处还需要使用输出重定向,把输出放到其他文件中,避免后台运行的输出跑到当前bash中。
// > :不存在文件就新建文件,存在则覆盖存在的文件。 #重定向#
// >> : 不存在文件就新建文件,存在则输出添加进文件。
jack@ubuntu:~$ idea.sh > ideash.out &
[1] 15705
jack@ubuntu:~$ jobs -l //查看后台的程序
[1]+ 15705 Running idea.sh > ideash.out &
//再打开vim 编辑文件 ,[ctrl] + [z]暂停程序
jack@ubuntu:~$ vim ideash.out
[2]+ Stopped vim ideash.out
jack@ubuntu:~$ jobs -l
[1]- 15705 Running idea.sh > ideash.out &
[2]+ 16097 Stopped vim ideash.out
//[1]:表示job number 为 1
//+:表示最近一个被丢到后台的工作。 - :表示倒数第二个被丢到后台的工作 。 之后的工作就不显示了
//15705:代表PID
// Running:工作的状态
//idea.sh > ideash.out & :执行的命令
jack@ubuntu:~$ fg %2 //回到job 2 继续通过vim编辑。
jack@ubuntu:~$ bg %jobnumbers // 让处于stop的job在后台运行。
// 1:类似于reload #signal#
// 9:强制关闭
// 15:正常关闭, 默认值
jack@ubuntu:~$ kill %1 //kill -signal %jobnumbers 管理后台进程
jack@ubuntu:~$ [ 919305] WARN - api.vfs.impl.local.FileWatcher - Watcher terminated with exit code 143
^C
[1]- Terminated idea.sh > ideash.out
jack@ubuntu:~$ jobs
[2]+ Stopped vim ideash.out
- 脱机管理
job control中的”后台”指的是bash下可以避免[ctrl] + [c]中断的一个情境,并不是系统的后台。如果当前bash结束后,在bash中正在执行的其他进程也将结束。通过nohup
可以达到把任务房到系统后台中去。
jack@ubuntu:~$ nohup idea.sh & // 默认输出到nohup.out,相当于nohup idea.sh & >> nohup.out
进程管理
>ps -l //显示当前进程
>ps aux //显示系统所有进程
>kill -signal PID //管理进程,signal同上,
难免有疏忽之处,如有问题请留言!