正文
linux中启动进程命令 linux启动程序命令
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
Linux启动一个进程的过程
Linux 中的每个进程都存在于“进程树”中。你可以通过运行 pstree 命令查看进程树。树的根是 init,进程号是 1。每个进程(init 除外)都有一个父进程,一个进程都可以有很多子进程。
所以,假设我要启动一个名为 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手工启动进程
手工启动进程指的是由用户输入命令直接启动一个进程,根据所启动的进程类型和性质不同,又细分为前台启动和后台启动两种。
前台启动进程
这是手工启动进程最常用的方式,因为当时输入一个命令并运行,就已经启动了一个进程,而且是一个前台的进程,此时系统其实已经处于一个多进程的状态,一个是shell进程,另一个是新启动的进程。
实际上,系统自动时就有许多进程悄悄地在后台运行,不过为了方便阅读,并没有将这些进程包括在内。
假如启动一个比较耗时的进程,然后再把该进程挂起,并使用ps命令查看,就会看到该进程在PS显示列表中。将进程挂起,指的是将前台运行的进程放到后台,并且暂停其运行。
后台启动进程
进程直接从后台运行,用的相对比较少,除非该进程非常耗时,且用户也不急着需要其运行结果的时候,例如,用户需要启动一个需要长时间运行的格式化文本文件的进程,为了不使整个shell在格式化过程中都处于被占用状态,从后台启动这个进程是比较明智的选择。
从后台启动进程,其实就是在命令结尾处添加一个符号。输入命令并运行之后,shell会提供给我们一个数字,此数字就是该进程的进程号。然后直接就会出现提示符,用户就可以继续完成其他工作。
手工启动的2种方式,实际上它们有个共同的特点,就是新进程都是由当前shell这个进程产生的,换句话说,是shell创建了新进程,于是称这种关系为进程间的父子关系,其中shell是父进程,新进程是子进程。
且一个父进程可以有多个子进程,通常子进程结束后才能继续父进程;当然,如果是从后台启动,父进程就不用等待子进程了。
Linux调度启动进程
在Linux系统中,任务可以被配置在指定的时间、日期或者系统平均负载量低于指定值时自动启动。
例如,Linux预配置了重要系统任务的运行,以便可以使系统能够实时被更新,系统管理员也可以使用自动化的任务来定期对重要数据进行备份。
实现调度启动进程的方法有很多,比如通过crontab、cat等命令。
linux系统下如何从后台启动进程?
你得查看后台存在的进程 #jobs
#fg
#bg
两个命令是调入前台和后台的命令
在命令后面加上一个
比如:
rm -rf /tmp/
Linux 技巧:让进程在后台可靠运行的几种方法
WeiboGoogle+用电子邮件发送本页面
我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。
nohup/setsid/
场景:
如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?
hangup 名称的来由
在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。 同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。
解决方法:
我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。
1. nohup
nohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。让我们先来看一下 nohup 的帮助信息:
NOHUP(1) User Commands NOHUP(1) NAME nohup - run a command immune to hangups, with output to a non-tty SYNOPSIS nohup COMMAND [ARG]... nohup OPTION DESCRIPTION Run COMMAND, ignoring hangup signals. --help display this help and exit --version output version information and exit
可见,nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上""来将命令同时放入后台运行,也可用"filename 21"来更改缺省的重定向文件名。
[root@pvcent107 ~]# nohup ping [1] 3059nohup: appending output to `nohup.out'[root@pvcent107 ~]# ps -ef |grep 3059root 3059 984 0 21:06 pts/3 00:00:00 ping 3067 984 0 21:06 pts/3 00:00:00 grep 3059[root@pvcent107 ~]#
2。setsid
nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid 的帮助信息:
SETSID(8) Linux Programmer’s Manual SETSID(8) NAME setsid - run a program in a new session SYNOPSIS setsid program [ arg ... ] DESCRIPTION setsid runs a program in a new session.
可见 setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。
[root@pvcent107 ~]# setsid ping [root@pvcent107 ~]# ps -ef |grep 31094 1 0 07:28 ? 00:00:00 ping 31102 29217 0 07:29 pts/4 00:00:00 grep [root@pvcent107 ~]#
值得注意的是,上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。请将此例与nohup 例中的父 ID 做比较。
3。
这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。
当我们将""也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。
[root@pvcent107 ~]# (ping )[root@pvcent107 ~]# ps -ef |grep 16270 1 0 14:13 pts/4 00:00:00 ping 16278 15362 0 14:13 pts/4 00:00:00 grep [root@pvcent107 ~]#
从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。
Linux中如何启动进程?进程调度命令有哪些?
Linux技术的发展引起linux中启动进程命令了很多企业和个人的关注。市场对Linux运维的需求逐渐增加linux中启动进程命令,学习Linux技术的人越来越多。在Linux运维中,进程是必须学习掌握的技能。那么Linux中如何启动进程?常用的进程调度命令有哪些?
执行中的程序称作进程。当程序的可执行文件存储在存储器中并运行时,每个进程将被动态分配系统资源、内存、安全属性和相关状态。多个进程可以与同一个程序相关联,并在同一时间执行,而不会相互干扰。操作系统将有效地管理和跟踪所有正在运行的进程。
Linux中如何启动进程?启动进程的方法是什么?
手工启动。用户在输入端发出命令,直接启动进程。分为前台启动和后台启动。前台启动:直接在SHELL中输入命令进行启动。后台启动:启动一个目前并不紧急的进程。
调度启动。系统管理员根据系统资源和进程占用资源的情况,事先进行调度安排,指定任务运行的时间和场合,到时候系统会自动完成该任务。
常用的进程调度命令有哪些?
常用的进程调度命令有:at、batch、crontab。
以上便是关于“如何启动或终止进程?常用的进程调度命令有哪些?”的相关介绍。想要成为一名优秀的Linux运维工程师,需要掌握更多的Linux知识。
linux进入子进程的命令是
linux是一个 多进程 多用户linux中启动进程命令的操作系统
ps(显示当前进程的状态)
ps -ef 查看当前linux 进程
ps -ef | grep 'mysqld' 过滤mysql的进程 (grep 过滤 ; | 管道符)
uid 用户id
pid 进程id
ppid 父进程id
CMD 启动该进程的命令
kill(删除执行中的进程)
kill -9 : kill -9 1982
-9 最高级别的关闭进程
小注:模拟运行着进程linux中启动进程命令,可以使用tailf demo.txt ;ps -ef |grep ‘tailf’
面试:现在在linux上运行着多个flask ,不确定有多少个进程,请以简短的命令,将这些进程杀死?
ps -ef | grep 'flask' | grep -v 'grep' | awk '{print "kill -9" $2}' | sh
排除grep 批量找pid 命令执行
(后台运行进程)
crontab(定时任务)
软件安装命令
rpm(管理安装套件)
yum(Shell前端软件包管理器)
Linux命令-查看进程命令:pstree
查看进程树,ps aux查看进程,如果进程太多看起来很不方便,可以使用pstree以树形方式显示正在运行的所有进程 pstree -p 查看进程树 还是太多了,可以使用管道符进行查找httpd(apa ...
Linux命令-终止进程命令:kill
kill -l 查看进程信号 常用信号 例如: 例子参见:Linux命令-查看进程命令:pstree
linux ps查看进程命令
linux ps查看进程命令ps命令作用:将某个时间点的程序运作情况撷取下来 实例: [root@linux ~]# ps aux [root@linux ~]# ps -lA [root@linux ...
Linux ps 命令查看进程启动及运行时间
linux中启动进程命令的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux启动程序命令、linux中启动进程命令的信息别忘了在本站进行查找喔。