生人勿近之Linux里养僵尸

Linux里养僵尸是怎么回事呢?Linux相信大家都很熟悉,但是Linux里养僵尸是怎么回事呢,下面就让小编带大家一起了解吧。

- 1 -

上一篇挖了个 SIGHUP 的坑,这篇试着填一下。

之前在《程序员面试指北:面试官视角》里面说过,在结构化面试中,我们会从各个方向去考查候选人,其中之一是操作系统。

上篇介绍了一套题,我还有另一套,一般这么开场:

在终端下启动一个命令,如果在命令结束前关掉终端,它还能正常运行吗?


- 2 -

这其实是一个很常见的case,但凡 Linux 或者 Mac 用得多一点,都会遇到。

在我还是一个穷酸学生的2009年,每个月都需要支付 20 元巨款(当时能买3根鸭脖),通过一个禁止分享网络的认证客户端接入校园网。

为了共建和谐宿舍 节省网费,我历经千辛万苦,交叉编译开源的Linux认证客户端,集成到固件里,并刷到了我的 NETGEAR 路由器上。

然后山水 BBS 的 Linux 版主把我的帖子置顶了 11 年。可见他有多痛恨禁止共享网络。

这么一回忆,感觉自己的共享经济思维真是前卫,当时怎么就没想到去搞共享单车呢?

扯远了,在捣腾的过程中,我就踩了这么个坑:当我ssh到路由器上、刚启动认证时,能够正常联网;但是退出ssh后一会,网就断了。

经过一番捣腾后发现,只要一退出ssh,认证程序就凉了,而不是继续在后台保持和认证服务器的通信。


- 3 -

所以前面那个问题,我以为大部分候选人应该会回答“否”,但没想到竟然还有不少人回答“是”。

其实回答“是”也没什么错,因为确实也有些命令不会随着终端关闭而结束。

问题是当我追问当时执行的是什么命令时,候选人往往又说不出个所以然来。

(借学长的表情一用)

然后我就感到很强的挫败感:这不按剧本来,没法问了啊……只好换题。

当然大部分候选人确实被坑过,于是我可以接着问:

如果确实需要在后台继续执行命令怎么办呢?

有些人只记得要在后面加个 & ;但也有不少人知道前面还得加个 nohup,就像这样:

$ nohup python process.py &
[1] 1806824
nohup: ignoring input and appending output to 'nohup.out'

注:其实我更喜欢 screen(或 tmux),偶尔也用 setsid。

然后就可以放心地关闭终端 开始放羊 了。

但我的套题还没结束:为什么加上 nohup 就可以让进程在后台继续运行呢?

(这表情熟悉吗)


- 4 -

铺垫了这么多,总算是可以开始填坑了。

答案其实很好找,man nohup 就能看到:

The nohup utility invokes utility with its arguments and at this time sets the signal SIGHUP to be ignored

nohup工具在启动命令的同时会将 SIGHUP 信号设置为忽略。

而关于 SIGHUP,Wikipedia原文是这样介绍的:

On POSIX-compliant platforms, SIGHUP ("signal hang up") is a signal sent to a process when its controlling terminal is closed.

wikipedia.org/wiki/SIGHUP

对于 POSIX 兼容的平台(如Unix、Linux、BSD、Mac),当进程所在的控制终端关闭时,系统会给进程发送 SIGHUP 信号(Signal Hang Up,挂断信号)。

为什么叫 SIGHUP 呢?(严正申明:这一问不在套题里

我们知道,在上古时代,捉 bug 就已经是码农的必备技能(更准确地说是 moth)。

(我总觉得这个图是假的)

到了远古时代,他们不再需要去机房,通过基于 RS-232 协议的串行线路连接到大型机的终端上,就可以开始收福报。

收完福报,程序员通知自己的猫(modem)挂断(Hang Up)连接;大型机的 OS 检测到连接断开,就会给进程发送信号 —— 所以这信号被称为 SIGHUP 。

这果然是毫无卵用的知识啊。


- 5 -

很多同学在操作系统的课程上学习了“进程间的通信方式有信号、管道、消息队列、共享内存……”,但是对信号到底是个什么东西,并没有现实的概念。

课堂教学的理论和实践往往是割裂的,在此特别推荐《Unix环境高级编程》(简称APUE)。

APUE在 1.9 - 信号 中写到:信号是通知进程已发生某种条件的一种技术。

而在 Linux/Unix 下,进程对信号的处理有三种选择:

  • 按系统默认方式处理

  • 提供一个回调函数

  • 或忽略该信号(有些信号例外,不允许被忽略)

以 SIGHUP 信号为例,系统默认处理方式就是结束进程

当然终端下打开的第一个进程通常都是shell(例如bash)。shell会给 SIGHUP 信号注册一个回调函数,用于给该 shell 下所有的子进程发送 SIGHUP 信号,然后再主动退出。

对于求生欲很强的程序(例如nohup),可以主动选择忽略该信号

有一些进程本来就被设计成在后台运行,不需要控制终端,因此它们将 SIGHUP 挪作它用,一个常见的用法就是重新读取配置文件(例如Apache、Nginx),上篇提到的 logrotate 正是利用了这一点。

终于填完了坑。


- 6 -

说了这么多都还是纸上谈兵,实操中如何主动忽略 SIGHUP 呢?

实际上也很简单,使用 Linux 的 signal 系统调用即可:

#include <signal.h>
#include <unistd.h>int main() {signal(SIGHUP, SIG_IGN);sleep(1000);return 0;
}

不妨试试看,编译运行起来,即使关闭终端,它也会在后台继续运行。

signal 也可以用于指定回调函数(或重置为系统默认处理方式),这里就不展开了,感兴趣的同学可以参考 APUE 里的代码,以及阅读 signal 的manual。

使用回调函数还需要注意一个坑:

由于回调函数可能在任意时刻被触发,因此要避免调用不可重入的函数(典型如printf)。常见的做法是 set 一个 flag,然后在程序的主循环中检测该 flag,再按需执行相应任务。


- 7 -

SIGHUP 只是常见的一个信号,在 Linux 下,信号还有大量其他的场景和应用。

当你按下 Ctrl + C ,就是给进程发送了一个 SIGINT 信号。

当你执行 kill -9 $PID,就是给进程发送了一个 SIGKILL 信号。可能和你期望有出入的是,SIGKILL 是可以被进程忽略的。所以有时候你得用 SIGTERM。

你还可以使用可自定义的 SIGUSR1、SIGUSR2、SIGURG 来实现一些功能,比如《踩坑记#2:Go服务锁死》中提到 Golang 在其 goroutine 调度中使用了 SIGURG 。


- 8 -

这次就不总结了,最后再用一个和信号有关的 case 收尾。

Linux 内核会为每一个进程分配一个 task_struct 结构体,用于保存进程的相关信息。

在进程死亡后,系统会发送一个 SIGCHLD 信号给它的父进程。

正确的父进程实现,通常应当使用 wait 系统调用来给子进程收尸 —— 父进程往往需要知道子进程结束这个事件,而且可能还需要得知其退出原因(exit code)。

然后内核才会将对应的 task_struct 释放。

如果父进程没有收尸,task_struct 里的 state 会一直保持为 EXIT_ZOMBIE,这时在 ps 或 top 等命令里,就可以看到该进程的状态为 Z ,而且无法被 kill 。

这就是所谓的僵尸进程,这时候你找九叔都没用。

(大半夜找这图还挺渗人的)

所以Linux里养僵尸,其实就是子进程死了父进程不收尸,大家可能会很惊讶Linux里怎么会养僵尸呢?但事实就是这样,小编也感到非常惊讶。

这就是关于Linux里养僵尸的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!


推荐阅读

  • 程序员面试指北:面试官视角

  • 踩坑记:go服务内存暴涨

  • TCP:学得越多越不懂

  • UTF-8:一些好像没什么用的冷知识

  • [译] C程序员该知道的内存知识 (1)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/48782.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度PARL再度夺冠NeurIPS仿生人挑战赛:强化学习控制的流畅行走

在最近的 NeurlPS 2019 强化学习赛事中&#xff0c;百度凭借基于飞桨的自研强化学习框架 「PARL」 再次夺冠。 机器学习领域顶级会议 NeurIPS 2019 将于 12 月 8 日-14 日在加拿大温哥华开幕。不久之前&#xff0c;大会公布了论文评审结果&#xff0c;今年大会共收到 6743 份有…

仿生人会梦见电子羊吗?——谈谈人工智能与伦理

说到人工智能与伦理&#xff0c;首先出现在我脑海中的便是菲利普迪克的作品&#xff1a;《仿生人会梦见电子羊吗&#xff1f;》 书中讲述了这样一个故事&#xff1a;核战之后&#xff0c;放射尘使地球上的动物濒临灭绝。政府为鼓励人们移民到外星&#xff0c;承诺给每个移民的…

【杂谈】仿生人会梦见电子羊吗?

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

Python爬虫之美丽的汤——BeautifulSoup

本文概要 本篇文章主要介绍利用Python爬虫之美丽的汤——BeautifulSoup&#xff0c;适合练习爬虫基础同学&#xff0c;文中描述和代码示例很详细&#xff0c;干货满满&#xff0c;感兴趣的小伙伴快来一起学习吧&#xff01; 是不是以为今天要教大家怎么做饭&#xff1f;确实&…

拥有一个懂你的机器人是种怎样的体验?

“ 智能对话的核心在于能够根据上下文理解用户的意图&#xff0c;能够与人进行自然、流畅、亲密的交流&#xff0c;同时拉近人和“人”之间的距离&#xff0c;让“人”成为更加亲密的伙伴。” 01 智能对话的重要性 相信很多人都感受过“智能客服”所带来的难受体验&#xff0c…

GPT-4震撼发布:多模态大模型:Plus用户优先试用

OpenAI 刚刚宣布正式推出 GPT-4。GPT-4 是 Generative Pre-trained Transformer 4 的缩写&#xff0c;即生成型预训练变换模型 4。 这是 OpenAI 努力扩展深度学习的最新里程碑。GPT-4 是一个大型多模态模型&#xff08;接受图像和文本输入&#xff0c;发出文本输出&#xff09;…

程序员的“凡尔赛文学”大赏!

这几天随处可见“凡尔赛”文学&#xff0c;有一种全民凡尔赛的感jio。 凡尔赛文学也被简称"凡学",是网友对于热衷于通过先抑后扬、自问自答或第三人称视角&#xff0c;不经意间露出"贵族生活的线索"的人的调侃。 为了便于大家理解&#xff0c;举几个具体的…

AR+玩具,用科技打造玩具新玩法

曾几何时&#xff0c;我们也曾幻想自己的玩具能像《玩具总动员》里的玩具们一样&#xff0c;要是能让玩具拥有灵魂&#xff0c;让它们能动起来&#xff0c;该有多好啊。AR增强现实技术的发展和不断完善普及将这一想法变为了现实 01 玩具巨头乐高的多元化转型 2019年&#xff0c…

赚35万,用ChatGPT做二次原创卖儿童益智玩具

抖音上卖益智玩具项目 项目分析 今天要和大家分享一个相对小众且冷门的项目&#xff0c;就是在抖音上通过录制带货短视频来销售儿童益智玩具项目&#xff0c;产品包括拼图、迷宫、3D拼图、数学游戏、逻辑游戏等多种类型。 对于宝妈们来说&#xff0c;益智玩具简直是无法抗拒…

unity3d 布娃娃系统插件 PuppetMaster 木偶师

PuppetMaster包含一个非常易于使用的视觉布娃娃创建工具&#xff0c;用于人形角色,将角色的动画的姿势映射到木偶的的肌肉使其同步&#xff0c;并保持在那里&#xff0c;直到动画在下一帧覆盖它。 简略使用方法 1. 将人形角色模型拖动到场景并附加BipedRagdollCreator.cs组件。…

上交清华搞事情!发起最全学科大模型中文知识及推理评测!GPT-4 竟然血洗所有国产模型...

点击上方“AI遇见机器学习”&#xff0c;选择“星标”公众号 第一时间获取价值内容 夕小瑶科技说 原创 作者 | 小戏、Python 从 OpenAI 的 ChatGPT、Meta 的 LLaMA、Anthropic 的 Claude 到复旦的 Moss、清华的 ChatGlm、MiniMax 的 Glow&#xff0c;国内的国外的大模型百花齐放…

始料未及-- 元宇宙传来好消息,全球轰动

突然间&#xff0c;元宇宙着火了。 从表面上看&#xff0c;这是出乎意料的&#xff0c;很多人将其视为资本引发的存在。也正是因为如此&#xff0c;人们对元宇宙的看法才变得两极分化。 那些对元宇宙感兴趣的人会佩服它&#xff1b;屈服于元宇宙的人会以各种方式对其产生怀疑&…

元宇宙被这个圈子带火了一波,是我没想到的

金磊 萧箫 发自 凹非寺量子位 | 公众号 QbitAI 最近有个热闹的事&#xff0c;值得说道说道。 事情是这样的&#xff1a; 先是中国第一个进入元宇宙时代的媒体集团Meta Media超媒体控股&#xff0c;打造了个叫Meta ZiWU的项目&#xff0c;还请了建筑圈著名的马岩松&#xff0c;在…

元宇宙爆发增长,代币成为了变现必备媒介

Cloud exchange打算将CDE代币定位为区块链构建块&#xff0c;以帮助“加速向完整的区块链经济的过渡”&#xff0c;代币将允许用户影响“元宇宙的未来”。CDE代币面向的是受法律保护地区居民使用&#xff0c;这部分使用者能通过使用CDE来购买商品、服务&#xff0c;允许用户设计…

【回顾】“双11”首个元宇宙日 中国移动通信联合会元宇宙产业委员会揭牌 《元宇宙产业宣言》发布

2021年11月11日&#xff0c;“元宇宙日”&#xff0c;中国移动通信联合会元宇宙产业委员会&#xff08;CMCA-MCC&#xff09;揭牌仪式与《元宇宙产业宣言》发布暨中信出版《元宇宙》新书首发活动在中国移动通信联合会会议室举办&#xff0c;央链直播全程转播。 著名数字经济权威…

为了元宇宙,Facebook下周要改名了?

整理 | 祝涛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 据外媒报道&#xff0c;有知情人士透露&#xff0c;社交媒体巨头Facebook计划在下周更改公司名称&#xff0c;以显示其专注于构建元宇宙的决心。报道称&#xff0c;Facebook CEO扎克伯格&#xff08;M…

《元宇宙2086》影视工业弯道超车?《科普时报》刊登采访报道

科普时报-第267期 2023年01月06日 星期五 第05版&#xff1a;书香文史刊载了题目为“《元宇宙2086》影视工业弯道超车&#xff1f;”的关于高泽龙的采访报道。全文内容如下&#xff1a; 在2022年中国金鸡百花电影节暨第35届中国电影金鸡奖期间&#xff0c;我创作的中国首部元宇…

世界元宇宙大会暨元宇宙探索交流论坛 礼码生活构建元宇宙庞大生态

万众瞩目&#xff0c;终于来临。2021 年 10 月 14 日&#xff0c;由Open Sky和礼码生活联合主办&#xff0c;全球节点联盟、千岛矿业联盟、ROMAN WAY承办的世界元宇宙大会暨首届元宇宙探索者交流论坛在中国深圳隆重召开&#xff0c;社会各界高度关注&#xff0c;比特财经、金色…

元宇宙:有人追捧,就会有人抵触

或许&#xff0c;直到现在&#xff0c;我们依然无法否认元宇宙即将对我们的生产和生活产生的深刻影响。即使是在它遭遇巨大的不确定性的大背景下&#xff0c;依然如此。 有人追捧&#xff0c;便有人抵触。元宇宙商用的止步不前&#xff0c;元宇宙技术的难以突破……几乎都是这…