wget() 到 /tmp/wget 产生"EMFILE, too many open files"



我正在使用nodejs的wget()监视IP列表,使用"node-wget"。

确切的命令是

    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"

不幸的是,在运行我的应用程序一段时间后.js,我收到"EMFILE,打开的文件太多"

目录"/tmp/wget"是空的,但是..."LSOF |格雷普

·
/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) => {

node-wget使用fs.createWriteStream()函数,根据API文档,该函数在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

最新更新