需求

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 <PID>使任务继续运行。

相关内容