wget()到/ tmp / wget会产生“ EMFILE,打开的文件太多”

时间:2019-01-23 13:28:13

标签: node.js

我正在使用“ node-wget”,使用来自nodejs的wget()监视IP列表。

确切的命令是

    wget( {
        url:  szTargetIP,     // as "http://10.139.238.167
        dest: '/tmp/wget/',
        timeout: 2000    
    },

在扫描文件之后(如/tmp/wget/10.139.238.167),我知道了

fs.unlink( szIPfn, (err) => {          // delete file
    if (err) {
        if ( err.code === 'ENOENT' ) {
            mConsole( '--- file '+ szIPfn +' does not exist' ) ;
        } else {
            throw err ; // fatal error : stop
        } ;
    } else {
        mConsole( '+++ successfully deleted ' + szIPfn ) ;
    } ;
} ) ; // unlink

我总是登录“ +++成功删除/tmp/wget/10.139.238.167”

不幸的是,在运行我的app.js一段时间后, 我收到“ EMFILE,打开的文件太多”

目录“ / tmp / wget”为空,但是显示“ lsof | grep wget”

/tmp/wget/10.139.238.167 (deleted)

有什么想法吗?

*完整代码*

wget( {
        url:  szTargetIP,  
        dest: '/tmp/wget/',
        timeout: 2000       
    },
    function (error, response, body) {
        szNow = genTimeStamp() ; // get timestamp
        if (error) {
            console.log('--- wget() error:');
        } else {
            console.log('+++ wget() ok');
        } ; // no error = wget() ok
    }
) ; // wget()

var szIPfn = '/tmp/wget/' + iWget_IP ; 
fs.unlink( szIPfn, (err) => {

1 个答案:

答案 0 :(得分:2)

node-wget使用fs.createWriteStream()功能,根据API Documentation,在errorfinish事件中自动关闭目标文件。

node-wget还使用request模块,该模块从不发出finish事件,而只会发出complete事件。

然后,您的wget命令的目标文件将永远不会关闭。

只需添加类似:

var szIPfn = '/tmp/wget/' + iWget_IP ; 

fs.close(szIPfn, err => {
  if (err) thow err;

  fs.unlink( szIPfn, (err) => {         // delete file
    if (err) {
      if ( err.code === 'ENOENT' ) {
        mConsole( '--- file '+ szIPfn +' does not exist' ) ;
      } else {
        throw err; // fatal error : stop
      }
    }else{
      mConsole( '+++ successfully deleted ' + szIPfn ) ;
    }
  }); // unlink
}); // close