我使用Perl v5.10.1,并有下一部分代码:
#!/usr/bin/perl
use Fcntl qw(LOCK_EX LOCK_NB);
my ( $fh, $path );
$path = q{/var/run/}. time() .q{.pid};
sysopen $fh, $path, O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n};
flock ( $fh, LOCK_EX | LOCK_NB) || die qq{pid "$path" already locked: $!\n};
当我尝试运行它时:
pid“/var/run/1392394505.pid”已经锁定:错误的文件描述符
它出了什么问题?有什么想法吗?
答案 0 :(得分:6)
这意味着$fh
不包含文件句柄。那是因为您错误地检查了sysopen
是否成功。具体来说,您遇到了优先问题。
sysopen $fh, $path, O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n};
装置
sysopen $fh, $path, ( O_RDWR|O_CREAT || die qq{Cannot open "$path": $!\n} );
表示
sysopen $fh, $path, O_RDWR|O_CREAT;
使用or
代替||
。你也可以使用parens。或两者。修正:
sysopen(my $fh, $path, O_RDWR|O_CREAT)
or die qq{Can't open "$path": $!\n};
另外两个错误:1)你永远不会导入O_RDWR
和O_CREAT
,所以你实际上是为sysopen
的第三个参数传递一个垃圾字符串。 (始终使用use strict; use warnings;
!)2)您的错误消息不正确。你说它已被锁定,即使它不是。修正:
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw( LOCK_EX LOCK_NB O_RDWR O_CREAT );
my $path = q{/var/run/}. time() .q{.pid};
sysopen(my $fh, $path, O_RDWR|O_CREAT)
or die qq{Cannot open "$path": $!\n};
if (!flock($fh, LOCK_EX | LOCK_NB)) {
die qq{Can't lock "$path": $!\n} if !$!{EWOULDBLOCK};
die qq{pid already locked\n};
}
答案 1 :(得分:0)
解决
没有权限在/ var / run中写入此用户。 sudo%scriptname%工作正常