Mi respuesta es una variación de la respuesta típica para buscar "foobar" en una ps
lista. 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 cambio, 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 concatena una cadena estática [^]]
con cualquier patrón que esté buscando. No necesita quitar la primera letra de la cadena, luego insertarla entre las llaves cuadradas y luego concatenarla nuevamente. Al hacer scripts en shell, es más fácil simplemente pegarse [^]]
frente al patrón que estaba buscando. Cortar cadenas en Bash es algo feo, por lo que mi variación lo evita. Esta variación dice mostrar las líneas donde el patrón coincide SIN un corchete derecho]. 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 psgrep
comando portátil de la siguiente manera. Aquí, considero algunas diferencias entre Linux, OS X BSD y otros. Esto agrega los encabezados de columna de ps
, proporciona un más personalizadops
el formato que mejor se adapta a mis necesidades, y muestra procesos que enumeran más, más ancho para que ninguno de los argumentos de la línea de comandos se pierda. Bueno, la mayoría no se pierden. Java es Java, a menudo hace las cosas de la peor manera posible, por lo que algunos servicios de Java superarán la longitud máxima permitida de argumentos de los que la tabla de procesos realizará un seguimiento. Creo que esto es 1024 caracteres. La longitud de comando único permitida para iniciar un proceso es mucho más larga, pero la tabla de proceso del núcleo no se molesta en realizar un seguimiento de nada 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 procesos 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
}
grep --colour
.+1 para la respuesta concisa @jamzed, sin embargo, el OP podría necesitar alguna explicación:
Usando esa expresión regular, está iniciando un proceso que su cadena ps no coincidirá, ya que la expresión regular coincide
"django"
y no"[d]jango"
. De esa forma, excluirá el proceso que tiene la cadena "[d] jango", que en este caso es grep; Lo mismo se puede aplicar a pgrep, egrep, awk, sed, etc., cualquier comando que haya utilizado para definir la expresión regular.Desde man 7 regex
fuente
ps aux | grep [s]cript1
. ¿Podrías ayudar a comentar sobre la solución?ps | grep [d]jango
ps | grep d[j]ango
...
ps | grep djang[o]
fuente
ps aux| grep "[Z] "
ps aux | grep [s]cript1
ops aux | grep [s]cript2
. La línea grep todavía se muestra. ¿Podrías ayudar a comentar sobre la solución?Use pgrep en su lugar:
pgrep -lf django
fuente
pgrep
me da exactamente este problema. Pero debo decir que lo estoy probando en CygWin (dondeps
no se puede mostrar la línea de comando completa del proceso).pgrep
estaba coincidiendo. Resulta que coincidía con el nombre delbash
archivo de script desde el que lo estaba ejecutando. Agregarlo lo-x
arregló, luego coincide exactamente con el nombre del comando.Oh espera, esto funciona:
fuente
grep
, con lo que no puede contar en el caso general.ps -d | grep django
del hombre ps:
fuente
ps
son notoriamente no portátiles, por lo que sin información sobre para qué plataforma es, esta respuesta no es muy útil. Además, esto obviamente no es adecuado cuando no está seguro de que el proceso que está buscando no sea un líder de proceso (es decir, esto puede ayudar si su objetivo es un demonio, pero generalmente no de otra manera).