He improvisado un comando para devolver el ID de proceso de un demonio en ejecución:
ps aux | grep daemon_name | awk "{ print \$2 }"
Funciona perfectamente y devuelve el PID, pero también devuelve un segundo PID, que presumiblemente es el proceso que estoy ejecutando ahora. ¿Hay alguna forma de excluir mi comando de la lista de PID devueltos?
Lo he probado varias veces y parece que mi comando siempre es el segundo PID de la lista, pero no quiero tomar solo el primer PID en caso de que sea inexacto.
Respuestas:
El
-v
interruptor de grep invierte el resultado, excluyéndolo de la cola. Así que hazlo así:Upd . También puede usar el
-C
interruptor para especificar el nombre del comando de la siguiente manera:Este último
-o
determina qué columnas de la información desea en el listado.pid
enumera solo la columna de identificación del proceso. Y el signo igual=
despuéspid
significa que no habrá título de columna para ese, por lo que solo obtendrá los números claros: PID.Espero que esto ayude.
fuente
Puedes usar un truco de clase de personaje. "[d]" no coincide con "[d]" solo "d".
Prefiero esto a usar
| grep -v grep
.fuente
| grep -v grep
será más fácil de entender cuando revise mi código."[d]" does not match "[d]" only "d"
?grep
comando no coincida con laps
línea de salida delgrep
comando en sí (lo que tak llamó "un segundo PID" en la pregunta original). expresióna[xy]d
no no coincide con el textoa[xy]d
pero sí texto partidoaxd
o textoayd
. Por lo tanto, la expresión[f]oo
coincide con el textofoo
pero no con el texto[f]oo
. Espero que sea claro.Evite el resultado del análisis
ps
si hay alternativas más confiables.fuente
pgrep
busca por subcadena mientras quepidof
por coincidencia exacta: ¡exactamente lo que necesitaba! ¡Gracias!La
ps -C
opción no es universal en todos los sistemas basados en Unix, pero si funciona en sus sistemas. En cambio, evitaría grep por completo:ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'
No es necesario escapar de nada entre comillas simples.
ps aux
le dará la lista completa de procesos en la mayoría de los sistemas basados en Unix y, porawk
lo general, se instala de manera predeterminada.fuente
Use
pgrep
para buscar el pid de un proceso por nombre:Con un nombre de proceso adicional en el resultado (
-l
):Busque y muestre el nombre del proceso (
-l
) y los argumentos (-f
):Lo bueno de esto
pgrep
es que nunca se reportará como un partido. Pero no necesita obtener el pidpgrep
y luego matar el proceso correspondientekill
. Use en supkill
lugar:Especifique la
SIGKILL
señal (-9
o-KILL
) en lugar deSIGTERM
(por defecto):Busque el nombre del proceso (
-l
) y los argumentos (-f
), solicite confirmación (-I
) antes de eliminarlo mediante laSIGKILL
señal (-9
o-KILL
):Tenga en cuenta que la
-I
opción solo está disponible en algunas versiones depkill
, por ejemplo, la de OS X Mavericks.fuente
Si está utilizando bash, también puede hacerlo de la siguiente manera haciendo uso de
ps -eaf
fuente
ps -eaf | grep "process_name" | awk '{print $2}'
esta línea le devuelve el pid (id de proceso) excluyendo "grep"
fuente