¿Cómo puedo obtener los argumentos del comando o la línea de comando completa de un proceso en ejecución usando su nombre de proceso?
Por ejemplo este proceso:
# ps
PID USER TIME COMMAND
1452 root 0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
Y lo que quiero es /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
o los argumentos. Sé el nombre del proceso y quiero sus argumentos. Estoy usando Busybox en SliTaz.
ps
(no recomendado) o está buscando algún comando alternativo paraps
obtener el resultado? ¿Qué hay que hacer cuando seps
obtienen múltiples líneas de salida? imprimir todo / primero / último?arg
comocommand
según la respuesta de @John ?pidof <process name>
ps -o pid, args | grep $ PID | tr -s "" | cut -d "" -f 2 Pero de esta manera no obtengo los args en una variableRespuestas:
Puede usar el
-o
interruptor para especificar su formato de salida:Desde la página del manual :
También puede usar el
-p
interruptor para seleccionar un PID específico:pidof
también se puede usar para cambiar de nombre de proceso a PID, permitiendo el uso de-p
con un nombre:Por supuesto, también puede usar
grep
esto (en cuyo caso, debe agregar el-e
interruptor):GNU ps también le permitirá eliminar los encabezados (por supuesto, esto es innecesario cuando se usa
grep
):En otros sistemas, puede canalizar a AWK o sed:
Editar: si desea capturar esta línea en una variable, simplemente use
$(...)
como de costumbre:o con
grep
:fuente
args
concommand
(ocmd
).cmd
ycommand
son aliasargs
, esto probablemente sea innecesario.grep
para coger la línea que realmente está interesado en:ps -eo args | grep dhcpcd | head -n -1
. Edité mi respuesta.Intenta algo como esto:
(ejemplo de salida de busybox en OpenWrt en uno de mis enrutadores)
/proc/$PID/cmdline
contiene los argumentos del proceso$PID
como una cadena C-ish una tras otra. Cada cadena tiene terminación cero.Las citas sobre algunos argumentos u opciones son cosas de shell. Debe mirar más de cerca las líneas que se muestran y dónde se utilizan espacios u otros caracteres con un significado especial para el shell. Deberá citar ese carácter (s) de alguna manera o el argumento completo al volver a unir estas líneas a una línea de comando.
fuente
tr "\0" " " </proc/991/cmdline
\0
con `` ser malo, pero creotr '\0' '\n' < /proc/$foo/cmdline
que es un poco más simple quexargs
.printf
hace que sea más fácil agregar comillas a la salida, insertar un espacio en lugar de la nueva línea, etc. Cuando se piensa en agregar más procesamiento, el caminoprintf
es un buen comienzo.Método # 1 - Usando ps
Podrías usar
ps -eaf | grep 1234
.Ejemplo
NOTA: Busybox
ps
no incluye los-eaf
interruptores como se muestra arriba de un típicops
que se incluye con la mayoría de Linux, sin embargo, Busyboxps
muestra lo que parece ser una salida muy similar al ejemplo que proporcioné. Puede instalar Busybox en la mayoría de Linux y ejecutarlo así:Método # 2 - Usando / proc
También puede mirar el
cmdline
archivo que tiene cada PID/proc/<pid>
.Pero tenga en cuenta que le falta el espacio. Esto se debe a que se usa un carácter NUL dentro de este archivo para separar los argumentos de la línea de comandos. Sin embargo, no se preocupe, estos pueden eliminarse.
Referencias
fuente
Conociendo el PID, solo ejecutivo
Por ejemplo, para PID = 127
fuente