请教Linux下脚本执行过程中,VPN断开或终端窗口关闭后的影响
这个脚本大体的内容是这样的:
1. 调用JAVA程序1
2. 执行一系列rsync命令分发文件
3. 调用JAVA程序2
一次意外的执行过程是这样的(在SSH终端窗口上执行):
1. JAVA程序1执行到一半突然停止(没有任何报错,根据日志输出的情况,应该就是人工干预后的戛然而止)
2. rsync命令都正常执行,文件也都成功分发
3. JAVA程序2也正常执行完毕,但由于JAVA程序1的意外中断,导致最终结果有严重错误。
请问神马操作会导致这种情况,执行过程中窗口关闭,或者VPN断开,是否会导致这种情况发生?
在终端上执行脚本,关闭窗口之后,貌似脚本继续执行,但JAVA进程被杀掉了(只是怀疑),求科普。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
是不是说,窗口关闭或者VPN断开,脚本应该也停止执行,而不会出现某个进程中断但脚本继续执行的情况?
回复
要搞清楚这些细节,就要研究bash是如何执行批处理中的各个命令的,有没有fork子进程,还有各个进程(java,rsync)如何处理HUP,TERM信号...... 除非你是linux下的C程序员,否则搞清楚这些其实没有任何特别的好处。 最佳实践和解决方案都有了,何不按照那些最佳方法做,以获得自己期望的执行结果呢?
窗口正常关闭的话,子进程都会收到Term信号,然后就退出了。
VPN断开后,使用这个虚拟终端的进程会收到HUP(挂机)信号,通常的处理也是退出。
你的情况很可能是在其它终端用kill -9 处理掉的,又或者是程序中没有中断挂钩,导致无法处理Ctrl-C的或Term信号的退出过程。
可能不同的glibc或环境变量会有不同影响,但正确的处理方法有两个:
1、用nohup运行
2、用Screen或其它终端复合器运行
--另外,对kill -9是没有办法的,只能增加脚本功能,判断java程序退出状态了。