Linux不挂断后台运行

nohup

1
nohup command params >/dev/null 2>&1 &

nohup 表示终端关闭时不挂断程序,否则会因为SIGHUB信号在关闭终端时自动结束程序

command params 是需要执行的命令和命令参数

>/dev/null 表示将标准输出重定向到空设备即丢弃输出,也可以改成重定向到指定的文件

2>&1 表示将stderr错误输出重定向到标准输出

最后的 &表 示在后台执行

jobs

查看当前终端放入后台的工作,可以使用 -l 参数增加显示PID

对于前台执行的程序,通过ctrl+z,可以挂起程序,再使用

1
bg [%job_num]

可以将程序放到后台继续执行,%job_num是任务编号,可以省略,省略时操作最后一个非后台运行的程序

也可以将程序放回前台执行,通过

1
fg [%job_num]

disown

在后台执行和是否会挂断是两件事。

我们前面通过 ctrl+z,bg 把任务放在后台运行,但是终端退出仍然会被自动结束,使用

1
disown -h [%job_num] 

可以将任务免于挂断,相当于补了一个nohup

-h 选项的意思是只标记不挂断,而不移出任务列表,通过jobs命令仍然可以看到,如果不加-h 则会移出任务列表同时标记不挂断。

screen

前面讲了如何在后台执行程序并免于挂断,但有时候我们还希望和程序交互,在后台执行就并不方便了,这时候我们可以通过screen在前台执行,同时免于挂断,一个screen就相当于一个可以随时断开随时可以恢复的终端窗口。

新建一个名为name的screen

1
screen -S name

重新连接到名为name的screen

1
screen -r name

附到一个连接状态名为name的screen

1
screen -x name

查看当前的screen列表

1
screen -ls

断开连接当前screen

1
ctrl+a d

reptyr

从一个终端(或后台)接收运行的进程,并将其迁移到另一个终端(的前台)。

1
reptyr -T <PID>

这个命令我就没成功执行过。不知为何