前言
在Linux中,
程序(program)是放在磁盘上的程序,是不会执行的。
进程(process)是程序被触发,从而加载到内存中的,会被CPU随机执行。
Linux中,有非常多的进程在实时运行,对于进程的管理也是运维非常重要的一部分
Linux的程序变为进程的过程。 以 touch 命令为例子
1:由用户去触发磁盘中的程序,
2:根据触发的用户的权限取得执行的权限,不同的用户权限不同,如root的是 UID/GID = 0/0。
3:取得程序运行的相关资料,也就是程序的上下文。比如touch需要知道当前所在文件路径,当前文件夹的权限。
4:将执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中。
5:Linux生成一个PID进程id,Linux会根据程序的PID来管理此进程。同一个程序运行多次也会有不同的PID,比如运行3次sleep;多个用户登录执行/bin/bash;他们的PID都是不同的。
6:执行完毕后,成功退出,或者失败退出,此时PID被收回,内存中的数据消失。还有可能成为僵尸进程,一直停留在内存中,哈哈哈。
也可以理解,我们可以通过对程序PID的操作来查看管理程序。
Linux中程序与程序间的关系
在 Linux 的程序调用通常称为 fork-and-exec 的流
程 !程序都会借由父程序以复制 (fork) 的方式产生一个一模一样
的子程序, 然后被复制出来的子程序再以 exec 的方式来执行实际要进
行的程序,最终就成为一个子程序的存在。
在子程序执行的时候,父程序会sleep。子程序结束的时,子程序的PID,内存中的数据会消失,再回到父程序的流程中。
程序的前台运行与后台运行:bash 的 job control
在某些特定的环境下,会在/etc/security/limits.conf 里面设置使用者同时
可以登陆的连线数,在这样的情况下,某些使用者可能仅能以一个连线
来工作。所以有时候需要用单个bash来处理多个工作。这时候就需要把程序放在后台执行了。
直接将指令丢到背景中"执行"的 &
tar -zpcf /tmp/etc.tar.gz /etc &
这条命令可以将打包的过程放到后台执行,但是将工作丢到背景当中要特
别注意数据的流向。包括上面的讯息就有出现错误讯息,导致我的前台被影响。
如果想要前台不被影响则可以像下面这样:
tar -zpcvf /tmp/etc.tar.gz /etc > /tmp/log.txt 2>&1 &
如此一来,输出的信息都给他传送到 /tmp/log.txt 当中,当
然就不会影响到我们前台的作业了。 这就是数据流重导向的重要性。
将"目前"的工作丢到后台中"暂停":[ctrl]-z
如:sleep 1000
这时,后台程序会暂停,不会再执行了。
使用 jobs -l 查看后台的程序。
1\] 和 \[2\] 是工作号,可以通过工作号来操作任务。  #### 将后台工作拿到前台来处理:fg + 任务编号  #### 让工作在后台下的状态变成运行中: bg + 任务编号  #### 管理背景当中的工作: kill kill向以 PID 进程号或者 JOBSPEC 任务声明指定的进程发送一个以 SIGSPEC 信号声明或 SIGNUM 信号编号命名的信号 来管理进程。 kill有如下的信号码  ##### 一般的话,使用1,9,15这三个即可达成很多目的了。 -1是重新加载配置文件。 -9 这个 signal 通常是用在"强制删除一个不正常的 工作"时所使用的, -15 则是以正常步骤结束一项工作(15也是默认 值),两者之间并不相同呦!举上面的例子来说, 我用 vim 的时候, 不是会产生一个 .filename.swp 的文件吗? 那么,当使用 -15 这个 signal 时, vim 会尝试以正常的步骤来结束掉该 vi 的工作, 所以 .filename.swp 会主动的被移除。但若是使用 -9 这个 signal 时,由于该 vim 工作会被强制移除掉,因此, .filename.swp 就会继续存在文件系统 当中。 通常使用 -9 是因为某些程序你 真的不知道怎么通过正常手段去终止他,这才用到 -9 的 #### 另外, kill 后面接的数字默认会是 PID ,如果想要管理 bash 的工作控制,就得要加上 %数字 了, 这点也得特别留意才行喔! 如: kill -9 %1 kill -9 %2 #### 离线管理问题 要注意的是,我们在工作管理当中提到的"背景"指的是在终端机 模式下可以避免 \[crtl\]-c 中断的一个情境, 你可以说那个是 bash 的背 景,并不是放到系统的背景去喔!所以,工作管理的背景依旧与终端机 有关啦! 在这样的情况下,如果你是以远端连线方式连接到你的 Linux 主机,并且将工作以 \& 的方式放到背景去, 请问,在工作尚未结束的 情况下你离线了,该工作还会继续进行吗?答案是"否"!不会继续进 行,而是会被中断掉。 ***简单说,如果bash关掉,当前bash的后台任务也会结束*** 那该如何处理呢? 首先,你可以参考前一章的 at 来处理即 可!因为 at 是将工作放置到系统背景, 而与终端机无关。如果不想要 使用 at 的话,那你也可以尝试使用 nohup 这个指令来处理喔!这个 nohup 可以让你在离线或登出系统后,还能够让工作继续进行。他的语 法有点像这样: \[root@study \~\]# nohup \[指令与参数\] \<==在终端机前景中工作。 \[root@study \~\]# nohup \[指令与参数\] \& \<==在终端机背景中工作 有够好简单的指令吧!上述指令需要注意的是, nohup 并不支持 bash 内置的指令,因此你的指令必须要是外部指令才行。 我们来尝试 玩一下下面的任务吧! ##### 1. 先编辑一支会"睡着 500 秒"的程序: \[root@study \~\]# vim sleep500.sh #!/bin/bash /bin/sleep 500s /bin/echo "I have slept 500 seconds." ###### 2. 丢到背景中去执行,并且立刻登出系统: \[root@study \~\]# chmod a+x sleep500.sh \[root@study \~\]# nohup ./sleep500.sh \& \[2\] 14812 \[root@study \~\]# nohup: ignoring input and appending output to \`nohup.out' \<==会告知这个讯息! \[root@study \~\]# exit 如果你再次登陆的话,再使用 pstree 去查阅你的程序,会发现 sleep500.sh 还在执行中喔!并不会被中断掉! 这样了解意思了吗?由于 我们的程序最后会输出一个讯息,但是 nohup 与终端机其实无关了, 因此这个讯息的输出就会被导向" \~/nohup.out ",所以你才会看到上述 指令中,当你输入 nohup 后, 会出现那个提示讯息啰。 如果你想要让在背景的工作在你登出后还能够继续的执行,那么 使用 nohup 搭配 \& 是不错的运行情境喔! 可以参考看看! ### 注意事项: 这些工作所触发的程序必须来自于你 shell 的子程序(只管理自己 的 bash); 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground); 背景:可以自行运行的工作,你无法使用 \[ctrl\]+c 终止他,可使用 bg/fg 调用该工作; 背景中"执行"的程序不能等待 terminal/shell 的输入(input)