我有一个Perl脚本,如果它由firstboot脚本调用或由firstboot衍生的进程调用,则需要以特定方式执行。我有这个例程handleFirstBoot
,它似乎工作正常,但可能有更好的方法来编写这个例程。所以请看看......
sub handleFirstBoot {
my $child_id = shift || $$;
my $parent_id;
foreach (`ps -ef`) {
my ($uid,$pid,$ppid) = split;
next unless ($pid eq $child_id);
$parent_id = $ppid;
last;
}
if ( $parent_id == 0 ) {
debug "firstboot is NOT an ancestor.\n";
return;
}
my $psout = `ps -p $parent_id | tail -1 |sed -e's/^ //g'| sed -e's/ */ /g'|cut -d' ' -f4`;
if ( $psout =~ /firstboot/ ) {
debug "firstboot IS an ancestor. Set post option.\n";
$opt{'post'} = 1;
return;
} else {
# recursive case
handleFirstBoot($parent_id);
}
}
答案 0 :(得分:3)
我可以提供一种替代方法 - 从评论中,您试图解决的问题是启动脚本停滞,因为它正在等待这个返回。
我可以建议fork()
可能是你的朋友吗?
my $pid = fork();
if ( $pid ) {
exit;
}
sleep $delay_time;
do_stuff();
将会发生什么 - 您的脚本将被调用,并且调用者将立即返回,但并行实例将产生并延迟随机延迟间隔 - 对于奖励积分,这将在cron
中起作用太。
但正如你在评论中似乎注意到的那样 - '好'的解决方案不是那样做的 - 我建议看看,anacron
在大多数Linux系统上都可以使用正是这个特定工作的工具。