这个脚本大体的内容是这样的:
1. 调用JAVA程序1
2. 执行一系列rsync命令分发文件
3. 调用JAVA程序2
一次意外的执行过程是这样的(在SSH终端窗口上执行):
1. JAVA程序1执行到一半突然停止(没有任何报错,根据日志输出的情况,应该就是人工干预后的戛然而止)
2. rsync命令都正常执行,文件也都成功分发
3. JAVA程序2也正常执行完毕,但由于JAVA程序1的意外中断,导致最终结果有严重错误。
请问神马操作会导致这种情况,执行过程中窗口关闭,或者VPN断开,是否会导致这种情况发生?
在终端上执行脚本,关闭窗口之后,貌似脚本继续执行,但JAVA进程被杀掉了(只是怀疑),求科普。
窗口正常关闭的话,子进程都会收到Term信号,然后就退出了。
VPN断开后,使用这个虚拟终端的进程会收到HUP(挂机)信号,通常的处理也是退出。
你的情况很可能是在其它终端用kill-9处理掉的,又或者是程序中没有中断挂钩,导致无法处理Ctrl-C的或Term信号的退出过程。
可能不同的glibc或环境变量会有不同影响,但正确的处理方法有两个:
1、用nohup运行
2、用Screen或其它终端复合器运行
--另外,对kill-9是没有办法的,只能增加脚本功能,判断java程序退出状态了。
回复 @verra:要搞清楚这些细节,就要研究bash是如何执行批处理中的各个命令的,有没有fork子进程,还有各个进程(java,rsync)如何处理HUP,TERM信号......除非你是linux下的C程序员,否则搞清楚这些其实没有任何特别的好处。最佳实践和解决方案都有了,何不按照那些最佳方法做,以获得自己期望的执行结果呢?是不是说,窗口关闭或者VPN断开,脚本应该也停止执行,而不会出现某个进程中断但脚本继续执行的情况?版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。