一段时间后,当从 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 上触发)的 PID,这意味着在 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 连接后一段时间就掉线 Connection closed by foreign host