linux如何撤销后台程序(退出终端后让程序后台运行)
nohup `command` &
比如我的rails服务在退出终端之后也能跑在后台,可以这样来写
nohup `rails s -b 0.0.0.0` &
或者将rails s -b 0.0.0.0写到b.bat文件添加可执行权限后,这样:
注意:&之前有空格
如果只是临时想跑在后台,那就不需要nohup,只需要在程序最后加上&,比如:
make &
但关闭终端后,make也就一并终止、关闭了,若此时还想让程序在后台跑,真正在服务器中运行就需要在前面加上nohup, 此办法适合所有程序。
屏幕会提示:
nohup: ignoring input and appending output to 'nohup.out'
证明运行成功,nohup会把程序运行的输出信息放到当前目录的 nohup.out 文件中去,在开发时很有用,可以在程序出现异常时查看nohup.out来分析。
一定要使用Exit退出终端出现nohup提示之后需要按回车再次进入命令行,输入命令 exit 退出终端,然后再关闭终端。
如果此时直接关闭终端的话,会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown,起不到关掉终端后调用程序继续后台运行的作用。看下图,我使用git bash连接服务器后直接关闭窗口的时候会提示:
很多人刚学习使用nohup的一个误区,就是直接关闭终端窗口,但这里有个坑。nohup的后台程序有时候还能跑一会儿,就以为没问题了,其实这个后台程序已经在关闭队列中了,只是有时候没有立刻关闭。
Linux中进程概念找了下关于进程的一些知识:
在Linux中,每个进程都属于一个进程组(group),进程组有一个组长;多个进程组构成一个会话,会话是由其中的进程建立的,该进程叫做会话的领导进程(session leader)。会话领导进程的PID成为识别会话的SID(session ID)。会话中的每个进程组成为一个工作(job)。会话可以有一个进程组成为会话的前台工作(foreground job),而其他的进程组是后台工作(background job)。并不是进程组中的每个进程都是job中的内容,job是由session进程直接的“儿子”组成的,但是当job中的进程又产生子进程的时候,子进程便不是job中的内容。
每个会话可以连接一个控制终端(control terminal)。当控制终端有输入输出时,都传递给该会话的前台进程组。当前台进程组或者说job中的最后一个进程结束后,后台的session控制进程自动切换至前端,由终端产生的信号,比如CTRL Z, CTRL \,会传递到前台进程组。
会话主要是针对一个终端建立,当我们打开多个终端窗口时,实际上就创建了多个终端会话。每个会话都会有自己的前台工作和后台工作。这样,我们就为进程增加了管理和运行的层次。
我自己的理解应该是这个nohup的程序是与终端绑定在一起的,强制关闭会把后台程序一并关掉。而exit命令则会关闭掉终端,判断这个nohup是挂起,就不管了,这样就实现了后台程序继续运行的效果。观众哪位有更懂的,欢迎指导一二。
关注@爱玩的安哥,获取更多有用知识!
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com