大家好 在linux上运行一个java程序 程序是一个死循环每10分钟循环一次 大概20个小时左右程序就不再运行

嘿兄弟,我以前也遇到过这种情况。
我记得去年夏天,我在公司做一个项目。
Java程序在Linux上运行,但运行了2 0个小时后突然停止了。
当时我们都陷入了两难的境地。

一开始我们猜测是内存溢出,因为程序消耗了太多内存,但是排查了很长时间没有发现明显的内存泄漏。
后来检查了CPU和IO,发现不是这两个原因造成的。
程序的CPU和IO使用率保持相当稳定。

后来怀疑是不是网络问题,但是检查了网络连接,没有发现中断或者超时的情况。
经过检查代码逻辑,我发现实际上存在一个无限循环,但是这个循环会每1 0分钟执行一次,并且不会停止程序。

最后怀疑是系统更新还是权限问题。
经查,当天是系统更新日,程序在更新过程中终止了。
然后我们检查了权限,发现确实是权限问题。
该程序没有足够的权限来访问某些资源。

所以,我们最终是这样解决的:首先,我们添加了日志记录,这样一旦程序出现问题,我们就可以快速定位问题所在。
然后,监控资源使用情况以确保CPU和内存使用率不会太高。
接下来审查了代码,特别是资源管理和网络请求部分。
最后,我们还检查了权限以确保调整程序有足够的权限运行。

这件事给了我一个教训,开发的时候要考虑所有的可能性,而不是只关注某一点。
根据你的情况,我觉得你可以尝试一下我刚才提到的方法。
我希望他们能帮助你。

linux笔记

结论: 1 . Case 语句,如 if-elif-else,用于测试多个分支的条件。
请注意 $ 变量名称和值后面的分号语法。
2 、While循环用于当条件成立时重复执行,当条件成立时继续执行。
支持算术表达式和let命令。
3 . 注意变量引用和算术运算,避免语法错误。
4 . 应考虑循环效率,避免无限循环,适当使用break和continuation。

【Linux】While循环吃hang行了?(图是一个毒)

糟糕,这个问题必须从文件描述符在脚本中的播放方式开始。
我以前也有过这样的经历,一说起来我就想哭。
首先,我们必须明白这个路由有一个边界问题。

当时我写了一个脚本,花了一些时间处理IP文件。
请注意,该脚本仅执行一次,并且 ssh 命令不会按预期在每个 IP 上执行。
我惊讶地看着剧本,因为我当时没有想到这一点。
仔细思考后,我发现问题出在文件传输上。

看,在主脚本中,while 循环如下所示:
完成后<&1 ;做吧 ssh coreuser@$ip“主机名” 完成 <$1
这里,done<&1 将整个文件循环到循环体中。
然而,问题来了。
在循环体内可能还有其他命令,例如 ssh 可以从标准输入读取数据。
这样,本来应该由read读取的行被ssh消耗掉了,所以read找不到后续行,循环提前结束。

我当时就很困惑,这是怎么发生的?经过查阅资料,我发现这就是所谓的“头晕问题”。

解决方案是修改文件描述符以仅读取输入源。
具体怎么做呢?
首先,必须打开文件描述符 3 并将其附加到文件:
exec3 <&0<&$1
这样,通过文件描述符3 将文件的内容传递给读取,而标准输入(0)的初始状态保持不变。

然后,在 for 循环中,读取描述符 3 中的行:
读取ip时;做吧 ... 完成<&3
这样,每个循环只读取文件描述符3 中的一行,其他命令无法干扰。

最后,脚本完成后,记得关闭文件描述符3 :
执行3 >&-
这样,脚本就可以逐行读取 IP 文件,并对每个有效 IP 执行 ssh 命令。

与“吃线”问题类似,ssh、sed、awk、cat、grep 等命令会干扰从标准输入读取数据。
解决方案是显式地分配文件描述符并确保读取具有独占的输入源。

说实话,这个文件描述符怎么玩有时候很头疼,但是一旦搞清楚了,还是很好玩的。
该方法适用于需要在线处理文件的情况而且循环中包含可以读取输入的命令,比如批量运维、日志分析等。
但是shell脚本在简单的情况下效率更高吧?