linux - 谁做守护进程?

标签 linux daemon nohup

有多种技巧可以使 linux 进程守护进程,即在终端关闭后运行命令。

nohup 用于此目的,fork()/setsid() 组合可用于 C 程序中使其自身一个守护进程。

以上是我对 linux daemon 的了解,但今天我注意到退出终端并没有真正终止命令末尾以 & 开始的进程。

$ while :; do echo "hi" >> temp.log ; done &
[1] 11108
$ ps -ef | grep 11108
username   11108 11076 83 15:25 pts/0    00:00:05 /bin/sh
username   11116 11076  0 15:25 pts/0    00:00:00 grep 11108
$ exit
(after reconnecting)
$ ps -ef | grep 11108
username   11108     1 91 15:25 pts/0    00:00:17 /bin/sh
username   11130 11540  0 15:25 pts/0    00:00:00 grep 11108

很明显,进程的 PPID 更改为 1,这意味着它以某种方式被守护进程。

这与我的知识相矛盾,& 是不够的,必须使用 nohup 或其他一些技巧来处理“守护进程”。

有人知道是谁在做这个守护进程吗?

我使用的是 CentOS 6.3 主机,putty/cygwin/sshclient 产生了相同的结果。

最佳答案

如果进程不响应 SIGHUP 信号,您可以将其守护进程。

当 bash shell 在运行后台任务时终止,bash shell 发送 SIGHUP (挂断信号)到所有任务。但是 bash 不会等到子进程完成 终止。如果子进程不响应 SIGHUP 信号,则该进程成为孤儿 过程。 (其父进程pid改为1——init进程——防止成为无用的僵尸进程)

子 shell 执行基本上不响应 SIGHUP 信号,因此您的命令在从第一个 shell 注销后仍将运行。

关于linux - 谁做守护进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13738507/

相关文章:

linux - 无法加载 Ubuntu 17.04

c - 从叶子开始逐级修剪二叉流程树

android - 当我的 nexus 6p 处于恢复模式时,ADB 无法列出我的设备

mysql - 如何在线执行包含多个数据库语句的sql文件?

linux - QEMU CPU仿真原理

python - 使用 python 守护进程在 OS X 10.7 上获取事件应用程序

python - 什么是守护进程?它为何被创建?

windows - 如何在 Windows 后台运行 jupyter notebook?

python - Jupyter如何在后台运行单元格?

node.js - 保持 Node 在后台运行的最佳方法是什么——nohup vs. forever vs. pm2?