linux避免进程随终端关闭而被关闭

通常我们在终端运行命令来启动进程,但是当我们退出这个时,所启动的进程会被系统强制关闭,此篇文章,讨论一下,怎么解决这个问题。

这里指的终端既可以是你启动的一个bash,或者你在另外一段启动的ssh客户端;你启动的进程是以前台方式运行还是后台方式运行(就是命令行后面加一个&),终端关闭,进程同样会被系统关闭。

有2种方式来解决此问题:

  • nohup
  • disown

这两种方式有一个共同的特点,就是最后效果都是将我们的进程提交给系统的根进程(祖先进程),进程号为1的init进程来管理,因为它不会被系统关闭知道关机,因此我们进程可以持续运行。

  1. nohup
no hang up的缩写,就是不要挂起。使用方法:

nohup mycmd &

mycmd就是你要执行的命令/进程,nohup会把mycmd进程到输出定位到当前目录的nohup.out,如果当前目录该用户没有写权限,则写到该用户的家目录下面。当执行完此命令后,你可以使用 pstree或者ps查看,此进程的父进程是不是init


  1. disown
        就是放弃拥有该进程的权利,放弃的结果就是init这个进程收养该进程。
使用方法是先以后台方式运行进程:

mycmd &

你执行此命令后,终端会立即输出进程号,比如是2222, 此时你使用ps或者pstree查看此进程的父进程,会发现父进程是你正在使用终端,然后执行:

disown 2222

这里的2222应为你实际的进程号。执行完此命令后,就完成了将进程管理权限移交给系统祖先进程init。
如果想在关闭ssh连接后刚才启动的程序继续运行怎么办,可以使用nohup。但是如果要求第二天来的时候,一开ssh,还能查看到昨天运行的程序的状态,然后继续工作,这时nohup是不行了,需要使用screen来达到这个目的。

虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。
其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

1)使用
执行screen , 按任意键进入子界面;
我用ping命令开始执行,如果下班了,但是想关闭ssh以后ping继续运行,那么按ctrl+a   再按d   这样暂停了子界面,会显示[detached]的字样,这时候 我回到了父界面;
用screen –ls查看目前子界面的状态screen -ls
There is a screen on: 22292.pts-3.free (Detached)
1 Socket in /tmp/screens/S-root,这里的22292其实是子界面的pid号;

如果回到子界面 用screen –r 22292,一下子弹到了ping 的子界面;

版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

Leave a Reply

Your email address will not be published. Required fields are marked *