直接后台运行:

1
2
3
$ nohup bash  run.sh 2>&1 &                                                                     
[1] 31520
nohup: ignoring input and appending output to 'nohup.out'

其中31520表示作业id。

  • 如果不加nohup, 当终端退出时,run.sh对应的进程会收到SIGHUP信号,而进程对SIGHUP信号的默认处理方式是终止,这显然不是我们想要的。
  • 而加上nohup之后,run.sh对应的进程会忽略SIGHUP信号,即终端退出并不影响进程继续运行.

前台运行转后台

如果已经在前台运行的任务,不希望杀死,怎么切到后台呢?

输入ctrl + z 将该前台任务挂起

1
2
^Z
[1] + 32295 suspended bash run.sh

运行jobs命令,查看任务号(可以看到run.sh对应的任务号是1)

1
2
$ jobs                                                                                                  
[1] + suspended bash run.sh
  • 运行bg命令,将任务从前台转到后台
1
bg %1
  • 输入disown -h %1将这个任务转为nohup运行

后台运行转前台

既然任务可以从前台转后台,那反过来从后台转前台是否可行呢?答案是可以的 首先以后台运行run.sh

1
2
3
$ nohup bash  run.sh 2>&1 & 
[1] 482
nohup: ignoring input and appending output to 'nohup.out'

查看后台任务

1
2
$ jobs
[1] + running nohup bash run.sh 2>&1

运行fg命令,将任务从后台转到前台

1
2
$ fg %1                    
[1] + 482 running nohup bash run.sh 2>&1

实战

来一个go

1
2
3
4
5
6
7
8
9
10
11
12
package main

import ("time"
"fmt")

func main() {
for i:=0;i<1000;i++{
fmt.Printf("%v\n",i) //标准输出,用来写文件
println(i) //屏显
time.Sleep(1*time.Second)
}
}

运行:

go run main.go > out