场景

如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?

使用linux终端时,有些命令希望在后台运行,不占用终端界面。例如耗时长的任务,或者守护进程等。

&

在命令后面加上& 实现后台运行,例如

1
sh test.sh & 

如果放在后台运行的作业会产生大量的输出,可以输出重定向到某个文件中:

1
command  >  out.file  2>&1  & 

当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。

1
2
3
ps -ef | grep 8153

kill -9 8153

nohup

当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,可以让进程忽略 HUP 信号。

nohup与&区别

使用&命令后,作业被提交到后台运行,一但把当前控制台关掉(退出帐户时),作业就会停止运行。
nohup命令可以在你退出帐户之后继续运行相应的进程。
nohup就是不挂起的意思( no hang up)。

使用方法

  1. 输入命令:
    1
    nohup command &
  2. 回车,使终端回到shell命令行;
  3. 输入exit命令退出终端:exit

nohup命令可以让你的shell命令忽略SIGHUP信号,即可以使之脱离终端运行;
“&”可以让你的命令在后台运行

可以输出重定向

1
nohup command > myout.file 2>&1 &

注意

使用了nohup之后,有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。
所以在使用nohup命令后台运行命令之后,需要使用exit正常退出当前账户,这样才能保证命令一直在后台运行

ctrl+z, ctrl+c

ctrl+z

可以将一个正在前台执行的命令放到后台,并且处于暂停状态。

ctrl+c

终止前台命令

jobs

查看当前有多少在后台运行的命令
jobs -l选项可显示所有任务的PID