【Linux】Linux任务管理与守护进程

Linux任务管理与守护进程

  • 一、任务管理
    • 1、进程组概念
    • 2、作业概念
    • 3、会话概念
    • 4、相关操作
      • (1)前台进程&后台进程
      • (2)jobs、fg、bg、kill
    • 5、ps命令查看指定的选项
  • 二、守护进程
    • 1、守护进程的概念
    • 2、守护进程的查看
    • 3、守护进程的创建
    • 4、调用daemon函数创建守护进程
    • 5、模拟实现daemon函数


一、任务管理

1、进程组概念

每个进程除了有一个进程ID之外,还属于一个进程组,进程组是一个或多个进程的集合。

通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程。组长进程的标识是,其进程组ID等于其进程ID。组长进程可以创建一个进程组,创建该组中的进程,然后终止。

需要注意的是,只要在某个进程组中有一个进程存在,则该进程组就存在,这与其组长进程是否终止无关

2、作业概念

Shell分前后台来控制的不是进程而是作业(Job)或者进程组(Process Group)

一个前台作业可以由多个进程组成一个后台作业也可以由多个进程组成Shell可以运行一个前台作业和任意多个后台作业,这称为作业控制

作业与进程组的区别
如果作业中的某个进程又创建了子进程,则子进程不属于作业一旦作业运行结束,Shell就把自己提到前台,如果原来的前台进程还存在,也就是这个被创建的子进程还没有终止,那么它将自动变为后台进程组。

3、会话概念

**会话(Session)**是一个或多个进程组的集合。

一个会话可以有一个控制终端,这通常是登录到其上的终端设备(在终端登录情况下)或伪终端设备(在网络登录情况下)。建立与控制终端连接的会话首进程被称为控制进程。一个会话中的几个进程组可被分为一个前台进程组以及一个或多个后台进程组。所以一个会话中,应该包括控制进程(会话首进程),一个前台进程组和任意多个后台进程组

我们用一个死循环函数
在这里插入图片描述
我们将mytest1和mytest2放到后台运行,将mytest3、mytest4和mytest5放到前台运行。
在这里插入图片描述

其中mytest1与mytest2属于同一个后台进程组,mytest3、mytest4和mytest5属于同一个前台进程组,而Shell本身属于一个单独的进程组。
在这里插入图片描述

这些进程组的控制终端相同,它们同属于一个会话,当用户在控制终端输入特殊的控制键(如Ctrl+C产生SIGINT,Ctrl+\产生SIGQUIT,Ctrl+Z产生SIGTSTP),内核就会发送相应的信号给前台进程组中的所有进程。
在这里插入图片描述

4、相关操作

(1)前台进程&后台进程

直接运行某一可执行程序,例如./可执行程序,此时默认将程序放到前台运行,在前台运行的进程的状态后有一个+号,例如R+。
在这里插入图片描述

运行可执行程序时在后面加上&,可以指定将程序放到后台运行,例如./可执行程序 &,在后台运行的进程的状态后没有+号。
而后台进程是会有提示符的【1】 25728
其中[1]是作业的编号,如果同时运行多个作业可以用这个编号进行区分,25728是该作业中某个进程的id(一个作业可以由多个进程组成)。
在这里插入图片描述

我们创建4个进程都是后台进程看一下,这样子就有4个作业了:此时我们就可以将它们分别叫做当前终端下的1号作业、2号作业、3号作业和4号作业。
在这里插入图片描述

(2)jobs、fg、bg、kill

使用jobs命令,可以查看当前会话当中有哪些作业。

在这里插入图片描述
使用fg命令(foreground)可以将某个作业提至前台运行,如果该作业正在后台运行则直接提至前台运行,如果该作业处于停止状态,则给进程组的每个进程发SIGCONT信号使它继续运行并提至前台。fg 作业序号
由于1号作业被提至前台运行,所以其运行状态也由R变成了R+
在这里插入图片描述
很多朋友会好奇,那么死循环了以后我知道,为什么命令行解释器用不了了?我们解释一下:前台进程只能有一个,当一个进程变成前台进程后,bash会自动变为后台进程,此时bash就无法进行命令行解释了。
在这里插入图片描述

将一个前台进程放到后台运行可以使用Ctrl+Z,但使用Ctrl+Z后该进程就会处于停止状态(Stopped)

在这里插入图片描述
使用bg命令,可以让某个停止的作业在后台继续运行(Running),本质就是给该作业的进程组的每个进程发SIGCONT信号。
在这里插入图片描述

kill命令是杀死后台进程
先通过jobs确定作业号码,再kill +%作业号码将相对应的后台进程杀死。
在这里插入图片描述

5、ps命令查看指定的选项

使用ps命令时携带-o选项,可以查看指定的信息。
ps -o comm,pid,ppid,pgrp,session,tpgid
在这里插入图片描述

当我们用Xshell或是终端登录时,本质都是先创建一个bash进程,整体称之为一个会话(所有的命令行的进程都是bash的子进程),所有的命令行启动的任务都是在对应的会话内运行的。

实际我们每一次登录的过程都是新建会话的过程,同一个会话中的所有进程的SESS是相同的。
在这里插入图片描述
ps命令是一个系统级的命令,该命令能查看所有进程的信息,例如ps axj,只不过-o选项只查看当前会话的进程信息。

二、守护进程

1、守护进程的概念

守护进程也称精灵进程(Daemon),是运行在后台的一种特殊进程,它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

守护进程是一种很有用的进程,Linux的大多数服务器就是用守护进程实现的,比如Internet服务器inetd,Web服务器httpd等。同时守护进程完成许多系统任务,比如作业规划进程crond等。

Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和用户交互。其他进程都是在用户登录或运行程序时创建,在运行结束或用户注销时终止,但系统服务进程不受用户登录注销的影响,它们一直在运行着,这种进程有一个名称叫守护进程(Daemon)

2、守护进程的查看

我们可以用ps axj命令查看系统中的进程:

  • 参数a表示不仅列出当前用户的进程,也列出所有其他用户的进程
  • 参数x表示不仅列出有控制终端的进程,也列出所有无控制终端的进程
  • 参数j表示列出与作业控制相关的信息

凡是TPGID一栏写着-1的都是没有控制终端的进程,也就是守护进程。

在这里插入图片描述
在COMMAND一列用[ ]括起来的名字表示内核线程,这些线程在内核里创建,没有用户空间代码,因此没有程序文件名和命令行,通常采用以k开头的名字,表示Kernel。

  • udevd负责维护/dev目录下的设备文件。
  • acpid负责电源管理。
  • syslogd负责维护/var/log下的日志文件。

3、守护进程的创建

守护进程的创建步骤如下:

  1. 设置文件掩码为0。
  2. fork后终止父进程,子进程创建新会话。
  3. 忽略SIGCHLD信号。
  4. 再次fork,终止父进程,保持子进程不是会话首进程,从而保证后续不会再和其他终端相关联。
  5. 更改工作目录为根目录。
  6. 将标准输入、标准输出、标准错误重定向到/dev/null。

说明:

  1. 将文件掩码设置为0,保证后续守护进程创建文件时,创建出来的文件的权限符合我们的预期。
  2. 调用setsid创建新会话的目的,是让当前进程自成会话,与当前bash脱离关系(创建守护进程的核心)。
  3. 调用setsid创建新会话时,要求调用进程不能是进程组组长,但是当我们在命令行上启动多个进程协同完成某种任务时,其中第一个被创建出来的进程就是组长进程,因此我们需要fork创建子进程,让子进程调用setsid创建新会话并继续执行后续代码,而父进程我们直接让其退出即可。
  4. 守护进程不能直接和用户交互,也就没有必要再打开某个终端了,而打开一个终端需要你是会话首进程,为了防止守护进程打开终端,我们需要再次fork创建子进程并让子进程继续执行后续代码,由于子进程不是会话首进程,也就没有能力打开其他终端了,而父进程我们直接让其退出即可。(这是一种防御性编程,该操作不是必须的)
  5. 我们一般会将守护进程的工作目录设置为根目录,便于让守护进程以绝对路径的形式访问某种资源。(该操作不是必须的)
  6. 守护进程不能直接和用户交互,也就是说守护进程已经与终端去关联了,因此一般我们会将守护进程的标准输入、标准输出以及标准错误都重定向到/dev/null,/dev/null是一个字符文件(设备),通常用于屏蔽/丢弃输入输出信息。(该操作不是必须的)

运行代码,用ps命令查看该进程,会发现该进程的TPGID为-1,TTY显示的是?,也就意味着该进程已经与终端去关联了。
其次,我们还可以看到该进程的PID与其PGID和SID是不同的,也就是说该进程既不是组长进程也不是会话首进程。
在这里插入图片描述
此外,我们还可以看到该进程的SID与bash进程的SID是不同的,即它们不属于同一个会话。

在这里插入图片描述

通过ls /proc/进程id -al命令,可以看到该进程的工作目录已经成功改为了根目录。
在这里插入图片描述

通过ls /proc/进程id/fd -al命令,可以看到该进程的标准输入、标准输出以及标准错误也成功重定向到了/dev/null。

在这里插入图片描述

4、调用daemon函数创建守护进程

实际当我们创建守护进程时可以直接调用daemon接口进行创建,daemon函数的函数原型如下:

int daemon(int nochdir, int noclose);
  • 如果参数nochdir为0,则将守护进程的工作目录该为根目录,否则不做处理。
  • 如果参数noclose为0,则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null,否则不做处理。

调用实例:

#include<unistd.h>
int main()
{
	daemon(0, 0);
	while(1);
	return 0;
}

调用daemon函数创建的守护进程与我们原生创建的守护进程差距不大,唯一区别就是daemon函数创建出来的守护进程,既是组长进程也是会话首进程。也就是说系统实现的daemon函数没有防止守护进程打开终端,因此我们实现的反而比系统更加完善.
在这里插入图片描述

5、模拟实现daemon函数

有了上述创建守护进程的代码,要模拟实现daemon函数就很容易了,我们只需要设置两个参数nochdir和noclose,当所给nochdir为0时,我们将守护进程的工作目录该为根目录,当所给noclose为0时,我们则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null即可。

#include <fcntl.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
void my_daemon(int _chdir, int _close)
{
    // 1、设置掩码为0
    umask(0);

    // 2、fork后终止父进程,子进程创建新会话
    pid_t id = fork();
    if(id > 0)
    {
        // father
        exit(0);
    }
    setsid(); // 子进程创建新会话
    // 3、忽略SIGCHLD信号
	signal(SIGCHLD, SIG_IGN);
    // 4、再次fork,终止父进程,保持子进程不是会话首进程,从而保证后续不会再和其他终端相关联。
    if(fork() > 0)
    {
        // father
        exit(0);
    }
    // 5、更改目录
    if(_chdir == 0)
        chdir("/");
    // 6、将标准输入、标准输出、标准错误重定向到/dev/null
    if(_close == 0)
    {
        close(0);
        int fd = open("/dev/null", O_RDWR);
        dup2(fd, 1);
        dup2(fd, 2);
    }  
}
int main()
{
    my_daemon(0, 0);
    while(1);
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/349519.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

支付宝AES如何加密

继之前给大家介绍了 V3 加密解密的方法之后&#xff0c;今天给大家介绍下支付宝的 AES 加密。 注意&#xff1a;以下说明均在使用支付宝 SDK 集成的基础上&#xff0c;未使用支付宝 SDK 的小伙伴要使用的话老老实实从 AES 加密原理开始研究吧。 什么是AES密钥 AES 是一种高级加…

2.依附弹窗(AttachListPopup)

愿你出走半生,归来仍是少年&#xff01; 环境&#xff1a;.NET 7 基于基础的Popup对象实现的依附于某个控件的弹窗&#xff0c;弹窗可呈现数组对象&#xff0c;达到较好的选择交互效果。 1.布局 通过Border实现圆角边框轮廓&#xff0c;然后通过内部的ListView实现列表展示。…

Cesium数据加载

文章目录 0.引言1.影像加载1.1Bing地图1.2天地图1.3ArcGIS在线地图1.4高德地图1.5OSM影像1.6MapBox影像 2.OGC地图服务2.1WMS2.2WMTS2.3TMS 3.GeoJSON数据加载4.KML数据加载5.TIFF数据加载6.点云数据加载7.地形数据加载7.1在线地形数据加载7.2本地地形数据加载 8.倾斜摄影模型数…

xcode 设置 ios苹果图标,为Flutter应用程序配置iOS图标

图标设置 1,根据图片构建各类尺寸的图标2.xcode打开ios文件3.xcode设置图标4.打包提交审核,即可(打包教程可通过我的主页查找) 1,根据图片构建各类尺寸的图标 工具网址:https://icon.wuruihong.com/ 下载之后文件目录如下 拷贝到项目的ios\Runner\Assets.xcassets\AppIcon.ap…

没有外网Nginx如何配置如何开启https

判断是否支持open-ssl 在服务器执行如下命令 openssl version没有则安装open-ssl&#xff0c;由于服务器没有外网&#xff0c;可以离线安装openssl-3.0.1.tar.gz&#xff0c;我是在有网的服务器直接下载的&#xff0c;然后再上传到这台无网的服务器上 wget https://www.open…

HttpClient的使用与封装

HttpClient的使用与封装 配置 首先,我们要引入maven依赖 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version></dependency>这里可以单独引入,如果我…

linux操作系统网络编程套接字(实现一个udp通讯demo)

文章目录 理解源IP地址和目的IP地址认识端口号理解 "端口号" 和 "进程ID理解源端口号和目的端口号 认识TCP协议认识UDP协议什么是面向字节流和面向数据报流以及有无连接是什么意思 网络字节序socket编程接口socket 常见APIsockaddr结构sockaddr_in 结构in_addr结…

下载大文件时内存溢出情况分析解决

基于SpringBoot和阿里的OSS实现了一个下载文件的功能。 大概原理是这样的&#xff1a; 用户请求下载资源&#xff0c;服务端接收到请求之后从OSS中将用户需要的资源捞出来&#xff0c;然后以流的方式写给客户端。 遇到一个这样的问题&#xff1a; 下载小文件没有问题&#…

【C语言刷题系列】水仙花数的打印及进阶

1.水仙花数问题 水仙花数&#xff08;Narcissistic number&#xff09;也被称为超完全数字不变数&#xff08;pluperfect digital invariant, PPDI&#xff09;、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数&#xff08;Armstrong number&#xff09; 水仙花数是指一个 3 位数&a…

去中心化人工智能迸发应用潜力,或给 Web3 带来无限畅想

​ 原文&#xff1a;https://www.caseycaruso.com/thoughts/decentralized-ai 作者&#xff1a;Casey&#xff5c;Paradigm 投资合伙人 编译&#xff1a;TinTinLand 编者注&#xff1a;本文对于去中心化 Web3 技术和人工智能领域之间的交叉应用进行了梳理&#xff0c;并列举了…

springboot130社团管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

什么是框架 确定伦敦金的框架为何重要?

在伦敦金投资中&#xff0c;我们要进行分析或者交易&#xff0c;都要将伦敦金走势置于一个框架内。什么才是框架呢&#xff1f;笔者认为&#xff0c;在当前伦敦金走势的上方和下方画出支撑阻力位&#xff0c;这就是框架。但我们要注意框架得能够立得起来&#xff0c;那才算是好…

理顺 QR 分解算法

咱们网站的这个公式编辑器&#xff0c;估计是后台生成图片后贴回来的&#xff0c;固定分辨率而且分辨率不高。 还不如先离线 latex 生成 pdf 后再截图上来 1. Why QR When A and b are known, to solver the minimization of , where . The reduction of A to various canoni…

Spring5学习笔记

Spring5 框架概述IOC(Inversion Of Control)IOC基本过程:IOC接口(BeanFactory)IOC接口实现类IOC操作Bean管理一、什么是Bean管理?二、什么是DI?三、Bean管理的两种实现方式1.基于XML配置文件方式实现基于XML方式创建对象基于XML方式注入属性常规属性注入特殊属性值的注入…

文本检索性能提升 40 倍,Apache Doris 倒排索引深度解读

在 OLAP 领域&#xff0c;Apache Doris 已成为高性能、高并发以及高时效性的代名词。在面向海量数据的复杂查询需求时&#xff0c;除硬件配置、集群规模、网络带宽等因素外&#xff0c;提升性能的核心在于如何最大程度地降低 SQL 执行时的 CPU、内存和 IO 开销&#xff0c;而这…

记 Rxjava zip操作符遇到的问题

在项目中遇到了类似下面这样的代码 本意是希望当zip操作符中三个Observable执行完毕之后&#xff0c;将他们返回的数据统一进行处理 Observable.zip(startFirst(), startSecond(), startThird(),(first, second, third) -> {Log.i("Rxjava", "handle all dat…

外包干了一个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入南京某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

基于springboot+vue旅游网站

摘要 旅游网站的开发是一个综合性的项目&#xff0c;涉及到前端和后端的技术&#xff0c;而基于Spring Boot和Vue.js的组合是一种常见的选择&#xff0c;因为它们可以很好地配合&#xff0c;提供高效且现代化的开发体验。首先&#xff0c;我们使用Spring Boot作为后端框架。Spr…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。

Ansible自动化运维(三)Playbook 模式详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…