使用场景 #
我在用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
,把当前正在执行的进程挂起
如果没有提示,可以输入jobs -l
查看作业和对应的PID
gwen@server308:~/codes/python$ jobs -l
[1]+ 626621 已停止 ./test
转移到后台执行 #
主要是两个命令:bg
和 disown
# 首先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