pgrep
é o caminho a percorrer; Eu escrevi isso principalmente como um exercício bash
, mas no caso de ser útil para qualquer outra pessoa:
Ele configura uma função que aceita um parâmetro - um nome de processo que, presumivelmente, corresponde a algo na saída ps -eo comm
. Ele lê a saída ps
, configurando uma matriz de pids e pids pai para processos correspondentes. Feito isso, ele percorre os pids correspondentes para encontrar o que tem um pid pai que não era na lista / matriz original.
# searches the 'ps' listing for matching ($1) processes,
# then displays the "ancestor" PID -- the process that has a parent PID
# that has a different process name
function ancestor () {
# must pass a parameter (process name)
[ -z "$1" ] && return
local -a array
local ppid pid comm
# can't pipe 'ps ... | while' as that creates a subshell that loses $array
while read ppid pid comm
do
[ "$comm" = "$1" ] && array[$pid]=$ppid
done < <(ps -eo ppid,pid,comm)
# loop through each pid in array and see which value (ppid) is not a member of the array
for pid in ${!array[@]}
do
[ ${array[${array[$pid]}]-unset} = "unset" ] && { echo $pid; break; }
done
}