Comando con el que se ejecutó un proceso

8

Supongamos que ejecuté el proceso con el siguiente comando:

myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1

Después de un tiempo sólo tengo piddel myappproceso, por ejemplo 1234. ¿Hay una manera de obtener el comando con todas las banderas y la salida a la reorientación de myapp.logalguna manera con solo pid?

usuario3663882
fuente

Respuestas:

10
ps -o args= -p "$pid"

Le indicará la lista de argumentos dada al último comando que ejecutó el proceso (o si no ejecutó ninguno, el que ejecutó su padre ...) siempre que el proceso no anule su lista de argumentos después.

psmostrará esa lista arg concatenada con espacios y hasta un límite que puede aumentar con algunas psimplementaciones agregando un par de -wopciones). En Linux, puede ver el arglista separado por bytes NUL en /proc/$pid/cmdline.

lsof +fg -ap "$pid" -d 0-2

Le dirá a qué apuntan los descriptores de archivos stdin, stdout y stderr del proceso y el modo en que se abrieron (como W,APpara solo escritura con agregar como si >>se usara una redirección en un shell POSIX).

Stéphane Chazelas
fuente
+1 por usar lsofpara detectar que el proceso se está redirigiendo amyapp.log
joeytwiddle
1
Otra forma de encontrar el archivo de salida es:readlink /proc/$pid/fd/1
joeytwiddle
Aaah, ¡pensé que el OP significaba indicadores de proceso, no una impresión del comando y sus opciones! Buena respuesta.
Arronical
4

Puede usar el pscomando y especificar el pid para examinar con el -pmodificador, utilizando el -fmodificador para obtener una lista completa o -luna lista larga más detallada.

Como ejemplo de salida:

$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S     0 31441 31319  0  80   0 -  1423 hrtime pts/3    00:00:00 sleep
$ ps -fp 31441
UID        PID  PPID  C STIME TTY          TIME CMD
root     31441 31319  0 10:44 pts/3    00:00:00 sleep 60

Sin embargo, esto genera una línea de encabezado, que quizás no desee en su archivo de registro. Puede recortar esto usando la -hopción, si su pid fue 1234:

ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1

Tenga en cuenta que he redirigido la salida usando >>para agregar a su archivo de registro.

Arronico
fuente
Para eliminar la línea de encabezado tail -n+1(requiere GNU, pero Q era Linux / Ubuntu). O evite el problema con ps -h{f,l}p 1234(también GNU).
dave_thompson_085
@ dave_thompson_085 gracias, sabía que había una opción para eliminar el encabezado, pero no me desplacé lo suficiente por la página de manual. tail -n1definitivamente funciona en Ubuntu, ¿por qué es +necesario?
Arronical
Creo que Dave quería sugerir tail -n+2qué muestra todas las líneas excepto la primera. tail -n1muestra solo la última línea. Compare: seq 1 10 | tail -n+2y así sucesivamente.
joeytwiddle
1
@joeytwiddle ah, ahora veo, edité para incluir su consejo de usar, -hya que evita una tubería innecesaria y un proceso adicional.
Arronical
1

Utilizando ps -fpuede verificar la lista de argumentos y también puede redirigirla a cualquier archivo.

Entonces, en este caso solo use ps -ef | grep 1234 > myapp.log

Por favor, consulte esta página de manual de ps .

Harshit
fuente
1
¿Esto tampoco generará los detalles del comando grep?
Arronical
2
@Arronical Sí, tienes razón. Puede evitar eso excluyendo el comando grep:ps -ef | grep 'foo' | grep -v grep
maulinglawns
@maulinglawns, eso es lo que habría hecho si siguiera la ruta grep, también tiene la ventaja de eliminar el encabezado.
Arronical
Para evitarlo grep -v, uso este truco:grep '123[4]'
joeytwiddle