关于nohup挂起后台进程,断开网络后,后台进程依旧退出的问题

文章讨论了训练yolov8时nohup挂起进程遇到的问题,涉及信号处理和终端环境影响。解决方法是先正常退出终端再断网。
部署运行你感兴趣的模型镜像

目录 

问题产生:

问题分析:

问题解决


问题产生:

        训练yolov8时,使用nohup python train > result.log 2>&1 &挂起进程,由于本地设备偶尔断网或者设备重启,重新连接后,tail -f result.log 发现进程接收到了signal:1的挂起信号。导致进程退出了。


问题分析:

1.网上搜索:

        该问题困扰了很长时间,因为网上搜索了很多方法都明确表示只要在执行之后增加进程挂起符号&即可(nohup小白可能会遇到),但是显然此次遇到的问题不是在这个地方。

2.尝试通过查看官方文档来解决:

        nohup --help 给出了nohup的官方文档链接:nohup 官方文档,通过查阅文档,文档中明确说明使用了&符号后,确实会忽略到所有的挂起信号,但是也明确说明了是在log out之后(也就是远程的终端应该正常退出)

3.对比分析:

        继续分析问题出现的原因,仔细回想了整个操作流程。大致过程为:首先通过终端使用nohup挂起进程,然后并没有退出当前终端,继续使用tail -f result.log 查看输出;过程中断网了,然后进程就退出了。而问题就出在这个地方,我是继续使用的当前终端,终端退出也是因为网络断开或者设备重启导致的,先前查阅的博客都说断网没有问题,但是都没有说清楚是不是先正常退出了当前终端之后再断开的网络。于是尝试再nohup挂起进程后,先exit退出当前进程,然后断网,重新连接后,发现后台进程的确依然存在。
4.总结:

        分析到这里大致理解了问题的关键所在。个人认为是因为当前终端远程开启的nohup,当前终端没有退出,网络断开或者设备重启(主要还是因为网络断开了),终端异常退出,可能会发送nohup无法拒绝的signal信号或者是nohup自身被kill掉了(个人推测),最终导致挂起失败了。具体的原因感兴趣可以去分析nohup的详细机制,以及终端执行exit的正常退出和网络断开退出的区别(从对比实验来看的确是存在区别的)


问题解决:

执行nohup 挂起进程后,先正常退出当前终端,执行exit即可。

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

Linux 中,将运行中的进程挂起后台执行可以通过以下几种方法实现,具体取决于当前进程的运行状态和需求。 ### 1. 将前台运行的进程挂起后台 如果进程当前正在前台运行,可以使用以下快捷键和命令组合: - **`Ctrl + Z`**:此快捷键会将当前前台进程挂起(暂停执行),并返回到 shell 提示符。此时进程的状态为 `Stopped`。 - **`bg`**:在使用 `Ctrl + Z` 挂起进程后,输入 `bg` 命令可以将该进程放到后台继续运行。例如: ``` root@master-01:~# ping www.baidu.com ^Z [1]+ Stopped ping www.baidu.com root@master-01:~# bg [1]+ ping www.baidu.com & ``` ### 2. 将进程后台模式启动 如果希望进程一开始就以后台模式运行,可以在命令的末尾添加 `&` 符号。例如: ``` root@master-01:~# ping www.baidu.com >> ping.log & [1] 1254658 ``` 这种方式可以让进程后台运行,但如果终端关闭,进程会收到 `HUP`(挂断)信号并终止。 ### 3. 避免进程因终端关闭而终止 为了确保进程在终端关闭后仍然继续运行,可以使用 `nohup` 命令。该命令会忽略 `HUP` 信号,确保进程不会因终端退出而终止[^1]。例如: ``` root@master-01:~# nohup ping www.baidu.com >> ping.log & nohup: ignoring input and appending output to 'nohup.out' [1] 1254659 ``` `nohup` 默认会将输出重定向到 `nohup.out` 文件中,除非指定了其他输出文件。 ### 4. 使用 `screen` 或 `tmux` 管理后台会话 如果需要更灵活地管理后台进程,可以使用 `screen` 或 `tmux` 工具。这些工具允许用户创建一个伪终端会话,在其中运行进程,并在断开连接后仍能保持进程运行。重新连接后,可以恢复该会话并查看进程状态[^3]。例如: ``` root@master-01:~# screen -S mysession ``` 在 `screen` 会话中运行进程后,可以按 `Ctrl + A` 然后按 `D` 键断开会话,进程将继续在后台运行。 ### 示例代码 以下是一个完整的示例,展示如何将前台运行的进程挂起后台: ```bash # 启动一个前台进程 ping www.baidu.com # 挂起进程(按下 Ctrl + Z) ^Z # 将挂起进程放到后台运行 bg # 查看后台进程 jobs # 查看所有进程 ps -aux | grep ping ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值