我有一个Perl脚本,可以写入位于GPFS网络安装存储点上的文件。有一个标准支票open FILE or die $!
。
文件系统崩溃了,但脚本没有退出;它一直在努力写作。文件系统恢复后,Perl脚本完成。如何检查是否可以写入文件系统,如果不能,则die
?
我问这个的原因是因为我的Perl脚本的最后一行删除了文件的.tmp
扩展名。永远不应该达到这种说法,因为在某一时刻,脚本的输出不会到达任何地方。 GPFS在写入点上有所下降,但读取点仍在上升。
答案 0 :(得分:5)
print
有一个返回码。大多数人都不愿意检查它。但确实有一个。
http://perldoc.perl.org/functions/print.html
打印 打印字符串或字符串列表。如果成功则返回true。
是的,你可以做'打印或死'。但你确实需要确保正确地将它括起来,所以'或'与正确的表达联系在一起。
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的联机帮助页:
我可以建议检查您的挂载选项吗?您的GPFS NFS是否已安装在您的客户端上?
考虑到这一点,GPFS不支持soft
像NFS一样安装。根据设计,soft
挂载将无法写入瞬态错误,其中hard
挂载将在挂载脱机时阻塞。
hard
是默认设置,因为这样可以避免数据损坏 - 任何写入操作都会阻塞,直到安装恢复为止。它看起来像hanging
可能会出现不合需要的情况,但请记住,它可以极大地提高数据的完整性。
我不知道是否可以轻松测试“停滞不前”的情况。从脚本中硬安装。如果您通过NFS网络安装GPFS,您可能会发现只需将其安装为soft
(可能使用单独的安装点并安装两次,如果它会影响其他安装点)。