linux下程序的前、后台切换及让进程不受终端的影响
环境: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程序来实现,这里就不多述了。
- 上一篇: linux-ubuntu终端切换桌面方法
- 下一篇: Linux 前后台进程切换