wzp
2021-05-13 7d694a9113118daec5be7ac224dab46a3b20f106
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
'use strict'
 
var fs = require('fs')
var os = require('os')
 
var platformToMethod = {
  aix: 'ps',
  android: 'procfile',
  alpine: 'procfile',
  darwin: 'ps',
  freebsd: 'ps',
  linux: 'procfile',
  netbsd: 'procfile',
  sunos: 'ps',
  win: 'wmic'
}
 
var ps = require('./ps')
var platform = os.platform()
 
if (fs.existsSync('/etc/alpine-release')) {
  platform = 'alpine'
}
 
if (platform.match(/^win/)) {
  platform = 'win'
}
 
var stat
try {
  stat = require('./' + platformToMethod[platform])
} catch (err) {}
 
/**
 * @callback pidCallback
 * @param {Error} err A possible error.
 * @param {Object} statistics The object containing the statistics.
 */
 
/**
 * Get pid informations.
 * @public
 * @param  {Number|Number[]|String|String[]} pids A pid or a list of pids.
 * @param  {Object} [options={}] Options object
 * @param  {pidCallback} callback Called when the statistics are ready.
 */
function get (pids, options, callback) {
  var fn = stat
  if (platform !== 'win' && options.usePs === true) {
    fn = ps
  }
 
  if (stat === undefined) {
    return callback(new Error(os.platform() + ' is not supported yet, please open an issue (https://github.com/soyuka/pidusage)'))
  }
 
  var single = false
  if (!Array.isArray(pids)) {
    single = true
    pids = [pids]
  }
 
  if (pids.length === 0) {
    return callback(new TypeError('You must provide at least one pid'))
  }
 
  for (var i = 0; i < pids.length; i++) {
    pids[i] = parseInt(pids[i], 10)
    if (isNaN(pids[i]) || pids[i] < 0) {
      return callback(new TypeError('One of the pids provided is invalid'))
    }
  }
 
  fn(pids, options, function (err, stats) {
    if (err) {
      return callback(err)
    }
 
    if (single) {
      callback(null, stats[pids[0]])
    } else {
      callback(null, stats)
    }
  })
}
 
module.exports = get