开发者社区> 问答> 正文

请教Linux下脚本执行过程中,VPN断开或终端窗口关闭后的影响?报错

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

1. 调用JAVA程序1

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

3. 调用JAVA程序2

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

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

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

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

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

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

展开
收起
爱吃鱼的程序员 2020-06-14 17:16:07 1416 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    窗口正常关闭的话,子进程都会收到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断开,脚本应该也停止执行,而不会出现某个进程中断但脚本继续执行的情况?
    2020-06-14 17:16:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载