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

文章讨论了训练yolov8时nohup挂起进程遇到的问题,涉及信号处理和终端环境影响。解决方法是先正常退出终端再断网。

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

目录 

问题产生:

问题分析:

问题解决


问题产生:

        训练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即可。

### 如何实现程序后台运行与进程挂起 为了确保程序能够在后台持续运行并防止因终端关闭而导致中断,可以采用多种方法来管理后台任务和挂起进程。以下是几种常见的解决方案: #### 方法一:使用 `&` 符号 通过在命令后面加上 `&` 可以将程序放到后台运行[^1]。然而,这种方法存在局限性——当终端会话结束时(例如关闭终端窗口),程序仍然可能被终止。 ```bash ./main60 & ``` 尽管此操作可以让程序暂时进入后台模式,但如果终端关闭,则系统可能会发送 SIGHUP 信号给该程序,从而导致其退出。 #### 方法二:利用 `nohup` 命令 为了避免上述问题的发生,推荐使用 **nohup** 工具。它能够屏蔽掉来自父 shell 的 HUP (HangUp) 信号,使得即使用户登出了当前 session 或者断开了连接,子进程依然保持活跃状态[^3]。 基本语法如下所示: ```bash nohup ./main60 & ``` 默认情况下,所有的标准输出和错误信息会被写入到名为 `nohup.out` 的文件里;如果希望自定义日志路径,则可以通过重定向指定目标位置[^4]: ```bash nohup ./main60 > /path/to/logfile.log 2>&1 & ``` 这里需要注意的是,“>”用于覆盖原有内容而“>>”则追加新数据至现有文档结尾处。“2>&1”的含义是将stderr(标准错误流, 文件描述符为2)也导向stdout(标准输出流, 文件描述符为1),这样就可以统一处理两者的信息了。 此外还可以借助其他工具如 screen/tmux 来创建独立于任何特定客户端的新session,在这些环境内部执行长期运行的任务就不会受到外部因素干扰影响正常工作流程了。 最后要提醒一点,对于某些特殊场景下的应用来说仅仅依靠简单的守护机制或许并不足够可靠,此时应该考虑编写正式的服务脚本或者部署专业的服务管理系统比如 systemd unit files 等更高级别的配置方案来保障业务连续性和稳定性。 #### 方法三:Screen/Tmux 多路复用器 除了前面提到的技术手段之外,还有另外一种非常实用的方式叫做 terminal multiplexer(终端多路复用器)。其中最流行的两个选项分别是 GNU Screen 和 Tmux 。它们允许在一个单独物理或虚拟控制台上同时打开多个分离式的shell sessions ,并且支持随时切换回来继续之前的工作进度而不受网络状况变化的影响。 安装 tmux 后可按照下面步骤操作: ```bash tmux new -s mysession # 在这个新的 session 中启动您的应用程序... ./main60 # 脱离当前 session 并返回原始 shell 提示符下 Ctrl+b d ``` 稍后想重新接入刚才那个脱离出来的 session 就只需输入: ```bash tmux attach-session -t mysession ``` 这种方式特别适合那些需要长时间交互式监控调试的应用场合。 --- ### 总结 综上所述,针对不同需求可以选择合适的策略组合起来达到最佳效果。简单快速的话可以直接尝试 nohup后台标志位的方法即可满足大部分日常开发测试用途;而对于更加复杂持久型的企业级应用场景而言,则建议深入研究学习诸如 systemd service units 配置或是专业容器编排平台 Kubernetes 上的相关功能特性等内容进一步提升运维效率和服务质量水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值