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
- El programa inicia los procesos.
Luego sabrás qué proceso matar