关于linux程序的查看、前台运行、后台运行、杀死的管理操作。

前言

在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)

相关推荐
gqkmiss13 分钟前
Chrome 浏览器 131 版本开发者工具(DevTools)更新内容
前端·chrome·浏览器·chrome devtools
Summer不秃19 分钟前
Flutter之使用mqtt进行连接和信息传输的使用案例
前端·flutter
旭日猎鹰23 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
Viktor_Ye29 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
hummhumm32 分钟前
第 25 章 - Golang 项目结构
java·开发语言·前端·后端·python·elasticsearch·golang
哎呦喂-ll32 分钟前
Linux进阶:环境变量
linux
耗同学一米八34 分钟前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题四
运维·网络
Rverdoser34 分钟前
Linux环境开启MongoDB的安全认证
linux·安全·mongodb
PigeonGuan44 分钟前
【jupyter】linux服务器怎么使用jupyter
linux·ide·jupyter