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