原理

守护进程(daemon)

守护进程是一类在后台运行的特殊进程,用于执行特定的系统任务。他独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。Linux系统的大多数服务器就是通过守护进程实现的。

常见的守护进程包括:

系统日志进程syslogd

Web服务器httpd

邮件服务器sendmail

数据库服务器mysqld等

守护进程一般在系统启动时开始运行,除非强行终止,否则会持续运行知道系统关机,通常以超级用户(root)权限运行。

前台任务与后台任务

假如有个简单的go的web服务器程序,使用如下方式启动,称为前台任务。独占了命令窗口,只有运行完了或手动终止(Ctrl+C),才能执行其他命令。

如果以如下方式,在命令结尾加上符号&,启动的进程就会称为后台任务。

后台任务又如下特点:

继承当前session的标准输出(stdout)和标准错误(stderr),因此如上图所示,后台任务的所有输出仍会同步的在命令行显示

不再继承当前session的标准输入(stdin),无法向这个任务输入指令,如果它试图读取标准输入,就会暂停执行(halt)

SIGHUP信号

变为后台任务并不代表进程成为了守护进程,因为当session关闭后,后台任务就会终止。Linux系统终端session退出流程如下:

用户准备退出session

系统向改session发送SIGHUP信号

session将SIGHUP信号发送给所有子进程

子进程收到SIGHUP信号后会自动退出

nohup

nohup 是后台作业的意思, nohup运行的进程将会忽略终端信号运行。即后台运行一个命令。nohup COMMAND & 用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响它的运行。

使用nohup命令的方式可以启动一个守护进程,如下图所示:

nohup命令对进程做了如下操作:

忽略SIGHUP信号,因此当session关闭进程就不会退出

关闭标准输入,该进程不再接收任何输入,即使运行在前台

重定向标准输出和标准错误到文件nohup.out(默认情况,可以指定输出的文件)

nohup不会自动把进程变为后台任务,所以必须加上&。

supervisor

supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

supervisor管理进程是通过fork/exec的方式把被管理的进程当做子进程来启动,用户只需要在配置文件中将要管理的进程进行配置。

结构

supervisor主要由Supervisord、Supervisorctl、Web server和XML-RPC interface组成:

supervisord:主进程,负责管理进程的server,它会根据配置文件创建指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等。同时通过内置web server和XML-RPC Interface可以轻松实现进程管理。

supervisorctl:管理client,用户通过命令行发送消息给supervisord,可以查看进程状态,加载配置文件,启停进程,查看进程标准输出和错误输出,远程操作等。

Web server:superviosr提供了web server功能,可通过web控制进程。

XML-RPC interface: XML-RPC接口,提供XML-RPC服务来对子进程进行管理和监控。

macOS环境安装使用

安装并启动

$ brew install supervisor

$ brew services start supervisor

创建配置目录和配置文件

默认的配置文件路径为/usr/local/etc/supervisord.conf,查看该文件可以看到如下内容:

$ tail -n2 /usr/local/etc/supervisord.conf

[include]

files = /usr/local/etc/supervisor.d/*.ini

可以看到include了/usr/local/etc/supervisor.d/目录下的.ini文件,因此我们需要创建改目录,然后对要管理的进程或进程组创建对应的.ini格式的配置文件

$ mkdir -pv /usr/local/etc/supervisor.d

$ vim /usr/local/etc/supervisor.d/myserver.ini

编辑配置文件内容如下:

[program:server]

process_name=%(program_name)s_%(process_num)02d

command=/usr/local/go/bin/go run /Users/harryzhang/go/src/server/server.go # 要执行的命令

autostart=true # 系统开机自动启动

autorestart=true # 进程终止自动重启

user=harryzhang # 用户

numprocs=1 # 启动进程数

redirect_stderr=true # 是否将标准错误重定向到标准输出

stdout_logfile=/Users/harryzhang/go/src/server/server.log # 指定标准输出保存的文件路径

重启supervisor

编辑好配置文件后重启supervisor就可以生效,可以使用supervisorctl命令查看和管理进程状态。

$ brew services restart supervisor

Stopping `supervisor`... (might take a while)

==> Successfully stopped `supervisor` (label: homebrew.mxcl.supervisor)

==> Successfully started `supervisor` (label: homebrew.mxcl.supervisor)

$ supervisorctl status

server:server_00 RUNNING pid 41382, uptime 0:00:04

如果指定的命令执行没有异常,会看到进程已处于运行状态,如果没有处于运行状态,可以查看日志文件,可能为命令执行出错直接退出了。

参考

linux下进程管理的原理,Linux进程管理:supervisor和nohup原理及使用相关推荐

  1. linux父进程中显示子进程pid,请教linux下c语言函数fork父进程打印子进程的PID

    请教linux下c语言函数fork父进程打印子进程的PID 关注:296  答案:2  信息版本:手机版 解决时间 2019-01-14 04:55 雨不眠的下 2019-01-13 12:23 用于 ...

  2. python将Linux下使用top命令获取的进程信息进行分析做可视化展示

    python将Linux下使用top命令获取的进程信息进行分析做可视化展示 版本 版本 作者 日期 备注 v1.0 ZY 2020.11.10 初版完成 文章目录 python将Linux下使用top ...

  3. linux下如何批量杀进程,Linux下如何批量Kill多个进程

    你知道Linux下如何批量Kill多个进程吗?灵活使用linux系统对于我们的学习和日常工作是非常重要的,那么下面我们就跟爱站小编一起去看看Linux下批量Kill多个进程的方法. ps -ef|gr ...

  4. linux格式化大于2t硬盘分区,linux下大于2tb硬盘格式化及挂载,linux下大于2t的分区方法,linux gpt分区表 管理 自动挂载分区...

    linux下大于2tb硬盘格式化及挂载,linux下大于2t的分区方法,linux gpt分区表 管理 自动挂载分区 (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找 ...

  5. Linux下eMMC,SD卡格式化和分区管理

    Linux下eMMC,SD卡格式化和分区管理 一.Linux下查看eMMC设备是否正确识别 在命令行终端,输入ls /dev/mmc* -l,查看eMMC是否成功识别 dev目录下成功识别到了eMMC ...

  6. linux环境下ps命令行,Linux下ps命令详解 Linux下ps命令的详细使用方法

    Linux下ps命令详解 Linux上进程有5种状态:1. 运行(正在运行或在运行队列中等待) 2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号) 3. 不可中断(收到信号不唤醒和不可运 ...

  7. linux 下查看应用版本信息,Linux下查看版本信息

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等. 1.# uname -a   (Linux查看版本当前操作系统内核信息) 2.# cat /proc/vers ...

  8. linux下能运行python,(转)Linux下运行python

    原文: http://blog.csdn.net/jackywgw/article/details/48847187 在linux命令行下运行python,可以直接输出hello world jack ...

  9. linux下查看文件的权限,Linux下查看文件权限、修改文件权限的方法

    查看权限命令查看目录的相关权限可以采用命令ls -lD,或者直接用ls -la 如 ls -l www.jb51.net  //这里表示查看www.jb51.net目录 修改权限命令 chmod 77 ...

  10. linux下的zz命令,[zz]Linux下压缩命令

    一.Linux下和windows下的压缩文件的几个说明 在Windows下最常见的压缩文件就只有两种,一是,zip,另一个是.rar.可是Linux就不同了,它有.gz..tar.gz.tgz. bz ...

最新文章

  1. university, school, college, department, institute的区别
  2. python运行py文件参数错误_Pycharm运行加载文本出现错误的解决方法
  3. [PAT乙级]1020 月饼
  4. zabbix server监控项报警提示:“Zabbix discoverer processes 75% busy”
  5. 经验 | 深度学习中从基础综述、论文笔记到工程经验、训练技巧
  6. 语言速算24点的小窍门_2-3岁宝宝是语言发育引导期,对话式朗读促进表达,3招养出演讲家...
  7. html5如何将4张照片排列,如何将多张图片排列在一张图片呢?学会这两种技巧,轻松搞定...
  8. 输入1-53周,输出1-53周的开始时间和结束时间
  9. rand()函数实现原理:线性同余法
  10. (Python编程)稳定的copra算法(copra-ep)
  11. springcloud实战一:搭建springboot
  12. 边走边拍───南极三岛之行
  13. python(分隔符)
  14. c++避坑指南-除数为0
  15. ftp指令及响应代码 (不能说一个不剩,只能说超详细)
  16. 全球及中国玄武岩纤维市场竞争格局分析及发展前景预测报告2022-2028年版
  17. 2018春考计算机技能考试题目,(完整版)2018年山东春季高考技能考试信息技术类专业考试样题...
  18. HTML层叠样式表(CSS)
  19. 虚拟机下 linux 大小写切换失效 Bug(vmware 15.5.5 导致)
  20. python文本情感分析:SnowNLP的应用---案例

热门文章

  1. 9行Python代码实现自动抠图 别再自己抠图啦
  2. 计算机的存储器(详解)
  3. adb安装apk失败解决办法
  4. 【水果识别】柑橘质量检测及分级系统【含GUI Matlab源码 738期】
  5. 纪念日或者悼念日 网站改为灰白模式
  6. 【答学员问】面试问题-毕业时候为什么没有选择开发
  7. 通过网线连接获取树莓派的ip地址
  8. 呼叫中心管理之:让座席看见自己
  9. windows系统使用cmd命令打开谷歌浏览器并设置用户资料方法步骤
  10. 信息传播( information diffusion )