关于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)

相关推荐
苹果醋320 分钟前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
梁诚斌1 小时前
VSOMEIP代码阅读整理(1) - 网卡状态监听
运维·服务器·网络
深情废杨杨1 小时前
服务器几核几G几M是什么意思?如何选择?
运维·服务器
康熙38bdc1 小时前
Linux 进程优先级
linux·运维·服务器
Web极客码1 小时前
常见的VPS或者独立服务器的控制面板推荐
运维·服务器·控制面板
hhzz1 小时前
Linux Shell编程快速入门以及案例(Linux一键批量启动、停止、重启Jar包Shell脚本)
android·linux·jar
只是有点小怂1 小时前
parted是 Linux 系统中用于管理磁盘分区的命令行工具
linux·运维·服务器
前端李易安2 小时前
Web常见的攻击方式及防御方法
前端
三枪一个麻辣烫2 小时前
linux基础命令
linux·运维·服务器
PythonFun2 小时前
Python技巧:如何避免数据输入类型错误
前端·python