我有一个 Perl 脚本,它写入位于 GPFS 网络安装存储点上的文件。有一个标准检查 open FILE or die $!
。
文件系统宕机了,但是脚本没有退出;它一直在努力写作。一旦文件系统恢复,Perl 脚本就完成了。如何检查文件系统是否可以写入,如果不能写入 die
?
我问这个的原因是因为我的 Perl 脚本的最后一行删除了文件的 .tmp
扩展名。这个语句不应该被到达,因为在某一时刻脚本的输出没有去任何地方。 GPFS 在写入点下降,但读取点仍在上升。
最佳答案
print
有一个返回码。大多数人都懒得去检查。但它确实有一个。
http://perldoc.perl.org/functions/print.html
所以是的,你可以做“打印或死亡”。但是您确实需要确保正确地将它括起来,以便“或”与正确的表达式相关联。
print 0 || warn "1 failed";
print 0 or warn "2 failed";
这将给出两种不同的结果,因为前者“测试”了零。后者测试
print
。如果您将打印品括起来,那么这无关紧要,为了清楚起见,这可能是可取的。所以如果测试 - 你可以这样做:
open ( my $fh, "<", "bad_open" ); #opens read only, so prints will fail.
print {$fh} 0,1,2 || warn "1 failed";
print {$fh} 1,2,3 or warn "2 failed";
(我打算建议
autodie
但遗憾的是它没有应用于 print
。)或者,查看 GPFS 的联机帮助页:
http://www-01.ibm.com/support/knowledgecenter/SSFKCN_3.5.0/com.ibm.cluster.gpfs.v3r5.gpfs100.doc/bl1adm_gsmo.htm
我可以建议检查您的安装选项吗?您的 GPFS NFS 是否安装在您的客户端上?
看了一下,GPFS不像NFS那样支持
soft
挂载。根据设计,soft
挂载将在瞬时错误时写入失败,其中 hard
挂载将在挂载离线时阻塞。hard
是默认值,因为这样可以避免数据损坏 - 任何写入操作都会阻塞,直到挂载恢复。看起来它是 hanging
,它可以被看到,但请记住,它大大提高了数据完整性。我不知道是否可以轻松测试脚本中的“停滞”硬安装。如果您通过 NFS 网络挂载您的 GPFS,您可能会发现您可以简单地将它挂载为
soft
(如果这会影响其他人,也许使用单独的挂载点并挂载两次)。关于perl - 打印或死亡 : how to check if a GPFS network mounted file is available,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28487318/