# 需求 `Linux`用户有时有这样的需求: 使用终端执行一个程序,之后发现这个任务需要执行很长时间,但是因为已经执行一段时间了不想中断后重新执行,为了避免终端超时等原因任务被中断,想把正在执行的任务切换到后台继续运行。 可以按照本文介绍的方法操作。 # 方法 假设,前台执行了一个长任务: ``` [fairyfar@test-1 ~]$ sleep 1000s ``` Step 1. 使用`Ctrl + Z`将上述任务切换到后台: ``` [fairyfar@test-1 ~]$ sleep 1000s [1]+ Stopped sleep 1000s ``` Step 2. 使用`jobs`命令可以查看所有后台任务: ``` [fairyfar@test-1 ~]$ jobs [1]+ Stopped sleep 1000s ``` 使用`ps`可以看到该进程已经切换到后台,并且处于`Stopped`状态(`T`状态): ``` [fairyfar@test-1 ~]$ ps ux | grep sleep fairyfar 82006 0.0 0.0 108056 360 pts/0 T 17:28 0:00 sleep 1000s ``` Step 3. 使用`disown`命令将后台任务从当前`Shell`的作业列表中移除: ``` [fairyfar@test-1 ~]$ disown %1 -bash: warning: deleting stopped job 1 with process group 82006 [fairyfar@test-1 ~]$ ps ux | grep sleep fairyfar 82006 0.0 0.0 108056 360 pts/0 T 17:28 0:00 sleep 1000s ``` Step 4. 此时该任务仍然处于Stop状态,需要让其继续运行,可以通过发送`SIGCONT`信号(对应`-18`)使任务继续运行: ``` [fairyfar@test-1 ~]$ kill -SIGCONT 82006 # 或者kill -18 82006 [fairyfar@test-1 ~]$ ps ux | grep sleep fairyfar 82006 0.0 0.0 108056 360 pts/0 S 17:28 0:00 sleep 1000s ``` 可以看到,任务已经继续运行(`S`状态)。 此时可以尝试断开客户端连接,重新连接可以看到任务仍然在后台运行。 # 总结 就4步: 1. `Ctrl+Z`切换到后台。 2. 使用`jobs`查询后台任务编号。 3. 使用`disown %JobId`从当前终端“脱钩”。 4. `kill -SIGCONT `使任务继续运行。 # 相关内容 - [将后台运行的进程调度调度到前台](将后台运行的进程调度调度到前台)