Linux中如何让某个进程后台运行

本文介绍了六种使进程在终端断开后仍能持续运行的方法,包括使用标准service、nohup命令、在命令后添加&并放入脚本、screen、setsid命令及tmux等工具,详细解释了每种方式的使用场景和操作步骤。

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

实际使用时,即使当前终端断开,也需要进程能够一直运行,本文罗列一下可以让进程持续运行的几种方式。

1. 标准service
大部分采用rpm、deb等发行的安装包,默认都提供此种方式。而且通常情况下当程序安装完成后,会自动注册到系统的服务列表(通常是在/etc/init.d/目录创建软连接);当然也可以自己根据当前系统手动创建对应的文件来实现服务的注册(例如centos7+的systemctl方式)。

2.nohup方式
最经典的搭配即为如下方式:
nohup <command> &
不过此种情况下,所有的控制台输出默认都会被保存到nohup.out文件中,因此经常造成此文件巨大无比,所以实际使用时,经常是使用此种方式:
nohup <command> >/dev/null 2>&1 &
这里有个小插曲,因为很久没有研究后台运行这块了,我一直以为单纯的使用&就可以让进程在脱离当前会话终端长期运行,经过实践后发现并不是;而我实际一直使用的仅仅添加&就能让进程在后台运行的方式其实是下面这种方式

3.在命令后面添加&,然后将整条命令放到脚本里启动
新建一个run.sh文件,然后在其中写入如下内容:
<command> &
然后chmod +x run.sh为其添加可执行权限,之后./run.sh来执行这个脚本,此时进程虽然会输出到当前终端会话,但其实进程已经脱离了当前会话,此时你可以安全的推出会话,进程也不会退出。

4.使用screen方式
此方式实为开启了一个伪终端,进程是在伪终端中执行的,进程是通过伪终端挂载在1号进程上的

创建screen:screen -dmS screen1
查看screen列表:screen -list:
连接到某个screen:screen -r screen1
连接到screen后,正常执行命令启动进程(无需使用nohop,也不用添加&),之后使用ctrl + a + d从当前screen断开即可
5.使用setsid命令
此方式实为设置启动后的进程的父进程为1号进程来实现的:
setsid command

6.使用tmux
tmux和screen及其类似,都是使用伪终端的方式,目标进程都是挂载在伪终端中的

创建会话:tmux
退出并销毁会话(在会话中执行):输入exit 或按下ctrl + d
退出但保留会话(在会话中执行):输入ctrl + b d
接入某个会话:tmux attach -t <会话编号>
查看会话列表:tmux ls
其他tmux高阶玩法可以自行百度。
写在最后:前两天偶然想起以前的一个痛点问题,就是如果某个进程通过脚本(run.sh方式启动)或者nohup <command> &方式启动,当终端退出后如何重新查看进程的控制台输出;网上找了一通,答案都是大写的NO,不过皇天不负有心人,最后在某个犄角旮旯的角落找到了一个还能凑合使用的方案reptyr <pid>。此命令肯定是要安装的,安装完后就可以使用此命令查看目标进程的控制台输出了,但重新接入后是无法退出的,如果按下ctrl + c会终止目标进程;如果按下ctrl + z,好吧,按下这个什么反应也没有,唯一的退出方式就是右上角关闭当前终端窗口。

### 如何在 Linux 中使用 `kill` 命令终止指定进程Linux 系统中,可以通过多种方式来终止特定的进程。最常用的方法之一就是利用 `kill` 命令发送信号给目标进程以实现其终止功能[^1]。 #### 使用 `kill` 命令的基本语法 基本形式如下所示: ```bash kill [选项] PID ``` 其中 `[选项]` 是指定要传递到目标进程的具体信号,默认情况下会发送 SIGTERM (即信号编号 15),这允许程序有机会执行清理操作后再退出;而 `PID` 表示的是待结束的目标进程 ID 号[^3]。 #### 发送自定义信号至进程 除了默认的 SIGTERM 外,还可以通过 `-s`, `-n`, 或者直接跟上相应的信号名称/数值的方式改变所发信号种类。例如强行立即停止某个进程而不给予任何处理时间可采用以下方法: ```bash kill -9 PID # 或者也可以写作 kill -SIGKILL PID ``` 这里 `-9` 对应于不可被捕获或忽略的 SIGKILL 信号,它将立刻摧毁该进程及其子进程树结构[^4]。 #### 结合其他工具查找并杀死进程 当不知道确切的 PID 数字时,可以借助诸如 `pgrep`, `pkill` 这样的辅助命令快速定位所需终结的服务实例。比如下面这条语句能够一次性清除掉所有名为 "java" 的运行中的 Java 应用程序副本: ```bash kill -9 $(ps -ef | grep java | awk '{print $2}') # 更简洁版本可能是这样 pkill -f java ``` 上述例子展示了两种不同的途径达成相同目的——前者手动解析 ps 输出结果获取 PIDs 列表再逐个调用 kill ,后者则是更高效地运用专门设计用来按名字模式匹配杀戮的一键式解决方案 pkill 。注意,在实际部署前最好确认好筛选条件以免误伤无辜正常工作的服务组件[^2]。 #### 小结 综上所述,掌握如何恰当地选用合适的参数以及灵活搭配周边实用的小技巧可以帮助我们更加得心应手地管理和维护我们的服务器环境下的各种后台作业流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值