Search code examples
bashshellrecursiongrep

pgrep -P, but for grandchildren not just children


I am using:

pgrep -P $$

to get the child pids of $$. But I actually want a list of grandchildren and great grandchild too.

How do I do this tho? With a regular programming language we would do that with recursion for example, but with bash? Perhaps use a bash function?


Solution

  • I ended up doing this with node.js and bash:

     const async = require('async');
     const cp = require('child_process');
    
     export const getChildPids = (pid: number, cb: EVCb<Array<string>>) => {
    
          const pidList: Array<string> = [];
    
          const getMoreData = (pid: string, cb: EVCb<null>) => {
    
            const k = cp.spawn('bash');
            const cmd = `pgrep -P ${pid}`;
            k.stderr.pipe(process.stderr);
            k.stdin.end(cmd);
            let stdout = '';
            k.stdout.on('data', d => {
              stdout += String(d || '').trim();
            });
    
            k.once('exit', code => {
    
              if (code > 0) {
                log.warning('The following command exited with non-zero code:', code, cmd);
              }
    
              const list = String(stdout).split(/\s+/).map(v => String(v || '').trim()).filter(Boolean);
    
              if (list.length < 1) {
                return cb(null);
              }
    
              for (let v of list) {
                pidList.push(v);
              }
    
              async.eachLimit(list, 3, getMoreData, cb);
    
            });
          };
    
          getMoreData(String(pid), err => {
            cb(err, pidList);
          });
    
        };