为什么busybox中的crond 守护进程是僵尸进程

温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(3406)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_087068',
blogTitle:'waitpid之status意义解析',
blogAbstract:'一、和子进程同步在linux系统中,父进程通常需要通过waitpid来等待/获取子进程状态变化情况,而这个主要就是通过waitXXX函数族来实现的,例如常见的init函数实现的respawn类配置进程(例如getty)、调试器中对子进程状态的获取,shell对同步子进程状态的监控和获取,以及通常我们工程中使用的子进程和父进程之间的通讯等。我们在linux下man 一下waitpid,可以看到有下面三个比较常用的函数YNOPSIS&&&&&& #include &sys/types.h&&&&&&& #include &sys/wait.h&',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:7,
publishTime:6,
permalink:'blog/static/',
commentCount:5,
mainCommentCount:4,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}统计linux不同运行状态的进程个数及进程名_linux进程运行状态_词汇网
统计linux不同运行状态的进程个数及进程名
责任编辑:词汇网 发表时间: 8:55:14
写这个脚本原来是打算用来监测开发板上出现僵尸进程的状况,但是写好以后,发现在开发板上使用不是很靠谱,嵌入式linux系统使用的busybox中的命令都是精简的,很多通用选项不支持。但是还是能用的,当然在桌面系统上肯定是没问题的。
脚本功能:监测linux中不同运行状态的进程数目,及相应状态的具体进程
脚本用法:./cnt_zombie.sh [运行平台:arm/pc] [欲监测的进程运行状态: Z/R/S/SS/SW/T/...]
使用示例:./cnt_zombie.sh arm Z ; ./cnt_zombie.sh pc R ; 标签: Ubuntu Server Tip 代码片段(1)[全屏查看所有代码] 1.[代码]监测进程运行状态 #! /bin/shIFS_old=$IFSIFS=$"\n"file="zombie.txt"num=0proc_name=self="cnt_zombie.sh"while test truedo if [ $1 = "arm" ] then list="`ps -w|grep $2|grep -v grep|grep -v $self`" elif [ $1 = "pc" ] then list="`ps axu|grep -w $2|grep -v grep|grep -v $self`" fi if [ "x$list" != "x" ] then x= #echo "list: $list" #num=`echo $list|wc -l` #echo "num: $num" else continue fi if [ $1 = "pc" ] then pos=`ps axu|grep PID|grep -bo COMMAND|cut -d ":" -f 1` elif [ $1 = "arm" ] then pos=26 fi num=0 for line in $list do num=$[$num+1] if [ -n $proc_name ] then proc_name="$proc_name\n\t`echo $line|cut -c $pos- `" else proc_name="`echo $line|cut -c $pos- `" fi done echo -e "process conut: $num, process list:$proc_name\n" >> $file sleep 3done
上一集:没有了 下一集:
相关文章:&&&&&&&&&&
最新添加资讯
24小时热门资讯
附近好友搜索Linux安全设置简介,最全面的Linux安全设置简介文章 - 电子工程世界网
Linux安全设置简介
在电子工程世界为您找到如下关于“Linux安全设置简介”的新闻
Linux安全设置简介资料下载
本书介绍Linux环境下的编程方法,内容包括Linux系统命令、 Shell脚本、编程语言(gawk、Perl)、系统内核、安全体系、X Window等,内容丰富、论述全面,涵盖了Linux系统的方方面面。本书附带光盘包括了RedHat Linux系统的最新版本,及安装方法,还包括本书的大量程序代码,极大地方便了读者,为使用和将要使用Linux系统的技术人员提供了较全面的参考。&nbsp...
的完整的Internet站点,并在最后介绍了网络的安全及网站的升级。本书还提供了笔者在实际操作中积累的一些小技巧,帮助你解决和避免实际工作中遇到的问题。 目&&&&& 录第1章&& 了解Linux及其网络结构&11.1&& Linux简介&11.1.1&& 何谓...
● 驱动程序的调试
● 计时问题
● 并发、锁定和对称多处理器系统(SMP)
● 内存管理和DMA
● 驱动程序模型和sysfs
● 热插拔设备
● 对常见总线的描述,包括SCSI、PCI、USB和IEEE1394(火线)。
第一章 设备驱动程序简介
设备驱动程序的作用
内核功能划分
设备和模块的分类
许可证条款...
[9] 聂诗良.红外遥控信号的一种编码解码方法.仪表技术与传 感器,-29 [10]苏维嘉. 基于ARM和SD卡的汽车安全性能检测仪.仪表技 术与传感器,-43
作者简介:于小强,男,上海理工大学硕士研究生,主要研究方 向为光电精密测试技术。 ■
技术方案 TechnologyScheme
(上接第8页)
……………………………………………… 2 Linux 系统调用的流程…………………………………………………72.1 2.2 2. 3三实例分析 ― fork 系统调用…………………………………… 83. 1 系统调用 fork 简介………………………………………………… 8 3. 2 系统调用 fork 的设置………………………………………………… 8 3. 3 函数 do_fork()的分析...
上运行程序............... 8
1.4 在手机上运行程序..................... 9
1.5 快速阅读指南.......... 9
第2章 基本概念........... 11
2.1 Android的系统架构................ 11
2.1.1 Linux内核..................... 11...
第一章 设备驱动程序简介 9
设备驱动程序的作用 10
内核功能划分 12
设备和模块的分类 14
安全问题 15
版本编号 17
许可证条款 18
加入内核开发社团 19
本书概要 19
第二章 构造和运行模块 21
设置测试系统 21
Hello World模块 22
核心模块与应用程序的对比 24
编译和装载 28
内核符号表...
摘 要:  在internet这个大舞台上有很多人都喜欢把别人的数据搞得一团糟.微软的视窗系统由于其自身的安全脆弱性等问题更是受到喜欢攻击的黑客们的"普遍关注".开放源代码的Linux成为网络与单机用户的操作系统新宠.但是,如果觉得自己拿到了Linux系统,世界就在掌握之中了,任何人都不要妄想用它兴风作浪,那就全想错了!如果没有执行适当的维护工作,那么选择Linux作为操作系统和使用其它操作系统...
Linux安全设置简介相关帖子
Linux内核的链表操作本文详细分析了 2.6.x 内核中链表结构的实现,并通过实例对每个链表操作接口进行了详尽的讲解。
一、 链表数据结构简介
链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式。相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据。链表...
各种软件人员,操作系统搞N套,VxWorks和Linux,BIOS各种配套。第二、单板的归一化,要注意产品的衍生。第一个版本的机框上的单板所实现的功能,如果后续的产品可以使用,应该直接可以用,不需要再开发。如果不注意这点,第一个版本的单板,到第二版本时,发现不能相互借用。反过来,再修改第一个版本的电路板,来适应新版本。有时问题更糟糕,就是完全不能兼容,只好重新开发。单板的规划显得非常重要。第三...
1.2 NiosII软核处理器1.2.1 Nios II软核处理器简介
继第一代可配置嵌人式软核处理器Nios之后,2004年6月,Altera公司又推出了性能更好的Nios II嵌入式软核处理器。它与2000年上市的原产品Nios相比,最大处理性能提髙了3倍,而CPU内核部分的面积最大可缩小1/2。在2013年底,Altera公司又推出了NIOS II嵌入式软核处理器GEN2版本,并将...
,因为MicroPython 是基于 python3 的。
在Windows系统中,第一次连接开发板时,会出现一个PYBFLASH磁盘,同时提示需要安装新的设备。这个新的设备就是虚拟串口,它的驱动程序就在新出现的PYBFLASH磁盘上,浏览到这个磁盘安装驱动,安装后就可以使用。
在大部分的Linux、MacOS下无需安装任何驱动程序。
终端软件设置
在调试时,通常都使用串口终端软件...
; CCS Uniflash:闪存编程工具
& & CC3200SDK-SERVICEPACK:系统服务包
& & MicroPython源码 或 github上同步
& & GNU ARM Embedded Toolchain
老白学linux--BUG_ON和WARN_ON解析
inux中的BUG_ON和WARN_ON主要用于调试...
io控制信息 DIY成员:xinmeng_wit
个人技能简述:熟练使用stm32、msp430、瑞萨等各种单片机,并熟悉了解嵌入式linux驱动开发,熟悉MFC。
创意内容:用本次活动提供的开发板结合上位机软件实现电脑的一键关机和定时关机。
周计划和论坛分享内容:
第一个月:熟悉开发板和python的用法;
第二个月:基本功能的实现,基本功能使用遥控设置参数和实现一键关机和定时关机...
本帖最后由 elvike 于
17:54 编辑
PS:由于论坛设置的格式跟我们小组自己讨论时记录的格式不太一致,所以下面详细介绍。同时帖子最后附word电子版本,欢迎查看。tks!项目背景你上班、出差、探亲,没人在家,是否担心有异常情况出现,火灾?煤气泄漏?如果家里有老人或小孩,这种牵挂更甚,这可怎么办?你需要一台环境空气质量监测仪,有了它,可以保障安全生活每一天...
本帖最后由 azhiking 于
21:53 编辑
一,什么是BabyLinux
二,为什么要做这样一个linux
三,什么人适合读这篇文档
四,应该具备的知识
五,linux系统引导过程简介
六,编译内核
七,编译busybox
八,制作根文件系统
九,制作ramdisk映象文件
十,内核与busybox的整合
十一,安装测试和内容...
或者不定期的抽检,以预防以土壤为传播介质的病虫害的发生。同时,可用通过监测土壤水含量,来自动的进行浇灌作业。在中心控制节点,可用设置人机交互界面,把一些农药喷洒信息,以及蔬菜供应信息通过网络发送到网络上,对自家的蔬菜可用做到可跟踪、透明化,真正做到绿色农业、安全农业。万维小可智能医疗设备。让更多的康复理疗设备更智能化。首先,想让设备和手机进行数据交换,现如今,无疑是WIFI技术;如果我们把设备...
线程,task1为分离,任其自生自灭,而task2还是继续送外卖,需要等待返回。(因该还记得前面说过僵尸进程吧,线程也是需要等待的。如果不想等待,就设置线程为分离线程)
额外的说下,linux下要编译使用线程的代码,一定要记得调用pthread库。如下编译:
gcc -o pthrea -pthread&&pthrea.c
四.比较以及注意事项
Linux安全设置简介视频
你可能感兴趣的标签
热门资源推荐busybox里面的僵尸进程很多是有目共睹的,为什么呢?这要从僵尸进程的概念说起,所谓僵尸进程实际上就是没有人回收的进程,什么也没有了,只剩下 task_struct这个空壳子了,task_struct里面的字段都没有了,都被释放了但是task_struct本身还在,占据着 sizeof(struct task_struct)大小的空间,其空虚的task_struct仍然在全局的task_struct链表中挂着,这样遍历整个系统的进程的时候仍然 可以找到它,在用户空间ps的时候仍然可以看到僵尸进程。但是为何会有这种进程呢?这得从进程回收说起。进程在以下情况下被回收:&&
1.父进程调用wait系统调用等待子进程;&&&
2.系统在父进程显式忽略SIGCHLD信号的时候进行回收。&&&
那么在别的情况下,该进程就会成为僵尸进程,这怎么理解呢?一般情况下,当一个进程结束的时候都要向其父进程发送SIGCHLD信号,什么情况呢?就是父进程没有将SIGCHLD信号设置为SIG_IGN并且没有设置为SIG_DFL,满足以上条件的话,父进程收到信号后必须调用wait进行回收,如果没有wait,那么该子进程就会变成僵尸进程,如果父进程将信号设置为SIG_DFL,那么退出进程照样向父进程法信号,只不过父进程不处理,子进程会成为僵尸,这是情况一;情况二就是父进程将SIGCHLD信号设置为SIG_DFL,这样的话当子进程结束时不会向父进程发送SIGCHLD信号,而且内核也
不会帮着回收,这样的话该结束的子进程一定会变成僵尸进程;情况三就是父进程显式乎略了SIGCHLD信号,即设置为SIG_IGN,这样的话内核会回收 子进程,故该子进程一定不会变成僵尸进程。为何如此复杂呢?呵呵,这是posix的约定,问他们去吧。我们可以从内核源代码看个究竟,当进程exit的时候,调用就到了do_exit:
asmlinkage NORET_TYPE void do_exit(long code)
&&&&&&&& struct task_struct *tsk =
&&&&&&&& profile_task_exit(tsk);
&&&&&&&& tsk-&flags |= PF_EXITING;
&&&&&&&& del_timer_sync(&tsk-&real_timer);
&&&&&&&& exit_notify(tsk);&&& //这个函数告知了僵尸进程产生的原因
&&&&&&&& schedule();
&&&&&&&& BUG();
&&&&&&&& /* Avoid &noreturn function does return&.& */
&&&&&&&& for (;;) ;& //不可能到这里了,因为进程永远不会从schedule返回了
static void exit_notify(struct task_struct *tsk)
&&&&&&&& struct task_struct *t;
&&&&&&&& struct list_head ptrace_dead, *_p, *_n;
&&&&&&&& INIT_LIST_HEAD(&ptrace_dead);
&&&&&&&& forget_original_parent(tsk, &ptrace_dead);
&&&&&&&& BUG_ON(!list_empty(&tsk-&children));
&&&&&&&& BUG_ON(!list_empty(&tsk-&ptrace_children));
&&&&&&&& t = tsk-&real_
&&&&&&&& if (tsk-&exit_signal != -1 && thread_group_empty(tsk)) {
&&&&&&&&&&&&&&&& int signal = tsk-&parent == tsk-&real_parent ? tsk-&exit_signal : SIGCHLD;
&&&&&&&&&&&&&&&& do_notify_parent(tsk, signal);&& //告诉父进程这个进程退出了,如果可能,那么向父进程发送子进程退出信号
&&&&&&&& } else if (tsk-&ptrace) {
&&&&&&&&&&&&&&&& do_notify_parent(tsk, SIGCHLD);& //这个是跟踪调试相关的,暂不讨论,可以参考我前面的关于调试的文章《关于linux内核调试的实现》
&&&&&&&& }
&&&&&&&& state = TASK_ZOMBIE;&&&&&&& //默认情况下进程就是僵尸进程,呵呵
&&&&&&&& if (tsk-&exit_signal == -1 && tsk-&ptrace == 0)
&&&&&&&&&&&&&&&& state = TASK_DEAD;&&&&& //如果没有父进程wait,就将进程状态转为TASK_DEAD了,内核负责回收
&&&&&&&& tsk-&state =
&&&&&&&& if (state == TASK_DEAD)
&&&&&&&&&&&&&&&& release_task(tsk);&&&&& //内核回收了TASK_DEAD状态的进程
&&&&&&&& preempt_disable();
&&&&&&&& tsk-&flags |= PF_DEAD; // 注意release_task并没有真正将task_struct的内存释放,因为do_exit中最后还要调用schedule,而 schedule 里还要用到该退出进程的task_struct,真正内存释放在schedule里面的finish_task_switch,该函数 将 task_struct的计数器减一,如果为0,那么释放内存。
我们下面看一下do_notify_parent:
void do_notify_parent(struct task_struct *tsk, int sig)
&&&&&&&& struct sighand_struct *
&&&&&&&& info.si_signo =
&&&&&&&& info.si_errno = 0;
&&&&&&&& info.si_pid = tsk-&
info.si_uid = tsk-&
&&&&&&&& info.si_utime = tsk-&utime + tsk-&signal-&
&&&&&&&& info.si_stime = tsk-&stime + tsk-&signal-&
&&&&&&&& psig = tsk-&parent-&
&&&&&&&& spin_lock_irqsave(&psig-&siglock, flags);
&&&&&&&& if (sig == SIGCHLD &&
&&&&&&&&&&&& (psig-&action[SIGCHLD-1].sa.sa_handler == SIG_IGN ||
&&&&&&&&&&&&& (psig-&action[SIGCHLD-1].sa.sa_flags & SA_NOCLDWAIT))) {& //如果父进程SIG_IGN了SIGCHLD,那么就设置一些标志,然后由内核进行回收,见上面的函数
&&&&&&&&&&&&&&&& tsk-&exit_signal = -1;
&&&&&&&&&&&&&&&& if (psig-&action[SIGCHLD-1].sa.sa_handler == SIG_IGN)
&&&&&&&&&&&&&&&&&&&&&&&& sig = 0;
&&&&&&&& }
&&&&&&&& if (sig & 0 && sig &= _NSIG)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& //如果没有SIG_IGN,那么向父进程发送信号,父进程SIG_DFL信号时也发送,只是父进程不处理,不wait,子进程当然成为了僵尸进程
&&&&&&&&&&&&&&&& __group_send_sig_info(sig, &info, tsk-&parent);
&&&&&&&& __wake_up_parent(tsk, tsk-&parent);
&&&&&&&& spin_unlock_irqrestore(&psig-&siglock, flags);
上面的函数说明足以说明僵尸进程产生的原因,但是还有一个有意思的事情就是forget_original_parent函数,该函数就是把退出进程的孩 子们过继给一个选择出来的新的进程,典型的不养老不送终,父亲到死还要照顾儿子,而僵尸进程就是典型的白发送黑发的惨剧,那么过继给谁呢?一般是过继给本线程组的另外一个进程,如果没有就过继给一个全局变量child_reaper,该变量在内核初始化的时候设置为1号init进程,具体就是在 rest_init函数中设置的,而rest_init就是start_kenenl函数fork出来的1号init进程的前身,1号进程一切初始化完毕
后就会exec成/sbin/init,具体代码很清晰就不多说了,为什么说这个呢?因为init进程负责着回收大多数僵尸进程的重任,很多进程过继给了 init进程,按照道理讲,init进程必须有wait子进程的调用,也就是说必须设置SIGCHLD信号处理器,然后在该处理器里面wait子进程,要 么就是init进程SIG_IGN了SIGCHLD信号,但是如果init进程SIG_DFL了信号那就麻烦了,init进程将不会回收子进程,造成大量 僵尸进程的产生。下面我们就看看busybox的init进程是怎么做的:busybox的init进程从init_main函数开始,注意它没有
main函数,这是busybox体系决定的,在busybox中所有进程都是busybox,不同的参数决定执行不同的进程,具体研究一下就明白了,这 里就不多说了,看一下init_main:
int init_main(int argc, char **argv)
...//前面主要就是解析/etc/inittab然后运行初始化脚本,和system v的init没有本质区别,所以掠过
&&& while (1) {
&&&&&&& /* Wait for a child process to exit */
&&&&&&& wpid = wait(NULL);&&&&&&&&&&& //看到这里,你还把busybox的僵尸进程多的原因推卸给busybox的init吗?
&&&&&&& while (wpid & 0) {
&&&&&&&&&&& /* Find out who died and clean up their corpse */
&&&&&&&&&&& for (a = init_action_ a = a-&next) {
&&&&&&&&&&&&&&& if (a-&pid == wpid) {
&&&&&&&&&&&&&&&&&&& /* Set the pid to 0 so that the process gets
&&&&&&&&&&&&&&&&&&&& * restarted by run_actions() */
&&&&&&&&&&&&&&&&&&& a-&pid = 0;
&&&&&&&&&&&&&&&&&&& message(LOG, &Process '%s' (pid %d) exited.& &
&&&&&&&&&&&&&&&&&&&&&&&&&&& &Scheduling it for restart.&,
&&&&&&&&&&&&&&&&&&&&&&&&&&& a-&command, wpid);
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& /* see if anyone else is waiting to be reaped */
&&&&&&&&&&& wpid = waitpid(-1, NULL, WNOHANG);&&& //如果还不明白就看一下内核的sys_wait4调用吧,该系统调用里回收了所有状态为“僵尸”的子进程,如果系统将没有父亲的进程都过继给了init,在busybox里面是没有任何问题的,这里全部被回收了。
既然不是init惹的祸,那么是谁呢?想象一下linux里面的老大级别的除了内核,init进程还有谁?答案是shell,我们知道当你得到一个 shell,那么该shell下面的所有的进程都是该shell的子进程,如果shell不wait的话,僵尸还是会出现的,那就看看shell吧,我们 看msh.c文件,通篇查找没有找到wait(-1,...)的,倒是有wait调用,全是wait特定pid的进程的,也就是wait它的直接子进程,那么就是不管过继给它的子进程了,因此如果将一个进程过继给了msh,那么就别指望msh回收了,它不管这种事。过继给shell的可能性极大,毕竟
shell是很多进程的父进程,认祖父为父在linux里面是再正常不过的了(内核的意思是认叔叔为父,这个还比较正常)。&&
于是真相大白了,busybox里的僵尸进程很大部分是shell设计的问题,但是也不一定,我敢肯定的是大多是是这样的,因为我调试shell的时候事实就是如此,可能还有别的凶手,我懒得找了。&&&
也许有些较真的看了以上文字会去看一下子进程过继的相关代码,那么我还是具体说一下好了,不就是forget_original_parent嘛:&&&
static inline void forget_original_parent(struct task_struct * father, struct list_head *to_release)&&&
&&&&&&&& struct task_struct *p, *reaper =&&&
&&&&&&&& struct list_head *_p, *_n;&&&
&&&&&&&& do {&&&
&&&&&&&&&&&&&&&& reaper = next_thread(reaper);&&& //在本线程组找新父亲,就是找一个叔叔&&&
&&&&&&&&&&&&&&&& if (reaper == father) {&&&
&&&&&&&&&&&&&&&&&&&&&&&& reaper = child_&& //如果没有再过继给init进程&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&& }&&&
&&&&&&&& } while (reaper-&state &= TASK_ZOMBIE);&&&
//就此打住,再往后说就没完了,只要明白这里的reaper是所有退出进程的子进程们的新父亲就可以了。&&&
那 么按照上述推理,busybox的shell就应该和它的子进程是同一线程组的了(它显然不是init进程),那么就看看msh.c文件吧,里面只要 fork新进程,通篇用vfork,所谓vfork就是和当前进程共用虚存空间,在sys_vfork里明确指示要CLONE_VM标志,这样shell 不一定和子进程在同一线程组,但是和父进程关系甚密。vfork在调用exec之前完全在父进程的空间运行,这样可以减少复制开销,直到exec才和父进程分道扬镳,但是却还是和父进程关系甚密。
本文已收录于以下专栏:
相关文章推荐
最近工作过程中,发现好几台服务器出现僵死进程(如图)。
  用下面的命令找出僵死进程
-A -o stat,ppid,pid,cmd | grep -e '^[Zz...
僵尸进程什么是僵尸进程提到僵尸,首先想到的肯定是僵尸系列的电影或者植物大战僵尸。一个活人为什么会成为僵尸?一般普通人是被僵尸攻击了,在变成僵尸之前没有得到有效处理(比如击毙),等他被僵尸病毒侵入脑子后...
在fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用waitpid()等待子进程结 束,又没有显式忽略该信号,则子进程成...
Linux 系统中僵尸进程
Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动。僵尸进程指的是那些虽然已经终止的进程,但仍然保留...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在嵌入式系统内,如果我们使用busybox内的init作为第一个用户进程其启动流程中注意点:
& 1。内核在启动start_kernel后经过一系列的初始化后,会调用rest_init函数,在这个函数里会exec(/sbin/init)。
& 2。在init启动后会根据是否有inittab文件,决定启动哪些脚本如果没有会有一个默认启动。
& 3。在读取inittab文件后,根据如下规则:
/etc/inittab 文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下 :
&id&:&runlevels&:&action&:&process&
ttySAC0:askfirst:-/bin/sh
(1)&id&:表示这个进程要使用的控制台(即标准输入、标准输出、标准错误设备)。如果省略,则使用与init进程一样的控制台。
(2)&runlevels&:对于Busybox init程序,这个字段滑意义,可以省略。
(3)&action&:表示init程序如何控制这个子进程,
(4)&process&: 要执行的程序,它可以是可执行程序,也可以是脚本
如果&process&:字段有&-&字符,表示这个程序被称为“交互的”。在/etc/inittab/文件的控制下,init进程的行为总结如下:
(1)在系统启动前期,init进程首先启动&action&为sysinit wait once的3类子进程。
(2)在系统正常运行期间,init程序首先启动,&action&为respawn askfirst的两类子进程,并监视它们,发现某个子进程退出时重新启动它。
(3) 在系统退出时,执行&action& 为shutdown restart ctrlaltdel的3类子进程之一或全部。
如果根文件系统中没有/etc/initab文件,Busybox init程序将使用如下默认的inittab条目。
& & & & & & &/etc/inittab文件中&action&字段的意义
Action名称
系统启动后最先执行
只执行一次,init进程等待它结束才继续执行其它动作
系统执行完sysinit进程后
只执行一次,init进程等待它结束才继续执行其它动作
系统执行完wait进程后
只执行一次,init进程不等待它结束
启动完once进程后
Init进程监测发现子进程退出时,重新启动它
启动完respawn进程后
与respawn类似,不过init进程先输出“Please press Enter to actvie this console”,等用户输入驾车键之后才启动子进程
当系统关机时
即重启关闭系统命令时
Busybox中配置了CONFIG_FEATURE_USE_INITTAB,并且init进程接收到SIGHUP信号时
先重新读取,解析/etc/initab文件,再执行restart程序
Ctrlatldel
按下Ctr+Alt+del组合键时
&读取后分为几类:
& & 根据启动定义性质,分别启动。
其中在启动
Sysinit进程的时候,会如下:
init &fork一次 出现两个init进程。而后第二个init会再次fork 出现第三个init进程,不过第三个init进程存在的时间极短,就会调用exec把需要启动的进程拉入该进程进程名改变。
& 在以sysinit启动的脚本 必须能返回结束,否则该系统init进程将处于一直等待某个进程的状况,而无法后续回收僵尸进程。
===========================================================================================================
===========================================================================================================
的进程依次进行以下工作:
)为设置信号处理进程。
)初始化控制台。
)解析文件()。
)执行系统初始化脚本(/etc/init.d/rcS作为缺省)。
)执行所有阻塞的(会导致暂停的)命令(动作类型:)。
)执行所有仅执行一次的命令(动作类型:)。
)一旦完成以上工作,进程便会循环执行以下工作:
)执行所有终止时必须重新启动的命令(动作类型:)。
)执行所有中止时必须重新启动但启动前必须前询问用户的命令(动作类型:)。
其中,文件的每一行的格式为:。字段用来指定所执行程序的路径,包括命令行选项。字段用来指定可应用到的动作。能够识别的动作类型如下表所示:
为提供初始化命令行的路径
每当相应的进程终止执行便重新启动
类似,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使在控制台上显示的信息,并在重新启动进程之前等待用户按下键
告诉必须等到相应的进程完成才能继续执行
仅执行相应的进程一次,而且不会等待它完成
当按下组合键时,执行相应的进程
当系统关机时,执行相应的进程
当重新启动时,执行相应的进程。通常此处所执行的进程就是本身
下面就是一个典型的嵌入式的文件的例子:
可见busybox分析完inittab脚本中会执行rcS脚本,下面就是一个rcS脚本的例子:
echo &export system param....&
export PATH=/sbin:/bin:
export HOSTNAME=micro2440
echo &init ip address.....&
/sbin/ifconfig eth0 192.168.254.177
echo &Mount all filesystems (of the given types) mentioned in fstab.&
其中mount –a会加载文件/etc/fstab文件中的选项,这个目录的编写主要是安排哪些目录挂载哪些次级文件系统:例如:
proc&&&&&&&&&& /proc&&&&&&& proc&& defaults&&&&&&& 0&&&& 0
tmpfs&&&&&&&& /tmp&&&&&&& tmpfs& defaults&&&&&&& 0&&&& 0
sysfs&&&&&&&&& /sys&&&&&&&& sysfs& defaults&&&&&&& 0&&&& 0
上面的rcS文件中不但加载了在etc/fstab中定义的文件系统(mount -a),还对系统的环境变量、ifconfig以及打印欢迎信息进行设置,这样比较省事儿,还有一种做法是在rcS中运行/usr/etc/rc.local脚本,该脚本的主要工作是安装核心模块、进行网络配置、运行应用程序、启动图形界面等,这里的rc.local脚本只进行ifconfig,打印欢迎信息,并执行/usr/etc/profile,profile文件时对应用程序的环境变量进行设置:
本文已收录于以下专栏:
相关文章推荐
使用busybox制作的文件系统,内核启动后,就会开始执行busybox init进程,这个和一般的sys v init一样。busybox要完成以下工作:①为init进程设置信号处理进程②对控制台进...
一、Busybox
    Busybo是一个遵循GPLv2协议的开源项目。Busybox将众多的Linux命令集合进一个很小的可执行程序中,可以用来替换GNU fileutils shelluti...
文章转载自:/mutecat/archive//731500.aspx的一部分,全文内容请看原文。 5.5.3  busybox的ini...
(一)System V init
首先我们来讨论PC上运行的Linux系统,它启动后从BIOS开始,进入bootloader,有bootloader加载内核,进入内核初始化。内核启动的最后一步就是创...
本文转载,地址:http://blog.csdn.net/chinazcw/archive//3482174.aspx,版权问题,马上删除。 5.5.3  busybox的init...
busybox中的init程序可以完成初始化的基本功能而且去掉了System V系统init程序的多余功能,init程序执行的顺序如下:
  .创建init的信号处理
  .初始化控制台
生活在2017年的程序员,不焦虑的确实没有几个。经历了2016年的房价暴涨以及此前房价的数次狂飙猛进,能心静如水的人那内心的强大恐怕不是一般人可以企及。本人一介码农兼教书匠,时常走街串巷,曾经在好多公...
原文链接http://blog.csdn.net/yangruibao/article/details/7435182
由于BusyBox自身的一些特点,BusyBox init非常适合在嵌入式系...
#include pid_t fork(void);Returns: 0 in child, process ID of child in parent, -1 on error     fork函数...
example1 (forkt.c ):#include#include#include#includeint glob = 5;int main(){       
int var=10;   &...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 僵尸进程 孤儿进程 的文章

 

随机推荐