深入理解Linux系统中的前后台任务与守护进程

小白苦学IT的博客主页

初学者必看:Linux操作系统入门

代码仓库:Linux代码仓库

❤关注我一起讨论和学习Linux系统

1.前言

在Linux系统中,进程管理是至关重要的一个环节。其中,前后台任务和守护进程是进程管理中不可忽视的两个概念。前后台任务决定了进程与用户交互的方式,而守护进程则以其独特的运行方式,为系统提供稳定且持续的服务。本文将深入探讨Linux系统中的前后台任务与守护进程,帮助读者更好地理解和运用它们。

2.前后台任务的理解与体现

在Linux系统中,进程(process)是程序执行的实例,而任务(task)通常是指进程所要执行的具体工作。当我们谈到前后台任务时,我们实际上是在讨论进程与用户交互的方式以及它们在终端中的表现。

2.1前台任务

前台任务是指那些直接与终端交互的进程。当我们在终端中输入命令并按下回车键时,这个命令通常会作为一个前台任务启动。前台任务占据整个终端窗口,它的输出会直接显示在终端上,而任何需要用户输入的操作也会直接在终端上提示。前台任务通常需要用户的实时关注,因为它依赖于用户的输入来继续执行。

前台任务的一个显著特点是它会阻塞终端,这意味着当前台任务正在运行时,用户不能在同一终端窗口中启动其他任务。如果前台任务是一个长时间运行的操作,比如文件复制或大型程序的编译,用户可能需要等待它完成才能继续在终端中工作。

2.2后台任务

与前台任务不同,后台任务是在后台运行的进程,它们不与终端直接交互。后台任务通常通过在前台任务运行时按下Ctrl + Z暂停,然后使用bg命令将其放到后台继续执行。后台任务会释放终端的控制权,使得用户可以在同一终端窗口中启动其他任务。

后台任务的输出通常不会直接显示在终端上,而是可能被重定向到文件或其他地方。用户可以通过其他方式(如查看日志文件或使用特定命令)来检查后台任务的执行状态和结果。后台任务不依赖于用户的实时输入,它们可以在用户离开终端或执行其他任务时继续运行。

2.3前后台任务的切换与管理

下面我们用这样一段代码来进行测验:

我们将其运行起来之后,通过输入命令发现命令行没有反应:

以下我暂时把任务用进程的说法来说:原因在于,process这个进程运行之后成了前台进程,而bash进程(也就是我们输入命令的进程)自动被被=切换到了后台进程,而后台进程不能与用户交互,所以用户输入的命令会没有反应。如果我们要将process这个进程切换到后台,可以先ctrl+z,然后用bg命令将其切换到后台进程,此时bash进程会被自动切换到前台进程,因为前台只有一个进程并且必须都要有一个进程与用户进行交互,所以当前台进程(非bash进程)被切换时,那么处于后台的bash会直接被系统自动切换到前台。

下面我们把process这个进程输出的内容重定向到一个log.txt的文件中作为一个后台进程

上图中./process >> log.txt &  是将该进程输出的内容重定向到log.txt中以后台进程的方式执行任务,通过jobs可以查看后台进程的任务号,状态信息,fg 任务号是把指定任务号的后台进程切换到前台进程中执行,ctrl + z是把前台进程停下来,然后切换到后台进程,bash会自动切换到前台进程。

总结一下就是:

1.将前台任务转为后台任务

  • 使用Ctrl + Z组合键可以将正在运行的前台任务暂停并放到后台。此时任务处于暂停状态。
  • 使用bg命令可以将一个在后台暂停的命令变成在后台继续执行。

2.直接在后台启动任务

  • 在命令的后面添加&字符,可以在后台启动一个任务。这样即使关闭当前的终端,任务也会继续在后台运行。

3.查看后台任务

  • 使用jobs命令可以查看当前终端后台运行的任务。
  • 使用ps命令也可以查看后台运行的任务,但它显示的是系统中所有进程的状态,不仅仅是后台任务。

4.关闭后台任务

  • 要关闭后台任务,首先需要找到该任务的进程ID(PID),然后使用kill命令加上PID来终止任务。

如何理解前台任务只能有一个,而后台任务可以有多个  ?

在Linux系统中,前台任务只能有一个,而后台任务可以有多个,这主要基于终端交互和任务管理的需求。

首先,前台任务是与用户直接交互的任务,它独占命令行窗口。在大多数情况下,用户希望与一个任务进行实时的、专注的交互,而不是同时与多个任务交互,这可能导致混乱和效率下降。因此,系统限制一次只能有一个前台任务,确保用户可以与当前任务进行清晰、集中的交互。

其次,后台任务的设计是为了在用户不需要直接交互的情况下执行任务。后台任务可以在不干扰前台任务的情况下运行,并允许用户同时执行其他命令或任务。因此,多个后台任务可以同时运行,为用户提供更大的灵活性和多任务处理能力。

此外,从系统资源管理的角度来看,后台任务虽然运行在后台,但仍然占用系统资源。如果有过多的前台任务同时运行,可能会导致系统资源紧张,影响系统的稳定性和性能。而后台任务由于其非交互性质,可以更有效地共享和分配系统资源,避免资源冲突和浪费。   

Linux作为一个多用户、多任务的操作系统,允许多个用户同时登录并进行操作。

2.4进程组和任务的关系

任务其实是由进程组去完成,一个进程可以自成一组,任务会指派给进程组,多个任务在同一个session内启动的sid是一样的。

我们发现sid是29832,而我们通过查看该sid发现:

其实就是bash的id,所以这个session是被bash创建的,并以bash的pid作为sid.

3.理解session窗口

Session窗口在计算机领域中,特别是在Linux操作系统和某些应用框架(如Apache Flink)中,是指用户登录后拥有的一系列进程、窗口站、桌面和窗口的集合。这个集合代表了一个用户的工作站登录会话,是用户与系统进行交互的界面和平台。

故事时刻:

下面,我将通过一个简单的故事来解释Session窗口的概念:

在一个繁忙的图书馆里,每个读者都有一个专属的座位和书桌,这个座位和书桌就可以类比为一个Session窗口。当读者(用户)坐下来开始阅读或学习时,他们就进入了一个会话(Session)。在这个会话中,读者可以打开多本书(相当于打开多个应用程序或窗口),进行各种学习和研究活动。

假设一个读者(我们称他为小明)想要写一篇关于历史的论文。他坐下后,打开了他的电脑(登录系统,开始一个Session),并在桌面上打开了多个窗口:一个窗口用于浏览网页查找资料,另一个窗口用于编写论文,还有一个窗口用于与导师或同学交流讨论。这些窗口就构成了小明在这个Session中的工作环境。

在这个故事中,小明的座位和书桌(Session窗口)是他进行学习和工作的平台,而他在平台上打开的各种书籍和窗口则是他完成任务所需的工具和资源。就像在计算机中,用户通过Session窗口与系统交互,执行各种任务,打开和关闭应用程序,管理文件和资源。

值得注意的是,每个读者(用户)在图书馆都有自己的座位和书桌(Session窗口),互不干扰。同样,在计算机系统中,每个用户也有自己的Session窗口,保证了各自工作的独立性和安全性。

通过这个故事,我们可以更好地理解Session窗口的概念和作用:它为用户提供了一个独立、私有的工作环境,使用户能够高效、安全地执行各种任务。

每个用户通过一次登录会形成一个session,而我们知道Linux是一个多用户多进程的操作系统,所以必然可以多个用户同时登录,形成多个session窗口,该如何理解呢?

Linux操作系统可以有多个session窗口,这主要基于其多任务处理的特性和用户交互的需求。

首先,Linux作为一个多用户、多任务的操作系统,允许多个用户同时登录并进行操作。每个用户登录后,系统都会为其创建一个独立的session,这样每个用户都有自己独立的操作环境,互不干扰。每个session都包含了用户登录、执行命令、注销等一系列操作,具有持续性和独立性。

其次,即使对于单个用户,也可能需要同时管理多个任务或项目。在这种情况下,用户可以通过创建多个session窗口来分别处理这些任务。每个session窗口都可以看作是一个独立的终端环境,用户可以在不同的窗口中执行不同的命令或运行不同的程序。

此外,Linux中的session不仅仅局限于本地终端窗口,还可以通过远程连接(如SSH)创建远程session。这样,用户即使不在本地计算机前,也能通过远程session访问和管理Linux系统。

因此,Linux操作系统可以有多个session窗口,这为用户提供了极大的灵活性和便利性,使其能够同时处理多个任务或项目,提高工作效率。同时,多个session窗口的存在也保证了不同用户或任务之间的独立性,避免了相互干扰。

4.守护进程

4.1初识守护进程

我们日常玩的游戏当中,就拿王者荣耀来说吧,王者荣耀我们知道为什么会有人可以三更半夜还能玩这个游戏呢?其实是服务器24小时持续为我们提供服务的,而服务器24小时持续为我们提供服务的背后,与守护进程(Daemon)的运行机制有着密切的关系。守护进程是在计算机操作系统中以后台方式运行的长期进程,它负责执行一些特定的任务或提供某种服务。

守护进程的设计理念是为了在系统启动后,持续提供服务或执行任务,而不需要交互式用户干预。它们通常在系统启动时自动启动,并持续运行直到系统关闭或显式停止。这种长期运行的特性使得守护进程非常适合用于需要在后台持续运行的服务,如网络监听、文件同步、定时任务等。

服务器上的许多服务都是通过守护进程来实现的。例如,Web服务器软件(如Apache或Nginx)通常以守护进程的形式运行,监听网络请求并提供网页内容。数据库服务器(如MySQL或PostgreSQL)也会以守护进程的方式运行,处理数据库查询和存储数据。这些守护进程确保服务器能够持续、稳定地提供服务,满足用户的各种需求。

此外,守护进程还具有无人值守的特点,它们可以独立运行并完成其任务,无需用户的实时干预。这使得服务器能够在无人值守的情况下稳定运行,提供持续的服务。即使系统管理员不在现场,服务器也能通过守护进程继续提供服务,确保业务的连续性。

4.2守护进程与普通进程的区别

1.运行环境

  • 守护进程独立于用户的登录会话,可以在系统启动时自动运行,并持续在后台运行。
  • 普通进程则依赖于用户的操作或终端会话来启动和运行。

2.权限与特权

  • 守护进程通常以超级用户权限(root)运行,这意味着它们可以访问系统的各种资源和敏感信息。
  • 普通进程的权限通常受到用户的限制,无法执行一些需要特权的操作。

3.生命周期

  • 守护进程通常是长期驻留于内存中的,它们会在系统启动时被启动,并持续运行,直到系统关闭或管理员手动停止。
  • 普通进程的生命周期则通常与用户的操作或终端会话相关,当用户退出登录或关闭终端时,普通进程也会随之终止。

4.交互性

  • 守护进程是在后台运行的,它们通常没有控制台窗口,也不需要交互式的用户界面。它们的主要任务是执行后台任务或提供服务。
  • 普通进程则通常与用户进行交互,可能需要用户输入或向用户展示输出

5.任务与功能

  • 守护进程主要用于提供系统级的服务,如网络服务(如Web服务器、数据库服务器)、日志记录、定时任务调度等。
  • 普通进程则执行各种任务,其范围广泛,从简单的命令行工具到复杂的图形界面应用程序等。

6.独立性

  • 守护进程在系统级别运行,与特定用户无关,它们不会受到特定用户登录或注销的影响。
  • 普通进程则可能受到用户会话状态的影响。

4.3守护进程如何不受用户登录登出影响的?

守护进程是通过自行形成一个session窗口来实现不受用户登录登出影响的目标。在Linux系统中,守护进程是一种特殊的进程,它会在系统启动时开始运行,并在后台持续提供服务或执行任务。为了实现这一目标,守护进程需要脱离与用户终端的关联,确保用户的登录登出操作不会影响其运行。

具体来说,守护进程创建过程中会涉及一些关键步骤。首先,它会fork一个子进程并让父进程退出,这样子进程就会成为孤儿进程,被init进程接管。然后,子进程会调用setsid()函数创建一个新的会话,并成为该会话的领头进程。这个新的会话不再与原来的终端相关联,因此守护进程就脱离了终端的控制。

此外,守护进程还会更改当前工作目录到根目录,重设文件权限掩码,并关闭所有不必要的文件描述符,以确保其运行环境的独立性。这些步骤共同确保了守护进程能够在后台稳定运行,不受用户登录登出操作的影响。

因此,可以说守护进程是通过自行形成一个独立的session窗口来实现其特殊功能的。这个独立的session窗口使得守护进程能够与用户终端解耦,从而实现长时间、稳定地提供服务或执行任务的目标。

4.4编写守护进程代码

#include <iostream>
#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>const std::string nullfile = "/dev/null";void Daemon(const std::string & cwd="")
{//1.忽略其他异常信号signal(SIGCLD,SIG_IGN);signal(SIGPIPE,SIG_IGN);signal(SIGSTOP,SIG_IGN);//2.将自己变成独立的会话if(fork()>0){exit(0);}setsid();//3.更改当前调用进程的工作目录if(!cwd.empty())chdir(cwd.c_str());//4.标准输入,标准输出,标准错误重定向到/dev/nullint fd = open(nullfile.c_str(),O_RDWR);if(fd > 0){dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}
}

只需要在启动服务之前,调用该函数就可以使进程变成守护进程自动形成要给会话在后台运行,如果想终止守护进程,那么只需要通过kill -9 进程pid来终止该守护进程。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云云效CI/CD配置

1.NODEJS项目流水线配置(vue举例) nodejs构建配置 官方教程 注意:下图的dist是vue项目打包目录名称,根据实际名称配置 # input your command here cnpm cache clean --force cnpm install cnpm run build 主机部署配置 rm -rf /home/vipcardmall/frontend/ mkdir -p /home/…

刷题之Leetcode707题(超级详细)

707.设计链表 力扣题目链接(opens new window)https://leetcode.cn/problems/design-linked-list/ 题意&#xff1a; 在链表类中实现这些功能&#xff1a; get(index)&#xff1a;获取链表中第 index 个节点的值。如果索引无效&#xff0c;则返回-1。addAtHead(val)&#x…

Day37代码随想录(1刷) 动态规划

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n …

外包干了17天,技术倒退明显

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

局域网tcp通信实验

两台windows系统计算机简单TCP通信测试_两台计算机tcp通信-CSDN博客 使用这篇文章的小工具。 环境&#xff1a; 我和同学的两台笔记本电脑。 使用我的手机开热点&#xff0c;两台电脑连接热点。 我的&#xff1a; IPv4 地址 . . . . . . . . . . . . : 192.168.92.79 子…

Day04-SHELL自动化编程-循环与颜色函数库

Day04-SHELL自动化编程-循环与颜色函数库 11. 必知必会核心命令11.1 命令概述11.7 案例11.8 小结 12 Shell编程-循环12.1 循环概述12.2 for循环1&#xff09;最常用的for循环格式2&#xff09;c语言格式for循环3&#xff09;for循环格式及应用场景4&#xff09;案例 12.3 while…

【WSN覆盖优化】基于灰狼优化算法的无线传感器网络覆盖 GWO-WSN覆盖优化【Matlab代码#74】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 灰狼优化算法2. WSN节点感知模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 灰狼优化算法 此处略。 2.…

【Java8新特性】四、强大的Stream api

​ 这里写自定义目录标题 一、了解Stream二、流(stream)到底是什么&#xff1f;三、Stream操作的三个步骤四、创建Stream的四种方式五、Stream 的中间操作1、筛选和切片2、map 映射3、排序 六、Stream 的终止操作1、查找和匹配2、归约3、收集 一、了解Stream Stream是Java8中…

spring容器

spring容器 实现方式 spring中提供了各式各样的IOC容器的实现供用户选择和使用&#xff0c;使用什么样的容器取决于用户的需要 BeanFactory 该接口是最简单的容器&#xff0c;提供了基本的DI支持。最常用的BeanFactory实现是XmlBeanFactory类&#xff0c;根据XML文件中的定义加…

idea常用配置

IDEA设置全局配置 参考&#xff1a;IDEA设置全局配置_idea如何打开一个项目,全局设置-CSDN博客 idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文件夹等不必要的文件 参考&#xff1a;idea提交代码到git或svn上时&#xff0c;怎么忽略.class、.iml文件和文…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践&#xff1a;去哪儿旅游数据爬取指南 在这个博客中&#xff0c;我们将探索如何使用 Python 来进行网络数据抓取&#xff0c;并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取&#xff0c;从而获取旅游…

软件详细设计说明书(套用案例)

2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4设计目标 2.5.1总体原则 2.5.2实用性和先进性 2.5.3标准化、开放性、兼容性 2.5.4高可靠性、稳定性 2.5.5易用性 2.5.6灵活性和可扩展性 2.5.7经济性和投资保护 3系统功能模块详细设计 3.1个人办公…

一键下载 M3U8 并转换为 MP4升级版

之前的下载 M3U8程序&#xff0c;有很多问题&#xff0c; 为此做了一些升级&#xff0c;分享给大家。 增加了存在播放列表的情况处理播放列表路径和ts路径错误问题多线程问题对于电视剧多文件下载的处理 这里从网上找了一部的链接&#xff0c;可以参考这个网站https://www.zu…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …

全光谱台灯哪个牌子好,2024全光谱护眼台灯推荐

近年来&#xff0c;全光谱台灯悄然跻身于家庭必备品之列&#xff0c;赢得了众多消费者的好评。它们以减轻眼睛疲劳的功效而受到推崇&#xff0c;尽管也有声音质疑其实际效用&#xff0c;认为所谓的益处不过是一种心理安慰。面对这些相互矛盾的观点&#xff0c;许多消费者感到困…

Java数据结构二叉树

概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&#xff1a; 1. 或者为空 2. 或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 从上图可以看出&#xff1a; 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分&#xff0c;次序不能颠倒&#x…

【QingHub】EMQX单节点一键部署

EMQX 简介 EMQX是全球最具扩展性的开源MQTT 代理&#xff0c;具有高性能&#xff0c;可在 1 个集群中连接 1 亿多个 IoT 设备&#xff0c;同时保持每秒 100 万条消息的吞吐量和亚毫秒级的延迟。 EMQX 支持MQTT、HTTP、QUIC、WebSocket等多种开放标准协议。它 100% 符合MQTT 5.…

【氧化镓】β-Ga2O3肖特基势垒二极管的缺陷识别

本文是一篇关于β-Ga2O3肖特基势垒二极管在电子辐射和退火调节下缺陷识别的研究。文章首先介绍了β-Ga2O3作为一种高性能器件材料的重要性&#xff0c;然后详细描述了实验方法&#xff0c;包括样品制备、电子辐照、热退火处理以及电学特性和深能级瞬态谱&#xff08;DLTS&#…

Java快速入门系列-7(测试与调试)

第七章:测试与调试 第7章:测试与调试7.1 单元测试(JUnit)7.1.1 为什么要进行单元测试7.1.2 JUnit基础7.1.3 断言7.1.4 测试套件7.2 集成测试与系统测试7.2.1 集成测试7.2.2 系统测试7.3 调试技巧与工具7.3.1 断点7.3.2 单步执行7.3.3 变量检查7.3.4 条件断点7.3.5 日志记录…