一段时间后,当从 Windows SSH 到 linux 机器时,子进程(在分叉后创建)卡在 Windows 上

Posted

技术标签:

【中文标题】一段时间后,当从 Windows SSH 到 linux 机器时,子进程(在分叉后创建)卡在 Windows 上【英文标题】:Child Process (created after forking) when ssh to linux machine from windows getting stuck on windows after sometime 【发布时间】:2021-11-01 18:55:44 【问题描述】:

下面的代码sn-p的工作方式是在fork之后,子进程ssh从windows到Linux机器,并在linux机器上运行script1_bkt.csh。日志被转储到 Windows 路径($AngleLogFilePath\Angle_$date.log === V:\ricky_angle_testing_63.1\depot\vfr\63.10\main\logs\angleLogsrickyPersonal\Angle_$date.log)。

父进程(trialSet.pl 和 trialSetDepWint.pl)在前台运行,工作正常。

V:是 /dv/lmv/mentor/ 的网络文件管理器或 CISF

问题::

从 windows 机器 ssh 到 Linux 机器并运行 script1_bkt.csh 的子进程(在 fork 进程之后)在某个时间点(并非每次)都会卡住。

注意事项: 在 Linux 机器(qwelnx45)上,script1_bkt.csh 的 PID 在一段时间后不存在,这意味着该过程已完成。但是,在 Windows 上,存在 ssh.exe(使用哪个 script1_bkt.csh 在 Windows 上触发)的 PI​​D,这意味着在 Windows 上,命令 ($GoToUnix74 cd $ClientAltRoot/lkg ; source script1_bkt.csh ) 没有完成,并且得到了卡住。该脚本通常需要 3 小时才能完成,但有时它会因为卡住而永远无法完成。 ::: 这个脚本不会每次都卡住。

另外,还有一点很重要:当子进程卡在 windows 上时,虽然 script1_bkt.csh 在 Linux 上已经完成,但日志文件 ($AngleLogFilePath\Angle_$date.log) 并没有包含所有数据script1_bkt.csh 给出 ie 日志文件不完整(似乎是因为进程卡住了,它停止写入日志文件)

代码片段:

use File::Path qw( make_path );

my $ClientAltRoot           = "/dv/lmv/mentor/ricky_angle_testing_63.1/depot/vfr/63.10/main/";
my $GoToUnix              = "C:\\cygwin\\bin\\ssh.exe qwelnx45";
my $AngleLogFilePath    = "V:\\ricky_angle_testing_63.1\\depot\\vfr\\63.10\\main\\logs\\angleLogsrickyPersonal";
my $date                    = strftime("%Y%m%d_%H%M%S", localtime(time));

make_path("$AngleLogFilePath") or warn  "Failed to create dir $AngleLogFilePath";

my $aqpid;
# fork angle process
if ($aqpid = fork()) 
    $SIGCHLD = 'DEFAULT';
 elsif (defined ($aqpid))  
    sleep 10;

    print "Angle child started\n";
    $angleReturnStatus = system ("$GoToUnix cd $ClientAltRoot/lkg ; source script1_bkt.csh > $AngleLogFilePath\\Angle_$date.log ");
    $angleFailed += 1 if ($angleReturnStatus > 0);
    exit 0; 


print "##### Starting the foreground script ###### \n";
system "$GoToUnix \"cd /home/ricky/; echo abc ;  /home/ricky/trialSet.pl > setTrial_ricky/set_$date.log\"  ";
print "Ended SetDep\n";     

print "Waiting as child process has not ended";
1 while (wait() != -1);

system ( "perl C:\\ricky\\Testing\\trialSetDepWint.pl ");
print "Demo script ended\n";

请说明为什么进程会卡住?消除此卡住问题的可能解决方案是什么?

-提前致谢。

【问题讨论】:

IMP:当命令提示符(程序)挂起时,按“ENTER”即可解决问题。意味着存在快速模式问题,即用户以某种方式在命令提示符上按下光标,然后 cmd 进入挂起/卡住模式。所以,为了解决问题,我在cmd提示符的属性下关闭了快速模式。但是,问题仍然存在。关闭快速模式后,在cmd上选择任何东西一定不会挂起cmd,但仍然是cmd挂起。对此还能做些什么?? 【参考方案1】:

其实这个问题有以下几个原因:

    快速模式已开启。 ## 我关闭了系统上的快速模式作为解决方案。 正在运行/脚本的命令提示符中断。 ## 避免在运行/脚本正在进行时使用机器。因为,当你在机器上工作时,你会不由自主地切换命令提示符;由于这种切换,您的运行有时会卡住,直到您按“ENTER”或任意键。

我遵循了这两种方法,现在没有看到问题。

谢谢。

【讨论】:

以上是关于一段时间后,当从 Windows SSH 到 linux 机器时,子进程(在分叉后创建)卡在 Windows 上的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上的 Gitlab Build Runner 使用 HTTP 而不是 SSH

解决ssh连接一段时间后光标无响应问题

笔记处理ssh 连接后一段时间就掉线 Connection closed by foreign host

Xshell ssh 连接后一段时间就掉线 Connection closed by foreign host

远程ssh连接Linux服务器,隔一段时间就断了

解决mac下ssh空闲一段时间自动断开的问题