nohup

There are 1 entries for the tag nohup

Linux任务的高级管理:程序后台运行及控制

MitchellChu 2014-06-18 Unix & Linux

在Bash下操作,不可避免的需要让程序运行在后台而不妨碍前台的操作。在Linux有个概念称之为Job Control,由于Bash下的运行的任何程序都是当前Bash下的子程序,而job control也即管理当前Bash下的子程序。所以,Job Control的概念是不能跨Bash管理,比如我们不能在tty1中管理tty2中的程序。 其中我们在Bash中最常用的应该就是&符了,这个符号跟在要运行的程序的后面,像下面这样: ping blog.useasp.net & 这样配置后,我们将会发现,运行后,系统返回的是类似下面这样的: [1] 23911 这样我们就将这个ping放到了当前Bash的后台进行运行,我们此时仍可以正常的在Bash下进行其他的操作。但是你也许会发现这种方式运行的程序虽然不影响你当前操作,但是运行的输出却总是和我们抢占Bash的屏幕,非常的郁闷!但当我们想Ctrl+C来终止的时候,却又无能为力——因为在Bash下你Ctrl+C根本无法终止这个后台运行的程序! 为了防止这种情况,我们需要用到重定向(Redirection),如果你不太清楚,可以本博客之前的博文《Linux下高效编写Shell-Shell特殊字符汇总》篇里面的重定向,代码变化不大,类似下面这样: ## 重定向输出到/dev/null这个特殊文件 ## 也就是没有输出内容了 ping blog.useasp.net &>/dev/null & 当然,我们一般更希望后台运行的程序的输出能够保存到指定文件,而不是直接丢弃,所以更一般形式是: ping blog.useasp.net >>/tmp/background_programs.log 2>&1 & ## 想想这是什么意思? 但我们在这里是要Bash界面能够不被后台的程序搞砸。——毫无疑问,我们前一种已经达到了我们要的效果。  恩,迄今为止我们已经能够将程序放到后台运行了,但是,对于已经占据我们Bash的程序,我们却无能为力,为了不让它们继续霸占我们的Bash屏幕,我们迄今能做的只有Ctrl +C,让它见鬼去吧!这样我们跑了很久的程序也就终结了,不过,运行的数据可能也没有了。也许更温柔一点是个不错的选择——Ctrl+Z! Ctrl+Z是让程序暂停,在已经运行的程序上直接按下Ctrl+Z,他们就会非常自觉的将自己挂起,并放入到后台中,此时的程序是处于停止状态的,如果要让他在后台运行,就还要用到后面将学到的命令。但此时,我们的Bash屏幕能恢复干净清爽才最主要。  好了,在这难得平静的Bash界面上,让我们来学习下job control的一个命令吧,也许我们后台已经有一堆程序在跑呢,我们怎么也得看看才放心,jobs命令就是让我们干这个事情的: jobs [-lnprs] [jobspec ...] or jobs -x command [args] 参数: -l 列出后台程序的job number,PID, 状态和命令串 -n 显示自从上次用户知晓状态后程序改变过状态的程序 -r 仅列出正在后台运行(RUNNING)的程序 -s 仅列出后台中处于停止(STOPPED)的程序 更详细的内容可以参看man,这里基本够我们用了。 用用看,你也许会发现你的后台有很多程序在运行哦,同时你也会看到一些不同的地方,比如: jobs -l [1]- 10314 Running ping blog.useasp.net &>/dev/null & [2]+ 10833 Stopped emacs (wd:~) 中括号后面的竟然有+和-号,这是什么?这个是Bash根据我们放入后台的顺序的一个标记,+号表示最近被放到后台的程序,-号次之,如果有三个以上,我们就会发现第三个以上是没有+/-符号的。而下面我们将要看到的fg在取出后台程序的时候,+号在默认情况下就是那个被切换到前台的程序了。 既然上面我们说了fg,那就看看它是干什么的。fg应该是foreground的简写,即前台,它的作用是将在后台的程序切换到前台来运行。在切换的时候,fg可以指定参数——Job Number! ## 使用上面的jobs -l中的例子 fg ## 这个切换到前台运行的程序将会是emacs——Why? ## 或者我们使用下面这种形式 fg...

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。