Cómo hacer una búsqueda de PID? (golpetazo)
Pregunta
suponiendo que yo sepa el PID de un proceso y quiero hacer una búsqueda en ps -A, ¿cómo lo hago? He intentado hacer esto:
echo "Enter PID to search: "
read PID
search=$(ps -A | grep -v PID | awk '{print $1}')
Esto me vuelve con una larga lista de PID. Entonces, ¿cómo puedo obtener utilizar cada valor individual de la salida y hacer:
if [ "$PID" = "*each_value_in_search_list*" ]; then
........
En este caso estoy tratando de comparar lo que el usuario escribe con la salida de mi mando, así que ¿cómo lo hago? Estoy haciendo el camino correcto en el primer lugar? O hay alguna otra manera de hacer esto?
Gracias por su ayuda, todos los que respondieron a esta pregunta. (:
Solución
El modificador -v para grep realiza una búsqueda invertida, en otras palabras, obtendrá todo lo que no queremos. Después se establece una variable, se debe también hacer referencia a ella con el prefijo $.
Probar
#!/bin/bash
echo "Enter PID to search: "
read PID
search=$(ps --pid $PID -o comm=)
if [ $search ]
then
echo "Program: $search"
else
echo "No program found with PID: $PID"
fi
Otros consejos
Esta grepping la salida de ps
para todas las líneas que no contienen la cadena literal "PID". Que desea utilizar $PID
en lugar de utilizar el variables llamado PID en lugar del literal "PID". Además, puesto que no desea que los falsos positivos en otros campos que coinciden con el PID, solo partido en la primera columna:
search=$(ps -A | grep "^ *$PID\>" | awk '{print $1}')
La secuencia "\>"
de escape coincide con la cadena vacía al final de una palabra.
Algunas versiones de ps
soportan la opción -p
a sólo le dará la información sobre un PID específico, por lo que no es necesario grep o awk:
search=$(ps -p $PID)
Su "grep -v PID"
es un truco estándar para eliminar la línea de rumbo, no una forma de obtener los datos reales PID de la salida.
Si lo que quieres es los detalles de ese proceso, sólo tiene que utilizar:
search=$(ps -A | awk -v pid=$PID '$1==pid{print pid}')
que establecerá búsqueda al PID de que se trate si existe o la cadena vacía de lo contrario, que es lo que parecen querer.
Hay un problema con hacer una búsqueda a ciegas para el PID (en contraposición a la comprobación de la columna 1 con awk
) es que puede recoger las líneas en que la EPI se muestra en la cadena de comandos.
En lugar de utilizar grep
usted podría utilizar la opción -p
para pasar el PID directamente al comando ps
.
Si la raíz de la pregunta es para comprobar si el PID introducida corresponde a una entrada de proceso (raíz). Más específica, si usted es capaz de enviar una señal a ese proceso (usuario):
if kill -0 $PID >/dev/null 2>&1; then ...
Podría ser, por supuesto, que esto no es en absoluto lo que quiere. Me sentí libre de "interpretar" su pregunta un poco;)
<?php
echo shell_exec("ps -Ao cmd,pid|grep -P ' {$pid}$'");
?>