1
回答
请教Linux下脚本执行过程中,VPN断开或终端窗口关闭后的影响
华为云实践训练营,热门技术免费实践!>>>   

这个脚本大体的内容是这样的:

1. 调用JAVA程序1

2. 执行一系列rsync命令分发文件

3. 调用JAVA程序2

一次意外的执行过程是这样的(在SSH终端窗口上执行):

1. JAVA程序1执行到一半突然停止(没有任何报错,根据日志输出的情况,应该就是人工干预后的戛然而止)

2. rsync命令都正常执行,文件也都成功分发

3. JAVA程序2也正常执行完毕,但由于JAVA程序1的意外中断,导致最终结果有严重错误。

请问神马操作会导致这种情况,执行过程中窗口关闭,或者VPN断开,是否会导致这种情况发生?

在终端上执行脚本,关闭窗口之后,貌似脚本继续执行,但JAVA进程被杀掉了(只是怀疑),求科普。

举报
verra
发帖于3年前 1回/694阅
共有1个答案 最后回答: 3年前

窗口正常关闭的话,子进程都会收到Term信号,然后就退出了。

VPN断开后,使用这个虚拟终端的进程会收到HUP(挂机)信号,通常的处理也是退出。

你的情况很可能是在其它终端用kill -9 处理掉的,又或者是程序中没有中断挂钩,导致无法处理Ctrl-C的或Term信号的退出过程。

可能不同的glibc或环境变量会有不同影响,但正确的处理方法有两个:

1、用nohup运行

2、用Screen或其它终端复合器运行

--另外,对kill -9是没有办法的,只能增加脚本功能,判断java程序退出状态了。

--- 共有 2 条评论 ---
szf回复 @verra : 要搞清楚这些细节,就要研究bash是如何执行批处理中的各个命令的,有没有fork子进程,还有各个进程(java,rsync)如何处理HUP,TERM信号...... 除非你是linux下的C程序员,否则搞清楚这些其实没有任何特别的好处。 最佳实践和解决方案都有了,何不按照那些最佳方法做,以获得自己期望的执行结果呢? 3年前 回复
verra是不是说,窗口关闭或者VPN断开,脚本应该也停止执行,而不会出现某个进程中断但脚本继续执行的情况? 3年前 回复
顶部