Skip to main content
  1. Posts/

linux将正在执行的任务转移到后台

·101 words·1 min
Post Blog Linux
Gwen0x4c3
Author
Gwen0x4c3
java n go is my mother tongue
Table of Contents

使用场景
#

我在用tar解压一个几百G的文件,开始解压的时候没有nohup,已经解压了一些内容了,不舍得终止重新解压,于是找到了下面的方法

步骤
#

你的机器不一定支持,可以先用下面的小脚本,新开个连接测试一下

vim test

##### 输入下面内容
#!/bin/bash
# 循环150次
for i in {1..150}
do
  # 将当前数字展示并写入文件
  echo $i
  echo $i >> output.txt
  # 休眠1秒
  sleep 1
done
echo "任务完成"
##### 输入上面内容

chmod +x ./test
# 运行
./test

然后测试下面的步骤

挂起进程
#

按下Ctrl+z ,把当前正在执行的进程挂起

image-20241229105326602

如果没有提示,可以输入jobs -l 查看作业和对应的PID

gwen@server308:~/codes/python$ jobs -l
[1]+ 626621 已停止               ./test

转移到后台执行
#

主要是两个命令:bgdisown

# 首先jobs -l列出当前暂停的任务
jobs -l
# [1]+ 626718 已停止               ./test

# 然后执行bg n,这个n是jobs显示的[1]+中括号里面的数字
# bg之后他就会在后台运行了,此时你可以在终端执行其他指令,可以正常输入
# 执行完bg后会发现控制台在正常输出数字,output.txt文件也在不断追加内容
bg 1
# [1]+ ./test &

# 然后disown -h %n,n也是上面的数字,当前ssh连接断开后,作业也不会结束
disown -h %1

注意执行完bg后,不要直接断开连接,因为此时那个任务还是属于当前会话的,断开会话之后作业就终止了,还需要disown将这个作业与当前会话解除绑定,才能退出

查看效果
#

新建个连接,tail -f output.txt可以看到文件在不断变化

ps -ef |grep test,可以看到此时test的父进程可能还不是1,但是在断开原来启动作业的那个连接之后,父进程ID变成了1