作者lgen7604 ()
看板Perl
标题Re: [问题] sleep与-e搭配应用
时间Thu Jun 19 05:05:21 2025
这个 script 的设计不好,如果档案不存在,无穷回圈有可能卡死。
建议要设计合理的 timeout 机制,范例如下:
#!/usr/bin/env perl
my $timer = 30; # timeout after 30 min
while (1) {
if (-e $ARGV[0]) {
printf("File exist.\n");
exit 0;
}
else {
if ($timer == 0) {
print "File does not exist, timeout.\n";
exit 1;
}
sleep(60);
$timer--;
}
}
※ 引述《jacky1989 ()》之铭言:
: as title
: 我写一段简单程式去判断档案是否存在
: 如果存在就做下一步这样
: wait.pl
: #!/usr/bin/perl
: while(1){
: if(-e $ARGV[0]){
: printf("File exist.\n");
: exit;
: }
: sleep(60);
: }
: 我自己使用没问题,但同仁用了以後我就被公司的IT部门碎念了
: 他说我的程式卡住执行绪,要我修改
: 但我自己左看右看,应该都没问题
: 以top检查,也是没有卡住
: 但以ps检查就出现一堆死掉的执行绪
: 我这样检查 ps -aef|grep wait.pl
: 由於我们是许多台server串起来使用
: 所以档案不一定在本机硬碟
: 有可能档案还symbollic link到其他硬碟去
: 所以实际执行可能会这样打
: /server3/disk1/userA/bin/wait.pl /server1/disk0/dir1/list.log
: list.log这个档案可能是存在server2的disk2这样
: 所以会变成
: list.log -> /server2/disk2/list.log
: 因此我想问,我这样想法会造成卡住执行绪的问题吗?
: 先感谢大家,如果看不懂,我再补充
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 106.1.234.17 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Perl/M.1750280723.A.0D3.html
1F:→ jacky1989: 但档案一开始就是不存在的,需要等另一只程式创建才可 06/21 19:19
2F:→ jacky1989: 以,这样就得一直在等不是吗? 06/21 19:19
3F:→ lgen7604: 你有看懂吗?每一分钟检查档案,检查到档案就算成功,如 07/25 23:37
4F:→ lgen7604: 果检查30次(经过30分钟)都没有看到档案,程式timeout 07/25 23:38
5F:→ lgen7604: 这样才不会永远等下去(你原本程式卡死的问题) 07/25 23:39
6F:→ lgen7604: 你应该要设计一个合理的timeout时间,不是永远一直等 07/25 23:40
7F:推 herculus6502: 或是用crontab 07/31 22:24