¿Cómo obtener el PID primario de un proceso dado en GNU / Linux desde la línea de comandos?

90

Resuelto antes de preguntar: cat /proc/1111/status | grep PPid

Vi.
fuente
más rápido: grep PPid status |cut -f2como en time(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); preguntarse si hay algo aún más rápido?
Acuario Power
1
@AquariusPower Como preguntas, fgrep es más rápido que grep. fgrep PPid status |cut -f2
jbo5112
sed es mucho más rápido que grep and cut:sed -rn '/PPid/ s/^.*:\s+// p' < status
Marian

Respuestas:

108

Línea de comando:

ps -o ppid= -p 1111

Función:

ppid () { ps -p ${1:-$$} -o ppid=; }

Alias ​​(una función es preferible ):

alias ppid='ps -o ppid= -p'

Guión:

#!/bin/sh
pid=$1
if [ -z $pid ]
then
    read -p "PID: " pid
fi
ps -p ${pid:-$$} -o ppid=

Si no se proporciona ningún PID a la función o al script, por defecto muestran el PPID del proceso actual.

Para usar el alias, se debe proporcionar un PID.

Dennis Williamson
fuente
El =signo no es necesario, al menos en OS X 10.8.2.
jtbandes
55
@jtbandes: el signo igual como se usa aquí suprime la salida de la línea de encabezado ( Linux y OS X ).
Dennis Williamson el
13

Esta es una de esas cosas que aprendo, olvido, vuelvo a aprender, repito. Pero es útil. La bandera 's' del comando pstree muestra un árbol con una hoja en N:

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks
usuario194394
fuente
12

El padre pid está en la variable de shell PPID, entonces

echo $PPID
Ivan Novotny
fuente
1
Sí, pero 1. Quiero padre pid de otro proceso, 2. Quiero poder atravesar todos los antepasados ​​a init.
Vi.
1
Por otro lado, usar $PPIDsolo resolvió el problema que tenía que Google sugirió esta página como respuesta.
Paul Whittaker
12

Para imprimir los identificadores principales ( PPID) de todos los procesos, use este comando:

ps j

Para el proceso sola, sólo tiene que pasar el PID, como: ps j 1234.

Para extraer solo el valor, filtre la salida por awk, como:

ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps

Para enumerar los PID de todos los padres, use pstree(instálelo si no lo tiene):

$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)

Para obtener el PID primario del proceso actual, use echo $$.

kenorb
fuente
1
pstreees el mejor que he visto aquí.
sudo
ps jes genial porque está disponible en muchas distribuciones y es fácilmente composable
Connor McCormick
6

Leer / proc / $ PID / estado. Se puede escribir fácilmente:

#! / bin / sh
P = $ 1
si [-z "$ P"]; entonces
    leer P
fi
cat / proc / "$ P" / estado | grep PPid: | grep -o "[0-9] *"
Vi.
fuente
2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'es todo lo que necesitas. (Es muy raro que las herramientas de Unix hagan if [ -z ]; then readlo mismo)
Grawity
@grawity Ayuda a hacer cosas comoecho $$ | ppid | ppid | ppid
Vi.
2
Uso inútil de gato de UUOC
Felipe Alvarez
@FelipeAlvarez, Mis manos no están acostumbradas a escribir < /some/file grep | grep | ....
Vi.
2
¿Qué pasa?grep /some/file
Felipe Álvarez
4

En Linux:

ps hoppid $thatprocess
jthill
fuente
2
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

Un ejemplo un poco más complejo que verifica el comando de un padre que inició el proceso actual Cambie comm = a cmd = para ver el comando completo

sebastian_t
fuente
¿Uso inútil del eco ? ;)
bobbogo
En realidad se requiere en algunas terminales. Para ser sincero, no recuerdo exactamente, pero en realidad resolvió un problema. : D
sebastian_t
1

Aquí hay una solución rápida que también debería funcionar:

ps $$
Gevork Palyan
fuente
Eso no le da al PID padre, que es lo que solicitó el OP.
Dennis Williamson
1

Corre topcon las opciones que quieras, como -u username and -p PID.

Y mientras topestá trabajando f, presione , muestra una lista de opciones que desea mostrar en la topsalida, y los parámetros que se muestran se mostrarán en letras MAYÚSCULAS y los parámetros que se muestran o no se mostrarán en letras pequeñas.

Entonces, al ingresar la letra antes del parámetro, puede habilitarla o deshabilitarla. Para la ID del proceso principal, debe ingresar by luego presionar Enter, se mostrará el PPID en la salida superior.

Praveen S.
fuente
1
Se debe utilizar de forma no interactiva. Ya sé que en htopusted puede configurar la PPIDcolumna.
Vi.