为什么启动后台程序需要使用nohup

栏目: IT技术 · 发布时间: 4年前

内容简介:在linux服务器上,启动程序时在尾部添加当终端退出后,该终端启动的后台程序也原因是终端退出后,该终端启动的后台程序会收到SIGHUP信号。如果后台程序内部没有处理SIGHUP信号,SIGHUP信号的默认处理行为是停止程序运行。

linux 服务器上,启动程序时在尾部添加 & ,可以把程序丢到后台运行。

当终端退出后,该终端启动的后台程序也 可能 会停止运行。

原因是终端退出后,该终端启动的后台程序会收到SIGHUP信号。如果后台程序内部没有处理SIGHUP信号,SIGHUP信号的默认处理行为是停止程序运行。

为什么 后台程序可能会停止运行 我用了 可能 两个字呢?因为我在实验时发现这和终端环境有关系。

当我使用一台终端配置的比较完善的mac电脑(安装了iterm,zsh,tmux等一堆乱七八糟的东西)去操作远程服务器时,我发现退出终端后,终端启动的后台程序并没有退出。为了进一步验证,我在关闭终端后,重新打开终端,在本地使用netstat和ps命令查看,发现和远程服务器的连接依然保持存在。

而当我使用一台比较原始的mac电脑去操作远程服务器时,我发现退出终端后,终端启动的后台程序也停止了。

为了避免终端退出时后台程序也停止运行,可选择使用如下几种方式:

  • 在后台程序内部编写处理SIGHUP信号的代码
  • 将后台程序编写为daemon守护进程
  • 使用nohup命令启动我们的后台程序

nohup官网地址: http://www.gnu.org/software/coreutils/manual/html_node/nohup-invocation.html

官网的简单介绍:

nohup runs the given command with hangup signals ignored, so that the command can continue running in the background after you log out.

关于Linux进程组、会话、守护进程、终端的资料:

我的测试程序,以及一些命令:

#include <signal.h>
#include <stdio.h>

void func(int sig) {
  // 通过 man signal,可以看到SIGHUP对应的信号值为1
  // 1     SIGHUP       terminate process    terminal line hangup
  fprintf(stderr, "sig:%d\n", sig);
  fflush(stderr);
  exit(0);
}

int main() {
  int i = 0;
  // 程序内部处理SIGHUP
  signal(SIGHUP, func);
  for (;;) {
    fprintf(stderr, "%d\n", i++);
    fflush(stderr);
    sleep(1);
  }
  return 0;
}
# 远程
$gcc main.c
$./a.out
$./a.out 2> stderr.txt &
$nohup ./a.out 2> stderr.txt &
$jobs
$ps -ef | grep a.out
$tail -f stderr.txt

# 本地
$ps -ef | grep ssh
$netstat -an | grep 22

原文链接: https://pengrl.com/p/20022/

原文出处: yoko blog ( https://pengrl.com )

原文作者: yoko ( https://github.com/q191201771 )

版权声明:本文欢迎任何形式转载,转载时完整保留本声明信息(包含原文链接、原文出处、原文作者、版权声明)即可。本文后续所有修改都会第一时间在原始地址更新。

为什么启动后台程序需要使用nohup


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Effective C++

Effective C++

[美]Scott Meyers / 侯捷 / 电子工业出版社 / 2006-7 / 58.00元

《Effective C++:改善程序与设计的55个具体做法》(中文版)(第3版)一共组织55个准则,每一条准则描述一个编写出更好的C++的方式。每一个条款的背后都有具体范例支撑。第三版有一半以上的篇幅是崭新内容,包括讨论资源管理和模板(templates)运用的两个新章。为反映出现代设计考虑,对第二版论题做了广泛的修订,包括异常(exceptions)、设计模式(design patterns)......一起来看看 《Effective C++》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具