16.1.2 Linux 的多用户多任务环境

在 Linux 下面执行一个指令时,系统会将相关的权限、属性、程序码与数据等均载入内存, 并给予这个单元一个程序识别码 (PID),最终该指令可以进行的任务则与这个 PID 的权限有关。根据这个说明,我们就可以简单的了解,为什么 Linux 这么多用户,但是却每个人都可以拥有自己的环境了吧。

多人环境:

什么是“多用户多任务”?在Linux系统上具有多种不同的账号,每种帐号都有都有其特殊的权限,只有一个人具有至高无上的权力,那就是 root (系统管理员)。除了 root 之外,其他人都必须要受一些限制的。

多任务行为:

目前的 CPU 速度可高达几个 GHz。 这代表 CPU 每秒钟可以运行 109 这么多次指令。我们的 Linux 可以让 CPU 在各个工作间进行切换, 也就是说,其实每个工作都仅占去 CPU 的几个指令次数,所以 CPU 每秒就能够在各个程序之间进行切换。

CPU 切换程序的工作,与这些工作进入到 CPU 运行的调度 (CPU 调度,非 crontab 调度)会影响到系统的整体性能! 目前 Linux 使用的多任务切换行为是非常棒的一个机制,几乎可以将 PC 的性能整个压榨出来。

多重登陆环境的七个基本终端窗口:

在 Linux 当中,默认提供了六个文字界面登陆窗口,以及一个图形界面,你可以使用 [Alt]+[F1].....[F7] 来切换不同的终端机界面,而且每个终端机界面的登陆者还可以不同人。Linux 默认会启动六个终端机登陆环境的程序,所以我们就会有六个终端机接口。

16.2 工作管理

这个工作管理 (job control) 是用在 bash 环境下的,也就是说:“当我们登陆系统取得 bashshell 之后,在单一终端机接口下同时进行多个工作的行为管理 ”。

16.2.1 什么是工作管理?

由于假设我们只有一个终端接口,因此在可以出现提示字符让你操作的环境就称为前景(foreground),至于其他工作就可以让你放入背景 (background) 去暂停或运行。要注意的是,放入背景的工作想要运行时, 他必须不能够与使用者互动。举例来说, vim 绝对不可能在背景里面执行 (running) 的,因为没有数据无法运行,而且放入背景的工作是不可以使用 [ctrl]+c 来终止的。

总之,要进行 bash 的 job control 必须要注意到的限制是:

这些工作所触发的程序必须来自于你 shell 的子程序(只管理自己的 bash);

前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);

背景:可以自行运行的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 调用该工作;

背景中“执行”的程序不能等待 terminal/shell 的输入(input)

16.2.2 job control的管理

如前所述,bash 只能够管理自己的工作而不能管理其他 bash 的工作,所以即使你是 root 也不能够将别人的 bash 下面的 job 给他拿过来执行。此外,又分前景与背景,然后在背景里面的工作状态又可以分为“暂停 (stop)”与“运行中 (running)”。实际进行 job 控制的指令有下面这些:

直接将指令丢到背景中“执行”的 &

如果想要同时进行多个工作, 那么可以将某些工作直接丢到背景环境当中,让我们可以继续操作前景的工作。如何将工作丢到背景中?最简单的方法就是利用“ & ”。举个简单的例子,我们要将 /etc/ 整个备份成为 /tmp/etc.tar.gz 且不想要等待,那么可以这样做:

16.1.2 Linux 的多用户多任务环境_第1张图片

在输入一个指令后,在该指令的最后面加上一个“ & ”代表将该指令丢到背景中, 此时 bash 会给予这个指令一个“工作号码(job number)”,就是那个 [1]。至于后面那个 14432 则是该指令所触发的“ PID ”。而且,有趣的是,我们可以继续操作 bash。如果你输入几个指令后,突然出现这个数据:

就代表 [1] 这个工作已经完成 (Done) ,该工作的指令则是接在后面那一串命令行。 另外,这个 & 代表:“将工作丢到背景中去执行”。 注意到那个“执行”的字眼!此外,这样的情况最大的好处是: 不怕被 [ctrl]+c 中断。此外,将工作丢到背景当中要特别注意数据的流向。包括上面的讯息就有出现错误讯息,导致我的前景被影响。 虽然只要按下 [enter] 就会出现提示字符。但如果我将刚刚那个指令改成:

在背景当中执行的指令,如果有 stdout 及 stderr 时,他的数据依旧是输出到屏幕上面的, 所以,我们会无法看到提示字符,当然也就无法完好的掌握前景工作。同时由于是背景工作的 tar , 此时你怎么按下 [ctrl]+c 也无法停止。所以,最佳的状况就是利用数据流重导向, 将输出数据传送至某个文件中。举例来说,我可以这样做:

这样,输出的信息都给他传送到 /tmp/log.txt 当中,当然就不会影响到我们前景的作业了。

工作号码 (job number) 只与你这个 bash 环境有关,但是他既然是个指令触发的,所以当然一定是一个程序, 因此你会观察到有 job number 也搭配一个 PID。

将“目前”的工作丢到背景中“暂停”:[ctrl]-z

想个情况:如果我正在使用 vim ,却发现我有个文件不知道放在哪里,需要到 bash 环境下进行搜寻,此时是否要结束 vim 呢?不需要,只要暂时将 vim 给他丢到背景当中等待即可。 例如以下的案例:

16.1.2 Linux 的多用户多任务环境_第2张图片

在 vim 的一般模式下,按下 [ctrl] 及 z 这两个按键,屏幕上会出现 [1] ,表示这是第一个工作, 而那个 + 代表最近一个被丢进背景的工作,且目前在背景下默认会被取用的那个工作(与 fg 这个指令有关 )!而那个 Stopped 则代表目前这个工作的状态。在默认的情况下,使用 [ctrl]-z 丢到背景当中的工作都是“暂停”的状态。

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

16.1.2 Linux 的多用户多任务环境_第3张图片

如果想要知道目前有多少的工作在背景当中,就用 jobs 这个指令。一般来说,直接下达jobs 即可! 不过,如果你还想要知道该 job number 的 PID 号码,可以加上 -l 这个参数。+ 代表默认的取用工作。 所以说:“目前我有两个工作在背景当中,两个工作都是暂停的, 而如果我仅输入 fg 时,那么那个 [2] 会被拿到前景当中来处理”。

其实 + 代表最近被放到背景的工作号码, - 代表最近最后第二个被放置到背景中的工作号码。 而超过最后第三个以后的工作,就不会有 +/- 符号存在了。

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

刚刚提到的都是将工作丢到背景当中去执行的,那么有没有可以将背景工作拿到前景来处理的?就是fg。举例来说,我们想要将上头范例当中的工作拿出来处理时:

16.1.2 Linux 的多用户多任务环境_第4张图片

经过 fg 指令就能够将背景工作拿到前景来处理。不过比较有趣的是最后一个显示的结果,我们会发现 + 出现在第一个工作后! 怎么会这样啊?这是因为你刚刚利用 fg %1 将第一号工作捉到前景后又放回背景,此时最后一个被放入背景的将变成 vi 那个指令动作, 所以当然[1] 后面就会出现 + 了。另外,如果输入“ fg - ” 则代表将 - 号的那个工作号码拿出来,上面就是 [2]- 那个工作号码。

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

管理背景当中的工作: kill

我们可以让一个已经在背景当中的工作继续工作,也可以让该工作以 fg 拿到前景来, 那么,如果想要将该工作直接移除呢?或者是将该工作重新启动呢?这个时候就得需要给予该工作一个讯号 (signal),kill这个指令就起作用了。

16.1.2 Linux 的多用户多任务环境_第5张图片

-9 这个 signal 通常是用在“强制删除一个不正常的工作”时所使用的, -15 则是以正常步骤结束一项工作(15也是默认值),两者之间并不相同。举上面的例子来说,我用 vim 的时候,不是会产生一个 .filename.swp 的文件吗? 那么,当使用 -15 这个 signal时, vim 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个 signal 时,由于该 vim 工作会被强制移除掉,因此, .filename.swp 就会继续存在文件系统当中。

不过,毕竟正常的作法中,你应该先使用 fg 来取回前景控制权,然后再离开 vim 才对。因此,以上面的范例二为例,其实 kill 确实无法使用 -15 正常的结束掉 vim 的动作。通常使用 -9 是因为某些程序你真的不知道怎么通过正常手段去终止他,这才用到 -9 的。

kill搭配 signal 所详列的信息 (用 man 7 signal 去查阅相关数据) 可以让您有效的管理工作与程序 (Process),此外,那个 killall 也是同样的用法。使用kill-l可以得到signal number 与名称的对应。

另外, kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字了。

你可能感兴趣的:(Linux,linux,运维,服务器)