process – ¿Cómo evitar que "ps" informe su propio proceso?

Pregunta:

$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

¿Hay alguna manera de evitar que se informe el último proceso (es decir, el grep que se inició al mismo tiempo que mi comando ps)?

(Comencé a tratar de encontrar una expresión regular que coincidiera con el literal pero no con ella misma, pero eso parecía, um, no el enfoque correcto …)

Respuesta:

Mi respuesta es una variación de la respuesta típica para buscar "foobar" en una lista de ps . El argumento de "-A" "ps" es más portátil que "aux" , creo, pero este cambio es irrelevante para la respuesta. La respuesta típica se ve así:

$ ps -A -ww | grep [f]oobar

En su lugar, uso este patrón:

$ ps -A -ww | grep [^]]foobar

La principal ventaja es que es más fácil escribir scripts basados ​​en estos patrones porque simplemente concatenas una cadena estática [^]] con cualquier patrón que estés buscando. No es necesario quitar la primera letra de la cadena, luego insertarla entre las llaves cuadradas y luego concatenarla nuevamente. Cuando se escribe en shell, es más fácil simplemente pegar [^]] delante del patrón que estaba buscando. Cortar cuerdas en Bash es algo feo, así que mi variación lo evita. Esta variación dice mostrar las líneas donde el patrón coincide SIN un corchete derecho inicial]. Dado que el patrón de búsqueda para excluir un corchete en realidad agrega el corchete al patrón, nunca coincidirá.

Entonces podría escribir un comando psgrep portátil de la siguiente manera. Aquí, hago algunas concesiones para las diferencias entre Linux, OS X BSD y otros. Esto agrega los encabezados de columna de ps , proporciona un formato ps más personalizado que se adapta mejor a mis necesidades y muestra los procesos que enumeran extra, extra ancho para que no se pierda ninguno de los argumentos de la línea de comandos. Bueno, la mayoría no se pierden. Como Java es Java, a menudo hace las cosas de la peor manera posible, por lo que algunos servicios de Java se ejecutarán más allá de la longitud máxima permitida de argumentos que la tabla de procesos realizará un seguimiento. Creo que son 1024 caracteres. La longitud de un solo comando permitida para iniciar un proceso es mucho más larga, pero la tabla de procesos del kernel no se molesta en realizar un seguimiento de cualquier cosa de más de 1K de longitud. Una vez que se inicia el comando, el nombre del comando y la lista de argumentos no son necesarios, por lo que lo que se almacena en la tabla de proceso es solo informativo.

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım