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
-vinterruptor de grep invierte el resultado, excluyéndolo de la cola. Así que hazlo así:Upd . También puede usar el
-Cinterruptor para especificar el nombre del comando de la siguiente manera:Este último
-odetermina qué columnas de la información desea en el listado.pidenumera solo la columna de identificación del proceso. Y el signo igual=despuéspidsignifica 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 grepserá más fácil de entender cuando revise mi código."[d]" does not match "[d]" only "d"?grepcomando no coincida con lapslínea de salida delgrepcomando en sí (lo que tak llamó "un segundo PID" en la pregunta original). expresióna[xy]dno no coincide con el textoa[xy]dpero sí texto partidoaxdo textoayd. Por lo tanto, la expresión[f]oocoincide con el textofoopero no con el texto[f]oo. Espero que sea claro.Evite el resultado del análisis
pssi hay alternativas más confiables.fuente
pgrepbusca por subcadena mientras quepidofpor coincidencia exacta: ¡exactamente lo que necesitaba! ¡Gracias!La
ps -Copció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 auxle dará la lista completa de procesos en la mayoría de los sistemas basados en Unix y, porawklo general, se instala de manera predeterminada.fuente
Use
pgreppara 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
pgrepes que nunca se reportará como un partido. Pero no necesita obtener el pidpgrepy luego matar el proceso correspondientekill. Use en supkilllugar:Especifique la
SIGKILLseñal (-9o-KILL) en lugar deSIGTERM(por defecto):Busque el nombre del proceso (
-l) y los argumentos (-f), solicite confirmación (-I) antes de eliminarlo mediante laSIGKILLseñal (-9o-KILL):Tenga en cuenta que la
-Iopció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 -eaffuente
ps -eaf | grep "process_name" | awk '{print $2}'esta línea le devuelve el pid (id de proceso) excluyendo "grep"
fuente