Linux把程序放后台运行,退出终端仍运行,查看,终止

本文详细介绍了nohup命令的用法及其与后台进程的关系,解释了如何使用nohup使程序在后台持续运行,即使终端关闭也不受影响。同时,文章探讨了nohup与&的区别,以及如何通过ps、kill等命令管理和终止后台进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nohup用法

用途:不挂断地运行命令。
语法:nohup Command [ Arg … ] [ & ]
描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

操作系统中有三个常用的流:
  0:标准输入流 stdin
  1:标准输出流 stdout
  2:标准错误流 stderr
  一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。

下面步入正题:

前提(因为我是以这个命令为例子的,如果不安装就把http-server替换成其他命令行命令): 安装nodejs,然后再安装http-server模块(npm i -g http-server)

nohup http-server -p 80 >output 2>&1 &

解释:

  1. 带&的命令行,即使terminal(终端)关闭,或者电脑死机程序依然运行;
  2. 2>&1的意思
      这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的.
      这就是为什么有人会写成: nohup http-server -p 80 >output 2>output出错的原因了

/dev/null

最后谈一下/dev/null文件的作用,这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。 所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1

nohup http-server -p 80 >/dev/null 2>&1 &

&

用途:在后台运行

一般两个一起用

nohup command &

nohup和&的区别

&:是指在后台运行,当用户退出(挂起)的时候,命令自动跟着结束

nohup:不挂断的运行,注意并没有后台运行的功能,就是指用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行

因此将nohup和&结合使用,就可以实现使命令永久地在后台执行的功能

查看运行的后台进程

1)jobs -l
jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)
2)ps -ef
ps -aux|grep http-server
a:显示所有程序
u:以用户为主的格式来显示
x:显示所有程序,不以终端机来区分
注:
  用ps -def | grep查找进程很方便,最后一行总是会grep自己
  用grep -v参数可以将grep命令排除掉

ps -aux|grep http-server| grep -v grep

再用awk提取一下进程ID

ps -aux|grep http-server| grep -v grep | awk '{print $2}'

终止后台运行的进程kill

查看使用某端口的进程
lsof -i:80
netstat -ap|grep 80
查看到进程id之后,使用netstat命令查看其占用的端口
netstat -nap|grep 7779(这个是上一个命令的liten列里的端口号)
使用kill杀掉进城后再启动
kill -9 进程号

注意事项

使用nohup后,应确保用exit命令退出当前账户,非常正常退出或结束当前会话,在后台运行的作业也会终止

实例

1、把程序放后台运行,简单的话,只要在命令后面加一个“&”, 如: php test.php &

2、或者在运行命令后,按一下 Ctrl+Z,如运行 php test.php 后,按一下 Ctrl+Z

3、程序在后台运行了,但还是看到输出信息,可以用管道命令把输出定向到 /dev/null,如:php test.php >/dev/null

4、普通的输出信息看不到了,但还是看到一些信息,如错误信息等,需要再添加 2>&1 命令,如:php test.php >/dev/null 2>&1 &

5、程序在后台运行了,但退出当前会话,发现程序还是停止了,此时要用nohup命令,如:nohup php test.php >/dev/null 2>&1 &

6、使用nohup后,应确保用exit命令退出当前账户,非常正常退出或结束当前会话,在后台运行的作业也会终止

7、命令在后台运行了,怎么查看?

使用jobs命令可列出当前会话的后台任务

,jobs -l 能查看到 PID,进而可以用kill终止某个任务

<think>好的,我现在需要回答用户的问题:如何在操作系统中将前台运行程序切换至后台运行。首先,我得确定用户的操作系统环境,因为不同的系统可能有不同的方法。但根据用户提供的引用内容,他们提到了Ubuntu和top命令,所以可能主要是在Linux环境下。 用户提供的引用[2]提到了使用top命令查看进程状态,而引用[4]提到了man文档的操作,这些都是Linux相关的。因此,我应该集中讨论Linux系统中的方法。 在Linux中,将前台程序切换到后台通常涉及终端操作。比如,用户可能启动了一个程序,比如长时间运行的脚本,然后想要将其后台以便继续使用终端。常见的方法包括使用Ctrl+Z暂停程序,然后使用bg命令在后台继续运行。另外,在启动命令时添加&符号可以直接让程序后台运行。 此外,可能需要提到jobs、fg、bg等命令来管理后台任务,以及使用nohup或disown来保持程序终端关闭后继续运行。需要确保这些步骤清晰,并且语法正确,比如使用&符号或Ctrl+Z的正确方式。 还要注意是否需要结合用户提供的引用内容。引用[1]提到了中断技术和操作系统管理程序运行,这可能与进程的挂起和恢复有关。因此,在解释Ctrl+Z暂停进程时,可以提到中断技术的作用,如引用[1]所述的中断技术由操作系统管理程序运行。 另外,引用[3]提到了Activity的onStop()方法,但这是Android相关的,可能和当前问题无关,可以忽略。引用[4]的man文档可能帮助用户查找命令的具体用法,比如man bash或man jobs,可以建议用户查阅相关手册。 需要确保回答结构清晰,分步骤说明,包括直接后台启动、暂停并切换、管理后台任务,以及保持进程运行的方法。每个步骤给出示例命令,并解释相关命令的作用。同时,引用相关的引用内容来支持解释,比如提到中断技术时引用[^1],提到进程状态时引用[^2]。 可能还需要生成相关问题,如如何查看后台任务、如何终止后台进程、如何让后台任务在退出终端后继续运行等。这些问题应该与用户的问题相关,帮助他们进一步学习进程管理。 最后,检查LaTeX格式是否正确,但问题中可能不需要数学公式,所以可能不涉及。但如果有命令中的符号需要转义,如&,应确保正确显示。</think>### 如何将前台运行程序切换至后台运行? 在操作系统中(以Linux为例),将前台程序切换到后台运行通常通过终端命令实现,主要涉及进程控制与作业管理。以下是具体方法: --- #### 1. **直接启动程序后台** 在命令末尾添加 `&` 符号,程序会直接在后台运行: ```bash python long_script.py & ``` - **效果**:终端可继续输入其他命令,但程序输出仍会显示在终端。 - **引用支持**:类似后台进程的管理依赖操作系统的中断技术[^1]。 --- #### 2. **将已运行的前台程序切换到后台** 若程序已在前台运行,可通过以下步骤切换: - **步骤1**:按下 `Ctrl + Z` 暂停程序。 - **步骤2**:输入 `bg` 命令将暂停的进程转为后台运行: ```bash bg %1 # 指定作业号(通过`jobs`查看) ``` - **示例**: ```bash $ python long_script.py ^Z # 按下Ctrl+Z暂停 [1]+ Stopped python long_script.py $ bg %1 # 切换到后台继续运行 ``` --- #### 3. **管理后台任务** - **查看后台任务**:使用 `jobs` 命令: ```bash jobs -l # 显示作业号、进程ID、状态 ``` - **切回前台**:使用 `fg` 命令: ```bash fg %1 # 将作业1切回前台 ``` - **引用支持**:通过 `top` 命令可查看进程状态(如睡眠状态 `S`)。 --- #### 4. **保持后台程序持续运行** 若希望退出终端程序运行,需使用 `nohup` 或 `disown`: - **方法1**:启动时使用 `nohup`: ```bash nohup python long_script.py > output.log 2>&1 & ``` - **方法2**:对已运行程序使用 `disown`: ```bash jobs -l # 查看作业号 disown %1 # 脱离终端关联 ``` --- ### 关键原理 - **中断与作业控制**:`Ctrl + Z` 触发中断信号(SIGTSTP),操作系统将进程挂起并移交控制权。 - **进程状态**:后台进程状态可能为 `Running (R)` 或 `Sleeping (S)`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值