牛骨文教育服务平台(让学习变的简单)
博文笔记

linux下程序的前、后台切换及让进程不受终端的影响

创建时间:2014-04-17 投稿人: 浏览次数:108

环境:ubuntu 12.04LTS

         我们都知道,在Linux终端运行程序或命令的时候,在命令行的末尾加上&,就可以使程序或命令在后台运行。

一、程序的前、后台切换。

1、先看几个命令:

   1)jobs  

         显示由当前shell环境中所起的后台正在运行或者被挂起的任务信息。

         jobs –l 显示详细的信息

       

        Ps:[]中的数字表示作业ID,+表示当前作业,-表示当前作业之后的下一个作业。   

          之后的数字是进程ID,作业状态可以是Running,Stopped,Terminated(某时刻  

           的一个状态)

   2)ctrl + z  

            将一个正在前台执行的命令放到后台,并且暂停。

   3)fg   

           将一个后台的程序调到前台继续执行。(不管在后台是否执行)

           命令格式:fg  jobNumber (或fg %jobNumber)

            jobNumber是通过jobs命令查到的正在后台运行的任务的作业ID,若省     

            略则会默认是当前的作业。

   4)bg  

         让一个后台暂停的程序继续执行。

          命令格式:bg  jobNumber  (或bg %jobNumber)


2、前后台切换

  1)前台 --> 后台:

      如果程序正在前台运行,可以使用 Ctrl+z 选项把程序暂停,然后用                  

      bg命令把这个程序放到后台运行。

     

  2) 后台 -->  前台:

     

3、终止后台程序

   用kill  %jobNumber 可以终止一个后台运行的作业。

 

二、使程序可以不受终端的影响。

在终端中启动的程序会受到终端的两方面的影响:

1、终端中启动的程序一般情况下,其父进程都是终端。所有当关闭终端时,其所有的子进程都会被迫关闭。

2、SSH远程登陆时,当用户注销(logout)或者网络断开的时候,终端都会收到hangup信号,从而关闭其所有子进程。


所以要使进程不收到终端的影响,可以从两方面着手:

1、使进程忽视hangup信号。

2、改变进程的父进程,使其不属于终端的子进程。

 

据此,以下有几种方法能让进程不受终端的影响。

1、在要处理的命令前加上nohup (nohup sleep 10000 &)

   nohup的作业就是让它提交的命令忽略hangup信号。

    1) 关闭终端之前:

   

    用pstree命令,我们看到其父进程是终端:

   

   2) 关闭终端之后:

      其父进程是init(1):

   

   nohup默认将标准输出、标准错误重定向到当前路径的nohup.out文件中。当然我们自己也可以通过 > 重定向指定的文件。

 

2、使用setsid  (setsid sleep 10000&)

    使用setsid后,进程的父进程不再是终端,而是init。

     

3、使用()和 &  ( (sleep 10000 &) )

   使用() & 所提交的作业不会出现在作业列表中。

     

从上我们可以看出,()后进程的父进程变成了init(1).

 

4、disown

如果我们在命令之前忘记加nohup、setsid了就把程序运行了,这时我们可以调用disown来使作业忽略hangup信号。 Ps: 效果等同于nohup

格式:disown -h jobNumber  使某个作业忽略hangup信号

      disown -ah           使所有的作业都忽略hangup信号

      disown -rh           使正在运行的作业忽略hangup信号    

    

 

5、还可以安装screen程序来实现,这里就不多述了。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。