Linux 中的每个进程都存在于“进程树”中。你可以通过运行 pstree 命令查看进程树。树的根是 init,进程号是 1。每个进程(init 除外)都有一个父进程,一个进程都可以有很多子进程。
目前创新互联已为1000多家的企业提供了网站建设、域名、网站空间、网站托管维护、企业网站设计、通道网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
所以,假设我要启动一个名为 ls 的进程来列出一个目录。我是不是只要发起一个进程 ls 就好了呢?不是的。
我要做的是,创建一个子进程,这个子进程是我(me)本身的一个克隆,然后这个子进程的“脑子”被吃掉了,变成 ls。
开始是这样的:
然后运行 fork(),生成一个子进程,是我(me)自己的一份克隆:
然后我让该子进程运行 exec("ls"),变成这样:
当 ls 命令结束后,我几乎又变回了我自己:
在这时 ls 其实是一个僵尸进程。这意味着它已经死了,但它还在等我,以防我需要检查它的返回值(使用 wait 系统调用)。一旦我获得了它的返回值,我将再次恢复独自一人的状态。
上文提到的“脑子被吃掉”是什么意思呢?
进程有很多属性:
当你运行 execve 并让另一个程序吃掉你的脑子的时候,实际上几乎所有东西都是相同的! 你们有相同的环境变量、信号处理程序和打开的文件等等。
唯一改变的是,内存、寄存器以及正在运行的程序,这可是件大事。
为何 fork 并非那么耗费资源(写入时复制)
你可能会问:“如果我有一个使用了 2GB 内存的进程,这是否意味着每次我启动一个子进程,所有 2 GB 的内存都要被复制一次?这听起来要耗费很多资源!”
事实上,Linux 为 fork() 调用实现了写时复制copy on write,对于新进程的 2GB 内存来说,就像是“看看旧的进程就好了,是一样的!”。然后,当如果任一进程试图写入内存,此时系统才真正地复制一个内存的副本给该进程。如果两个进程的内存是相同的,就不需要复制了
当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在内核里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为0的整数)。在这个信息里,会解释该进程为什么退出。父进程在得知子进程终结时,有责任对该子进程使用wait系统调用。这个wait函数能从内核中取出子进程的退出信息,并清空该信息在内核中所占据的空间。但是,如果父进程早于子进程终结,子进程就会成为一个孤儿(orphand)进程。孤儿进程会被过继给init进程,init进程也就成了该进程的父进程。init进程负责该子进程终结时调用wait函数。
当然,一个糟糕的程序也完全可能造成子进程的退出信息滞留在内核中的状况(父进程不对子进程调用wait函数),这样的情况下,子进程成为僵尸(zombie)进程。当大量僵尸进程积累时,内存空间会被挤占。
Linux技术的发展引起了很多企业和个人的关注。市场对Linux运维的需求逐渐增加,学习Linux技术的人越来越多。在Linux运维中,进程是必须学习掌握的技能。那么Linux中如何启动进程?常用的进程调度命令有哪些?
执行中的程序称作进程。当程序的可执行文件存储在存储器中并运行时,每个进程将被动态分配系统资源、内存、安全属性和相关状态。多个进程可以与同一个程序相关联,并在同一时间执行,而不会相互干扰。操作系统将有效地管理和跟踪所有正在运行的进程。
Linux中如何启动进程?启动进程的方法是什么?
手工启动。用户在输入端发出命令,直接启动进程。分为前台启动和后台启动。前台启动:直接在SHELL中输入命令进行启动。后台启动:启动一个目前并不紧急的进程。
调度启动。系统管理员根据系统资源和进程占用资源的情况,事先进行调度安排,指定任务运行的时间和场合,到时候系统会自动完成该任务。
常用的进程调度命令有哪些?
常用的进程调度命令有:at、batch、crontab。
以上便是关于“如何启动或终止进程?常用的进程调度命令有哪些?”的相关介绍。想要成为一名优秀的Linux运维工程师,需要掌握更多的Linux知识。
新建文件夹/root/test/,test文件夹中有myCPP.cpp,myTEXT.txt,restart.sh
该文件的功能是每隔5s往myTEXT.txt中写入当前时间
编译得到可执行文件mycpp: g++ myCPP.cpp -std=c++11 -o mycpp
注意有时候因为权限问题会导致shell拉起失败,这里粗暴地开放所有权限 chmod 777 mycpp
shell脚本,检测目标程序是否处于运行状态,如果不运行则将其拉起。
加上crontab就可以让脚本定时执行,一旦发现进程没有运行,则启动该进程,这样就实现了进程的自动拉起。
通过 crontab -e 进入类似vim的操作界面,在文件末尾补充 */1 * * * * /root/test/restart.sh /root/test/mycpp ,让restart.sh脚本每一分钟运行一次(即每分钟检测一次mycpp是否正在执行)
查看mycpp进程是否在执行 ps -ef | grep mycpp
查看mycpp执行写入的结果 tail -f myTEXT.txt