`
dacoolbaby
  • 浏览: 1255252 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

将你的Linux命令放在后台执行

阅读更多

文章refer to: http://www.cnblogs.com/lwm-1988/archive/2011/08/20/2147299.html 

 

   有两种方式:

   1. command & : 后台运行,你关掉终端会停止运行
   2. nohup command & : 后台运行,你关掉终端也会继续运行

command 表示你执行的shell命令,或者脚本。

 

一、 简介 
       Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务。因此在任务管理上也有别具特色的管理思想。
       我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和bg 命令,让你轻松调度正在运行的任务。假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用

Ctrl-Z ,挂起这个程序,然后可以看到系统提示:
[1]+ Stopped /root/bin/rsync.sh

 

然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &


用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &


如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh


这样,你在控制台上就只能等待这个任务完成了。

 

这里使用:

&                         将指令丢到后台中去执行
[ctrl]+z                將前台任务丟到后台中暂停
jobs                    查看后台的工作状态
fg %jobnumber  将后台的任务拿到前台来处理
bg %jobnumber 将任务放到后台中去处理
kill                       管理后台的任务

 

二、在Linux中,当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。实际上,这样是将命令放入到一个作业队列中了:

$ ./test.sh &
[1] 17208

$ jobs -l
[1]+ 17208 Running                 ./test.sh &
    在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command >out.file 2>&1 &


在上面的例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。
例:查找名为“httpd.conf”的文件,并把所有标准输出和错误输出重定向到find.dt的文件中:
# find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 &


[2] 7832
成功提交该命令之后,系统给出了它的进程号7832。 对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行,例如对正在前台执行的tesh.sh使用ctrl+z挂起它:
$ ./test.sh
[1]+ Stopped                 ./test.sh

$ bg %1
[1]+ ./test.sh &

$ jobs -l
[1]+ 22794 Running                 ./test.sh &

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)

$ echo $$
21734

$ nohup ./test.sh &
[1] 29016

$ ps -ef | grep test
515      29710 21734 0 11:47 pts/12   00:00:00 /bin/sh ./test.sh
515      29713 21734 0 11:47 pts/12   00:00:00 grep test
$ setsid ./test.sh &
[1] 409

$ ps -ef | grep test
515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
515        413 21734 0 11:49 pts/12   00:00:00 grep test


上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

$ ./test.sh &
[1] 2539

$ jobs -l
[1]+ 2539 Running                 ./test.sh &

$ disown -h %1

$ ps -ef | grep test
515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
515       2542 21734 0 11:52 pts/12   00:00:00 grep test


另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:

$ (./test.sh &)

$ ps -ef | grep test
515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
515      12483 21734 0 11:59 pts/12   00:00:00 grep test
注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

$ screen -dmS screen_test

$ screen -list
There is a screen on:
        27963.screen_test       (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng.

$ screen -r screen_test

 

三、 nohup 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。 该命令的一般形式为:
nohup conmmand &
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1
在上面的例子中,输出被重定向到myout.file文件中。

 

四、其他命令

jobs:查看当前有多少在后台运行的命令
fg:将后台中的命令调至前台继续运行。

如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg:将一个在后台暂停的命令,变成继续执行。

如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

 

分享到:
评论

相关推荐

    Linux nohup实现后台运行程序及查看(nohup与&)

    1. 后台执行 一般运行linux上的程序都是执行 .sh 文件(./sh文件...加载一个命令的最后面,表示这个命令放在后台执行 2. 查看后台运行的命令 有两个命令可以来查看,ps 和 jobs。区别在于 jobs 只能查看当前终端后台

    Linux任务前后台的切换

    Linux任务前后台的切换。最大的用处是在训练深度学习时,或者远程操作Linux时,有些任务想看,又不想让他结束,此时必须把用后台命令,把正在训练的模型任务放在后台执行,不用Ctrl+C 杀死这个任务。

    linux命令 linux教程

    1.adduser命令:增加一个系统用户  2.apmd命令:高级电源管理  3.apmsleep命令:产生配置脚本  4.apropos命令:查找用户手册的名字和相关描述 ... 7.bg命令:将程序放在后台执行  8.cd命令:切换目录

    Linux命令大全速查手册

    1.7 bg指令:将程序放在后台执行  1.8 cd指令:切换目录  1.9 chfn指令:设置finger信息  1.10 chsh指令:改变登录系统时的shell  1.11 clear指令:清除终端屏幕  1.12 date指令:显示或设置系统时间  ...

    Linux文件查找命令之find讲解.doc

    Linux下find命令在目录结构中搜索文件,并执行指定的操作... 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

    linux后台执行命令&和nohup的具体使用方法

    当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有...在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将

    Linux Find命令的使用 实现高效精准查找

    Linux下find命令在目录结构中搜索文件,并执行指定的操作。find命令提供了相当多的查找条件,功能很强大。即使系统中含有网络文件系统( NFS)...在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行。

    入门学习Linux常用必会60个命令实例详解doc/txt

    要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令...

    Linux中find命令的用法入门

    所以 find 命令很耗资源,有时候甚至会耗费很长时间,因此建议把它放在后台执行。 Find 命令格式如下所示: find pathname -options [-print -exec -ok …] 介绍一种简单易记的格式: find <指定目录> <指定...

    linux命令之find命令简单概述

    在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。 1.命令格式: find pathname -options [-print -exec -...

    Linux指令一周通 (技术图书大系).azw3

    5.4 bg指令:将程序放在后台执行 5.5 chfn指令:设置finger信息 5.6 chsh指令:改变登录系统时的shell 5.7 clear指令:清除屏幕信息 5.8 date指令:显示或设置系统时间 5.9 echo指令:字符串输出 5.10 exit指令:...

    ELDK使用与开发手册

    kermit在执行其它命令之前,会执行你的用户目录下的初始文件.kermrc,所以可以非常简单的通过初始化命令来定制kermit。下面是使用U-Boot和Linux时推荐配置: ~/.kermrc: set line /dev/ttyS0 set speed 115200 set ...

    autohidewibox:在ModKey新闻稿上执行很棒的WM命令

    这个小python守护程序将位于后台并执行该操作。 顾名思义,它还可以在配置文件中指定的隐藏或显示上执行任何自定义lua代码。安装安装xinput二进制文件。 该软件包在Debian / Ubuntu中被命名为xinput ,在Arch中被...

    orcale常用命令

    先关闭数据库,再执行正常启动数据库命令 7、startup pfile=参数文件名 带初始化参数文件的启动方式 先读取参数文件,再按参数文件中的设置启动数据库 例:startup pfile=E:Oracleadminoradbpfileinit.ora 8、...

    start-stop-daemon

    此程序能帮助你实现将命令行程序变成服务运行,比如将"java -jar xxx.jar" 放在后台执行。 ./start-stop-daemon --help start-stop-daemon 1.9.18 for Debian - small and fast C version written by Marek ...

    基于Mailserver性能监视系统

    另外当系统运行后,为了不挂起终端,我们必须将程序放在后台执行,系统中通过使用守护进程来完成该任务。 下面是本文各章节的一些简要概括:  第一章讲述了本系统的研发背景以及用到的一些技术。  第二章对系统...

    Qt Creator 的安装和hello world 程序+其他程序的编写--不是一般的好

    句,这里我们将其放到private 里,因为一般的函数都放在public 里,而变量 都放在private 里。 #ifndef WIDGET_H #define WIDGET_H #include #include "mydlg.h" //包含头文件 namespace Ui { class Widget; } ...

    管控孩子PC的相关程序

    my_exec : 执行指定的dos命令,返回标准输出的内容,和错误输出的内容 'killProcess', 给定pid,杀进程 'getProcess', 不加参数,返回所有进程信息;加pid返回pid进程信息;加caption信息,返回caption的进程信息 '...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    Tomcat是一个免费的开源的Serlvet容器,在Tomcat中,应用程序的部署很简单,你只需将你的WAR放到Tomcat的webapp目录下,Tomcat会自动检测到这个文件,并将其解压。你在浏览器中访问这个应用的Jsp时,通常第一次会很...

Global site tag (gtag.js) - Google Analytics