diff --git a/lib/util/devutil.js b/lib/util/devutil.js index f4371bce..da61b0c3 100644 --- a/lib/util/devutil.js +++ b/lib/util/devutil.js @@ -39,28 +39,54 @@ devutil.listPidsByComm = function(adb, serial, comm, bin) { shell: true } - return adb.shell(serial, ['ps']) - .then(function(out) { - return new Promise(function(resolve) { - var header = true - var pids = [] - out.pipe(split()) - .on('data', function(chunk) { - if (header) { - header = false + var findProcess = function(out) { + return new Promise(function(resolve) { + var header = true + var pids = [] + var showTotalPid = false + + out.pipe(split()) + .on('data', function(chunk) { + if (header) { + header = false + } + else { + var cols = chunk.toString().split(/\s+/) + if (!showTotalPid && cols[0] === 'root') { + showTotalPid = true } - else { - var cols = chunk.toString().split(/\s+/) - if (cols.pop() === bin && users[cols[0]]) { - pids.push(Number(cols[1])) - } + + // last column of output would be command name containing absolute path like '/data/local/tmp/minicap' + // or just binary name like 'minicap', it depends on device/ROM + var lastCol = cols.pop() + if ((lastCol === comm || lastCol === bin) && users[cols[0]]) { + pids.push(Number(cols[1])) } - }) - .on('end', function() { - resolve(pids) - }) - }) + } + }) + .on('end', function() { + resolve({showTotalPid: showTotalPid, pids: pids}) + }) }) + } + + return adb.shell(serial, 'ps 2>/dev/null') + .then(findProcess) + .then(function(res) { + // return pids if process can be found in the output of 'ps' command + // or 'ps' command has already displayed all the processes including processes launched by root user + if (res.showTotalPid || res.pids.length > 0) { + return Promise.resolve(res.pids) + } + // otherwise try to run 'ps -elf' + else { + return adb.shell(serial, 'ps -lef 2>/dev/null') + .then(findProcess) + .then(function(res) { + return Promise.resolve(res.pids) + }) + } + }) } devutil.waitForProcsToDie = function(adb, serial, comm, bin) {