Linux 进程 、线程

守护进程(daemon)

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

  • 系统日志进程syslogd
  • Web服务器httpd
  • 邮件服务器sendmail
  • 数据库服务器mysqld等

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

前台任务与后台任务

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

img

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

img

后台任务又如下特点:

  • 继承当前session的标准输出(stdout)和标准错误(stderr),因此如上图所示,后台任务的所有输出仍会同步的在命令行显示
  • 不再继承当前session的标准输入(stdin),无法向这个任务输入指令,如果它试图读取标准输入,就会暂停执行(halt)

SIGHUP信号

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

  1. 用户准备退出session
  2. 系统向改session发送SIGHUP信号
  3. session将SIGHUP信号发送给所有子进程
  4. 子进程收到SIGHUP信号后会自动退出

nohup

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

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

img

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

  • 忽略SIGHUP信号,因此当session关闭进程就不会退出
  • 关闭标准输入,该进程不再接收任何输入,即使运行在前台
  • 重定向标准输出和标准错误到文件nohup.out(默认情况,可以指定输出的文件)

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

supervisor

supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
supervisor管理进程是通过fork/exec的方式把被管理的进程当做子进程来启动,用户只需要在配置文件中将要管理的进程进行配置。