Linux后台执行命令

一、&

当在前台运行某个作业时,Shell终端会被该作业一直占用,我们可以在命令后面加上&实现命令在后台运行,例如:sh test.sh &

但如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

command  >  log.out  2>&1  & 

这样,所有的标准输出和错误输出都将被重定向到一个叫做log.out的文件中。

使用&命令后,作业被提交到后台运行,虽然当前Shell终端没有被占用,但是有可能一但把当前Shell终端关掉(退出帐户时),作业就会停止运行。那么怎么确定终端关闭时,作业是否会停止了,可以通过如下命令查看:

$ shopt | grep huponexit

如果输出的是huponexit on就代表是Shell终端退出时,会发送hangup挂断信号给子进程,子进程收到hangup信号后也就退出了。

当作业提交成功以后,就会输出一个进程号,可以用它来监控该进程,或杀死该进程:(ps -ef | grep 进程号 或者 kill -9 进程号
2>&1 是将错误提示信息的输出重定向到标准输出,而这里的标准输出已经重定向到log.out文件,也就是说标准的错误提示也直接输出到log.out文件中。

二、nohup

nohup命令可以在退出Shell终端之后继续运行相应的进程。nohup就是no hang up(不挂起)的缩写,表示不发送hangup信号。该命令的一般形式为:

nohup command &

如果使用nohup命令提交作业,那么在默认情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup command > myfile.out 2>&1 &

三、Ctrl+Z结合jobs和bg

Ctrl+Z命令可以将当前的前台任务转后台,放到后台任务池中,虽然此时前台窗口就变成非阻塞状态了,但转过去的任务在后台默认是冻结状态,所以还需要使用bg命令将后台冻结的任务再次运行起来,bg命令的用法如下:

bg 任务ID   # 可以使用jobs命令查看任务ID