P4服务器版本:P4D / LINUX26X86_64 / 2013.2 / 938876(2014/09/23) 在RHEL6上
使用p4perl运行perl脚本时,我会捕获类似这样的错误......
if ($p4->ErrorCount() {
foreach $err ($p4->Errors) {
print "$err\n";
}
}
这些错误以不确定的方式弹出,有时我会得到它们,有时候不会。但如果我用上面的代码捕获错误,我得到......
TCP receive failed.
read: socket:
Connection reset by peer
这是一个真正的错误(显然,连接被重置?) 我可以忽略这个吗?重置连接后它会运行我想要运行的东西吗?或者我需要重新运行该命令吗?
我担心这个问题可能源于这样一个事实,即perl脚本在之前执行了fork,并且我将$ p4句柄发送到forked进程。我可以做这样的事情来检测和纠正这个
use P4;
our $p4 = new P4;
<perl forks off a new process...>
if(!($p4-IsConnected)) {
$p4->SetCwd("$CWD");
if($p4->ErrorCount()) {handle_p4_error();}
$p4->Connect();
if($p4->ErrorCount()) {handle_p4_error();}
}
....etc....
exit;
sub handle_p4_err {
print "<<<P4 ERROR>>>\n";
foreach $err ($p4->Errors) {
print "$err\n";
}
exit;
}
或者由于缺少连接,SetCwd会失败吗?
P4管理员是否可以设置某种超时(在x分钟不活动后终止连接)?
感谢您的帮助!
答案 0 :(得分:2)
这是一个真正的错误(显然,连接被重置了吗?)
是;与服务器的连接已终止。
我可以忽略这个吗?重置连接后它会运行我想要运行的东西吗?
没有
或者我是否需要重新运行该命令?
是;我想你还需要先重新打开连接。
$p4->Connect();
if($p4->ErrorCount()) {handle_p4_error();}
这是一般模式,虽然如果连接失败,你可能想要摆脱困境,因为在这一点之后没有你做的事情(在大多数情况下,这意味着某些东西配置错误)。
或者由于缺少连接,SetCwd会失败吗?
没有;这纯粹是客户端操作,不与服务器通信。
P4管理员是否可以设置某种超时(在x分钟不活动后终止连接)?
这是一种可能性 - 您的脚本是否保持空闲连接打开?这被认为是不礼貌的行为,因为通过防止任何新连接被打开,足以构成DDoS攻击。另一种可能性是存在其他一些网络故障(您的VPN连接断开等)。
答案 1 :(得分:1)
在我的特定情况下,我认为问题与perl脚本中的fork有关。也许句柄被传递给分叉进程,这干扰了在主进程线程中重新连接的尝试。我在数据库连接方面遇到了类似的问题。补救措施也很相似......
似乎工作的是在分叉之前无条件地与P4断开连接并且之后无条件地重新连接。分叉进程不需要P4连接,所以这是可以的(在我的特定情况下)。
答案 2 :(得分:0)
就我而言,问题是我需要与perforce服务器建立ssh连接,但是我没有添加正确的ssh密钥。您可以使用以下命令列出添加到会话中的ssh密钥:
ssh-add -L