如何让终端运行的任务不受终端关闭影响

本文介绍如何在Linux环境下使程序在后台持续运行的方法,包括使用&符号、nohup命令、setsid命令以及screen工具等技巧。

http://16.157.69.125:8182/document/YXjSKQIcDl0pZkF9dCC97Q/paginate

最近在工作中需要在linux上运行一个java 程序,去download 一大堆的图片,但是每次关掉终端,任务也同时停止了,这很正常, 因为是在同一个进程里吗

在网上找了篇文档,不错,写得很透彻,分享以下
http://www.heibai.net/article/info/info.php?infoid=43389


在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:

$ ./test.sh &
[1] 17208

$ jobs -l
[1]+ 17208 Running ./test.sh &

对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:

$ ./test.sh
[1]+ Stopped ./test.sh

$ bg %1
[1]+ ./test.sh &

$ jobs -l
[1]+ 22794 Running ./test.sh &

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者 setsid将将父进程设为init进程(进程号为1)

$ echo $$
21734

$ nohup ./test.sh &
[1] 29016

$ ps -ef | grep test
515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh
515 29713 21734 0 11:47 pts/12 00:00:00 grep test

$ setsid ./test.sh &
[1] 409

$ ps -ef | grep test
515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh
515 413 21734 0 11:49 pts/12 00:00:00 grep test

上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

 

我本人试过,disown不起作用,

我现在是这样做的

ps -ef的到pid

然后kill pid

 

 


注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

$ screen -dmS screen_test

$ screen -list
There is a screen on:
27963.screen_test (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng.

$ screen -r screen_test

 

<think>我们参考了用户提供的引用内容,特别是引用[1]和引用[2]中提到了让进程在后台可靠运行的方法,以及引用[4]中提到的关闭、退出影响后台任务的需求。 用户的需求是:让tar命令在后台运行不受终端断开影响。 根据Linux系统知识,我们可以采用以下几种方法: 1. 使用`&`将命令放入后台,然后配合`nohup`命令来忽略挂断信号(SIGHUP),这样即使终端断开,进程也会终止。 2. 使用`screen`或`tmux`等终端复用工具,在会话中运行命令,然后分离会话,即使断开连接,任务也会继续运行。 3. 使用`disown`命令将后台任务从当前shell的作业表中移除,使其再接收SIGHUP信号。 由于用户明确提到了tar命令,我们以tar命令为例进行说明。 方法一:使用nohup 命令格式:`nohup tar -czf archive.tar.gz /path/to/directory &` 这样,tar命令会在后台运行,并且所有输出会被重定向到当前目录的nohup.out文件中(除非另外指定输出)。 方法二:使用screen 步骤: a. 创建一个screen会话:`screen -S tar_session` b. 在screen会话中运行tar命令:`tar -czf archive.tar.gz /path/to/directory` c. 按`Ctrl+A`然后按`D`分离会话(detach) d. 此时可以断开终端任务继续运行。 e. 重新连接后,使用`screen -r tar_session`恢复会话查看进度。 方法三:使用disown a. 运行tar命令并放入后台:`tar -czf archive.tar.gz /path/to/directory &` b. 使用`jobs`命令查看作业号,假设为1 c. 使用`disown %1`将作业号为1的任务从作业表中移除,这样即使终端断开,任务会终止。 注意:方法三中,如果任务已经开始,也可以使用`Ctrl+Z`将任务挂起,然后使用`bg`将其放入后台,再使用`disown`。 根据引用[2]的内容,使用`&`将任务放入后台后,会显示一个任务ID,然后可以使用`bg`命令将其转为后台运行(其实已经后台运行了,这里可能是为了强调),过引用中已经显示了`&`的作用。而使用`disown`可以使其不受终端断开影响。 用户需求是“后台运行不受终端断开影响”,所以上述三种方法均可,但常用的是方法一和方法二。 考虑到用户可能希望简单操作,我们推荐方法一(nohup)和方法二(screen)。其中,nohup简单直接,screen则适合需要交互或观察进度的场景。 因此,我们可以这样回答用户: </think>要在后台运行 `tar` 命令并确保其不受终端断开影响,可采用以下方法: ### 方法一:`nohup` + `&`(推荐) ```bash nohup tar -czf archive.tar.gz /path/to/directory & ``` - **原理**: - `&`:将命令放入后台运行(释放终端)[^2][^4] - `nohup`:忽略挂断信号(SIGHUP),终端关闭时进程继续运行[^1][^4] - **输出**: - 默认保存到 `nohup.out`(可通过 `>` 重定向) - **验证**: ```bash jobs -l # 查看后台任务 ps aux | grep tar # 检查进程 ``` ### 方法二:`screen`/`tmux`(交互式场景) 1. 创建会话: ```bash screen -S tar_session ``` 2. 在会话中执行命令: ```bash tar -czf archive.tar.gz /path/to/directory ``` 3. 按 `Ctrl+A` → `D` 分离会话 4. 重新连接: ```bash screen -r tar_session # 恢复会话查看进度 ``` - **优势**:可随时查看实时输出[^4] ### 方法三:`disown`(已启动的任务) 1. 启动任务(忘记加 `nohup` 时补救): ```bash tar -czf archive.tar.gz /path/to/directory & ``` 2. 移出作业列表: ```bash jobs # 查看任务ID(如 [1]) disown %1 # 解除关联[^2][^4] ``` ### ⚠️ 关键注意事项 1. **输出处理**: - 重定向输出避免占用终端:`nohup tar ... > log.txt 2>&1 &` 2. **压缩大文件**: - 建议添加 `--warning=none` 屏蔽警告: ```bash nohup tar --warning=none -czf ... & ``` 3. **网络传输场景**: - 若通过 SSH 执行,先用 `screen` 或 `nohup` 启动任务再断开连接[^1][^3] > 实践建议:简单任务用 `nohup`,需交互查看进度用 `screen`,临时补救用 `disown`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值