ver usuario tipos sleeping procesos monitoreo corriendo administracion linux unix aix hp-ux sunos

usuario - ¿Cómo obtener los args de línea de comando pasados a un proceso en ejecución en sistemas Unix/Linux?



ver procesos en ubuntu (12)

En SunOS hay pargs comando pargs que imprime los argumentos de línea de comando pasados ​​al proceso en ejecución.

¿Hay algún comando similar en otros entornos Unix?


Además de todas las formas anteriores de convertir el texto, si simplemente usa ''cadenas'', hará que la salida en líneas separadas por defecto. Con la ventaja adicional de que también puede evitar que aparezcan caracteres que puedan hacer que su terminal no aparezca.

Ambas salidas en un comando:

cadenas / proc // cmdline / proc // environ

La verdadera pregunta es ... ¿hay alguna manera de ver la línea de comando real de un proceso en Linux que ha sido alterada para que la línea de comando contenga el texto modificado en lugar del comando real que se ejecutó?


En Linux

cat /proc/<pid>/cmdline

obtiene la línea de comando del proceso (incluidos args) pero con todos los espacios en blanco cambiados a caracteres NUL.


En Linux, con bash, para mostrar como args entre comillas para que pueda editar el comando y volver a ejecutarlo

</proc/"${pid}"/cmdline xargs --no-run-if-empty -0 -n1 / bash -c ''printf "%q " "${1}"'' /dev/null; echo

En Solaris, con bash (probado con la versión 3.2.51 (1)) y sin gnu userland:

IFS=$''/002'' tmpargs=( $( pargs "${pid}" / | /usr/bin/sed -n ''s/^argv/[[0-9]/{1,/}/]: //gp'' / | tr ''/n'' ''/002'' ) ) for tmparg in "${tmpargs[@]}"; do printf "%q " "$( echo -e "${tmparg}" )" done; echo

Ejemplo de Linux bash (pegar en el terminal):

{ ## setup intial args argv=( /bin/bash -c ''{ /usr/bin/sleep 10; echo; }'' /dev/null ''BEGIN {system("sleep 2")}'' "this is" / "some" "args "$''/n''" that" $''/000'' $''/002'' "need" "quot"$''/t''"ing" ) ## run in background "${argv[@]}" & ## recover into eval string that assigns it to argv_recovered eval_me=$( printf "argv_recovered=( " </proc/"${!}"/cmdline xargs --no-run-if-empty -0 -n1 / bash -c ''printf "%q " "${1}"'' /dev/null printf " )/n" ) ## do eval eval "${eval_me}" ## verify match if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed ''s/argv_recovered/argv/'' )" ]; then echo MATCH else echo NO MATCH fi }

Salida:

MATCH

Ejemplo de Solaris Bash:

{ ## setup intial args argv=( /bin/bash -c ''{ /usr/bin/sleep 10; echo; }'' /dev/null ''BEGIN {system("sleep 2")}'' "this is" / "some" "args "$''/n''" that" $''/000'' $''/002'' "need" "quot"$''/t''"ing" ) ## run in background "${argv[@]}" & pargs "${!}" ps -fp "${!}" declare -p tmpargs eval_me=$( printf "argv_recovered=( " IFS=$''/002'' tmpargs=( $( pargs "${!}" / | /usr/bin/sed -n ''s/^argv/[[0-9]/{1,/}/]: //gp'' / | tr ''/n'' ''/002'' ) ) for tmparg in "${tmpargs[@]}"; do printf "%q " "$( echo -e "${tmparg}" )" done; echo printf " )/n" ) ## do eval eval "${eval_me}" ## verify match if [ "$( declare -p argv )" == "$( declare -p argv_recovered | sed ''s/argv_recovered/argv/'' )" ]; then echo MATCH else echo NO MATCH fi }

Salida:

MATCH


En Solaris

ps -eo pid,comm

similar se puede usar en sistemas tipo Unix.


En lugar de usar múltiples comandos para editar la secuencia, solo use one - tr para traducir un carácter a otro:

tr ''/0'' '' '' </proc/<pid>/cmdline


Esto hará el truco:

xargs -0 < /proc/<pid>/cmdline

Sin los xargs, no habrá espacios entre los argumentos, ya que se han convertido a NULs.


Hay varias opciones:

ps -fp <pid> cat /proc/<pid>/cmdline

Hay más información en /proc/<pid> en Linux, solo eche un vistazo.

En otros Unixes las cosas pueden ser diferentes. El comando ps funcionará en todas partes, el elemento /proc es específico del sistema operativo. Por ejemplo, en AIX no hay una línea de cmdline en /proc .


Otra variante de la impresión /proc/PID/cmdline con espacios en Linux es:

cat -v /proc/PID/cmdline | sed ''s//^@// /g'' && echo

De esta forma, cat imprime caracteres NULL como ^@ y luego los reemplaza con un espacio usando sed ; echo imprime una nueva línea.


Para Linux y Unix System, puede usar ps -ef | grep process_name ps -ef | grep process_name para obtener la línea de comando completa,

En el sistema SunOS, si desea obtener la línea de comando completa, puede usar /usr/ucb/ps -auxww | grep -i process_name /usr/ucb/ps -auxww | grep -i process_name . Asegúrese de que en SunOS obtenga la línea de comando completa que necesita para convertirse en superusuario.

pargs -a PROCESS_ID . Esto le dará una lista de detalles de los argumentos pasados ​​para procesar. Dará la matriz de argumentos en salida como argv [o]: first argumen argv [1]: second ... así sucesivamente ...

No encontré ningún comando similar, pero daría el siguiente comando para obtener un out put como ese tr ''/0'' ''/n'' < /proc/<pid>/environ en Linux Environment.


Puede usar pgrep con -f (línea de comando completa) y -l (descripción larga):

pgrep -l -f PatternOfProcess

Este método tiene una diferencia crucial con cualquiera de las otras respuestas: funciona en CygWin , por lo que puede usarlo para obtener la línea de comando completa de cualquier proceso que se ejecute en Windows (ejecute como elevated si desea datos sobre cualquier proceso elevado / de administración) . Cualquier otro método para hacer esto en Windows es más incómodo, por ejemplo .
Además: en mis pruebas, el método pgrep ha sido el único sistema que trabajó para obtener la ruta completa de los scripts que se ejecutan dentro de CygWin''s python .


Puedes simplemente usar:

ps -o args= -f -p ProcessPid


intente "ps -n" en una terminal de Linux. esto mostrará:

1.Todos los procesos EN EJECUCIÓN, su línea de comando y sus PID

  1. El programa inicia los procesos.

Luego sabrás qué proceso matar