有没有更好的方法来检测我的Perl脚本是从#34; firstboot"?

时间:2016-01-22 20:49:40

标签: linux perl redhat

我有一个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);
    }    
}

1 个答案:

答案 0 :(得分:3)

我可以提供一种替代方法 - 从评论中,您试图解决的问题是启动脚本停滞,因为它正在等待这个返回。

我可以建议fork()可能是你的朋友吗?

 my $pid = fork(); 
 if ( $pid ) { 
     exit; 
 }
 sleep $delay_time; 
 do_stuff(); 

将会发生什么 - 您的脚本将被调用,并且调用者将立即返回,但并行实例将产生并延迟随机延迟间隔 - 对于奖励积分,这将在cron中起作用太。

但正如你在评论中似乎注意到的那样 - '好'的解决方案不是那样做的 - 我建议看看,anacron在大多数Linux系统上都可以使用正是这个特定工作的工具。