当前位置: 首页 > news >正文

Linux 守护进程

1.什么是守护进程
守护进程daemon指的是在后台运行的进程

2.前台任务和后台任务
前台任务:独占命令行窗口,运行完毕或手动终止,才能执行其他命令
以redis服务为例

redis-server

运行结果:
300946-20180625134517944-1853189793.png

300946-20180625134527168-849759936.png

中止服务或退出session(即服务器连接),就无法访问了
300946-20180625134534191-976308800.png

后台任务:中止服务或退出session后,进程仍能访问

redis-server&

运行结果:
300946-20180625134542355-854379665.png
300946-20180625134549309-1396947443.png

中止服务或退出session(即服务器连接)
运行结果:
300946-20180625134558344-443126473.png

在命令尾部加上符号&,启动的进程就会成为“后台任务”

对于前台任务,若要变为后台任务,可以现按Ctrl+z,然后执行bg命令(让最后一个执行的任务后台继续执行)
300946-20180625134606060-1394814827.png

3.后台任务的特点
1)继承当前session(服务器连接)的标准输出(stdout)和标准错误(stderr),因此任务的输出依然会在命令行下显示
2)不再继承当前session的标准输入(stdin),因此输入,没有作用

4.SIGHUP信号
SIGHUP信号的作用是终止收到该信号的进程
Linux退出session会发生以下操作:
1)用户准备退出session
2)系统向该session发出SIGHUP信号
3)session将SIGHUP信号发给所有子进程
4)子进程收到SIGHUP信号,自动退出

由上可知,前台任务会随着session的退出而退出,因为它收到了SIGHUP信号
当Shell的huponexit参数为off时,session退出的时候,不会把SIGHUP信号发给后台任务,因此后台任务不会随着session一起退出。

查看系统huponexit参数值:
300946-20180625134615399-1184557231.png

有的系统huponexit参数的值可能是on,所以更好的方法是使用disown命令,disown可以将指定任务从任务列表中移除,这样session就不会向她发出SIGHUP信号。
disown用法如下:

disown # 移除最近一个正在执行的后台任务
disown -r # 移除所有正在执行的后台任务
disown -a # 移除所有后台任务
disown -h # 不移除后台任务,但是让它们不会收到SIGHUP信号
disown %2 # 移除指定的后台任务

5.标准IO
disown后,如果退出session后,如果后台进程与标准IO有交互,它还是会挂掉
此时需要对后台任务的标准IO进行重定向。

redis-server > stdout.txt &

6.nohup命令
nohup命令比disown更方便,nohup命令作用如下:
1)阻止SIGHUP信号发到这个进程
2)关闭标准输入。该进程不再接受任何输入
3)重定向标准输出和标准错误到nohup.out

nohup将子进程与它所在的session分离了
nohup不会自动把进程变为“后台任务”,必须加上“&”符号

使用示例如下:

nohup redis-server &

7.Screen命令和Tmux命令
Screen和Tmux命令,可以实现在一个终端里,管理多个session
这样当当前session结束了,也不影响其他session,而且可以重新登录,再连上早先新建的session
使用示例如下:

$ screen
$ redis-server

按下ctrl+A和ctrl+D,可以回到原来的session
screen命令如下:

$ screen -S name

# 切回指定 session
$ screen -r name
$ screen -r pid_number

# 列出所有session
$ screen -ls

tmux功能类似,不再详述

8.Systemd管理工具
除了以上工具,Linux有还有一个守护进程管理工具Systemd,它是操作系统的一部分,直接与内核交互。
后续再详细研究。

相关文章:

  • 甲骨文解散Java Mission Control团队事件新进展
  • 内部类访问局部变量为什么要用final修饰
  • Java高级编程——选redis还是memcache,源码怎么说?
  • Python学习——文件操作和异常处理
  • radhat6.6上安装oracle12c RAC (三)
  • 复制cp 近半年【181天:2018-01-01至20180627 这段时间】图片到upoad目录下
  • javascript 中数组的创建 添加 与将数组转换成字符串 页面三种提交请求的方式...
  • Spark MLlib系列(二):基于协同过滤的电影推荐系统
  • spark-submit提交Spark Streamming+Kafka程序
  • Jmeter
  • linux使用--根目录空间不足,追加空间到根目录下
  • Java中有几种类型的流?以及常见的实现类都有哪些?
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • docker 系列之 配置阿里云镜像加速器
  • js 表
  • CODING 缺陷管理功能正式开始公测
  • DataBase in Android
  • java8-模拟hadoop
  • java取消线程实例
  • JDK 6和JDK 7中的substring()方法
  • JSONP原理
  • Making An Indicator With Pure CSS
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Vim 折腾记
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 多线程事务回滚
  • 记一次和乔布斯合作最难忘的经历
  • 前端性能优化--懒加载和预加载
  • 前端自动化解决方案
  • 学习笔记TF060:图像语音结合,看图说话
  • 国内开源镜像站点
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • 数据库巡检项
  • (2)Java 简介
  • (30)数组元素和与数字和的绝对差
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (LeetCode 49)Anagrams
  • (Ruby)Ubuntu12.04安装Rails环境
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置
  • .describe() python_Python-Win32com-Excel
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET企业级应用架构设计系列之开场白
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • [2019.3.20]BZOJ4573 [Zjoi2016]大森林
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Android 13]Input系列--获取触摸窗口
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [cocos creator]EditBox,editing-return事件,清空输入框
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟
  • [E链表] lc83. 删除排序链表中的重复元素(单链表+模拟)