目录
问题解决:
问题产生:
训练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即可。