我有一个 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/

10-11 21:16