bad interpreter: Text file busy 在线等

时间:2022-05-22 20:42:53
zai centos 下用php写命令行,出现这个东西.是怎么回事?

10 个解决方案

#1


大致意思是说你操作的文件比较忙,可能别的进程在用。

#2


有解决方案嘛?

#3


关闭打开的文件

你应该贴出你的代码,这样你才有可能获得有效的帮助

#4


#!/usr/local/bin/php
<?php
    set_time_limit(0);
    $acts=array('start','stop','status','prepare','help');

    $config=array(
    "dbhost"=>"localhost",
    "dbuser"=>"xxx",
    "dbpw"=>'xxx',
    "dbname"=>"po",
    "charset"=>"utf8",
    );
    $db=null;
    
    
    $lock="lock.txt";

    if(in_array($argv[1],$acts,true) ){
        $argv[1](); 
    }else{
        help();    
    }

    function start(){
        global $lock,$argc,$argv,$db;
        if($argc===2){
            if(status(true)=="starting\n"){
                echo "program is also starting";
            }else{
                @unlink($lock);
                $date=date("Y-m-d");
                $log="log/$date.txt";
                exec(__FILE__." start back >>$log 2>&1 &");//在后台运行
            }
        }elseif($argc===3&&$argv[2]==='back'){
            $str="program is also starting\n";
            if($fh=@fopen("starting.txt",'w+')){
                if(flock($fh,LOCK_EX + LOCK_NB)){//只准运行一个实例
                    $db=get_db();
                    $str='';
                    while(1){
                        if(is_file($lock)){
                            break;
                        }
                        sendmail();
                    }
                }
                fclose($fh);
            }
            if($str){
                echo $str;//报错 
            }
        }else{
            echo "starting error\n";
        }
    }

    function sendmail(){
        $db=get_db();
        echo "$i\n";
        usleep(1000000*1);//间隔0.2秒发一封,一秒发5封
    }

    function get_email_doamins($limit){
        $db=get_db();
    }

    function prepare(){
        $db=get_db();
    }

    /**
    * 显示信息
    * 
    */
    function status($r=false){
        $str="stopping\n";
        if($fh=@fopen("starting.txt",'w+')){
            if(!flock($fh,LOCK_EX + LOCK_NB)){
                $str= "starting\n"; 
            }
            fclose($fh);
        }
        if($r){
            return $str; 
        }
        echo $str;
    }

    function stop(){
        global $lock;
        file_put_contents($lock,'');
        if(is_file($lock)){
            echo "stoping\n";
        }else{
            echo "Error:stoping";
        }
    }

    function help(){
        global $acts;
        foreach($acts as $act){
            echo __FILE__." $act\n";  
        }
    }
    
    function get_db(){
        global $config;
        static $db=null;
        if(is_null($db)){
            $db=new DB($config);
        }
        return $db;
    }
?> 

#5


并不是每次都会出现错误.偶尔.

#6


./file_name start 会出现这个错误.

#7


关注中!

#8


搜了好多,没得到答案

是 不是这个问题
启动一个后台进程的问题.
exec(__FILE__." start back >>$log 2>&1 &");//在后台运行

#9


你这个代码是抄来的吧?

$lock="lock.txt";
本意是做文件锁,但代码中并没有体现

#10


晕... 这个完全手写的,
starting.txt是锁文件.这个lock.txt文件,控制进程暂停的.在stop()里面有实现啊.

#1


大致意思是说你操作的文件比较忙,可能别的进程在用。

#2


有解决方案嘛?

#3


关闭打开的文件

你应该贴出你的代码,这样你才有可能获得有效的帮助

#4


#!/usr/local/bin/php
<?php
    set_time_limit(0);
    $acts=array('start','stop','status','prepare','help');

    $config=array(
    "dbhost"=>"localhost",
    "dbuser"=>"xxx",
    "dbpw"=>'xxx',
    "dbname"=>"po",
    "charset"=>"utf8",
    );
    $db=null;
    
    
    $lock="lock.txt";

    if(in_array($argv[1],$acts,true) ){
        $argv[1](); 
    }else{
        help();    
    }

    function start(){
        global $lock,$argc,$argv,$db;
        if($argc===2){
            if(status(true)=="starting\n"){
                echo "program is also starting";
            }else{
                @unlink($lock);
                $date=date("Y-m-d");
                $log="log/$date.txt";
                exec(__FILE__." start back >>$log 2>&1 &");//在后台运行
            }
        }elseif($argc===3&&$argv[2]==='back'){
            $str="program is also starting\n";
            if($fh=@fopen("starting.txt",'w+')){
                if(flock($fh,LOCK_EX + LOCK_NB)){//只准运行一个实例
                    $db=get_db();
                    $str='';
                    while(1){
                        if(is_file($lock)){
                            break;
                        }
                        sendmail();
                    }
                }
                fclose($fh);
            }
            if($str){
                echo $str;//报错 
            }
        }else{
            echo "starting error\n";
        }
    }

    function sendmail(){
        $db=get_db();
        echo "$i\n";
        usleep(1000000*1);//间隔0.2秒发一封,一秒发5封
    }

    function get_email_doamins($limit){
        $db=get_db();
    }

    function prepare(){
        $db=get_db();
    }

    /**
    * 显示信息
    * 
    */
    function status($r=false){
        $str="stopping\n";
        if($fh=@fopen("starting.txt",'w+')){
            if(!flock($fh,LOCK_EX + LOCK_NB)){
                $str= "starting\n"; 
            }
            fclose($fh);
        }
        if($r){
            return $str; 
        }
        echo $str;
    }

    function stop(){
        global $lock;
        file_put_contents($lock,'');
        if(is_file($lock)){
            echo "stoping\n";
        }else{
            echo "Error:stoping";
        }
    }

    function help(){
        global $acts;
        foreach($acts as $act){
            echo __FILE__." $act\n";  
        }
    }
    
    function get_db(){
        global $config;
        static $db=null;
        if(is_null($db)){
            $db=new DB($config);
        }
        return $db;
    }
?> 

#5


并不是每次都会出现错误.偶尔.

#6


./file_name start 会出现这个错误.

#7


关注中!

#8


搜了好多,没得到答案

是 不是这个问题
启动一个后台进程的问题.
exec(__FILE__." start back >>$log 2>&1 &");//在后台运行

#9


你这个代码是抄来的吧?

$lock="lock.txt";
本意是做文件锁,但代码中并没有体现

#10


晕... 这个完全手写的,
starting.txt是锁文件.这个lock.txt文件,控制进程暂停的.在stop()里面有实现啊.