Minha resposta é uma variação da resposta típica para pesquisar por "foobar" em uma listagem ps
. O argumento de "-A" "ps"
é mais portátil que "aux"
, acredito, mas essa mudança é irrelevante para a resposta. A resposta típica é assim:
$ ps -A -ww | grep [f]oobar
Em vez disso, uso esse padrão:
$ ps -A -ww | grep [^]]foobar
A principal vantagem é que é mais fácil escrever scripts baseados nesses padrões, porque você simplesmente concatena uma string estática [^]]
com qualquer padrão que esteja procurando. Você não precisa retirar a primeira letra da corda, em seguida, inseri-la entre as chaves quadradas e depois concatená-la novamente. Ao fazer o script no shell, é mais fácil simplesmente colocar [^]]
na frente do padrão que você estava procurando. String fatiar em Bash é uma coisa feia, então minha variação evita isso. Esta variação diz mostrar as linhas onde o padrão corresponde SEM um colchete direito à direita]. Como o padrão de pesquisa para excluir um colchete na verdade adiciona o colchete ao padrão, ele nunca se igualará.
Você pode escrever um comando portátil psgrep
da seguinte maneira. Aqui, eu faço algumas diferenças entre o Linux, OS X BSD e outros. Isso adiciona os cabeçalhos de coluna de ps
, fornece um formato ps
mais personalizado que atende às minhas necessidades e exibe processos que listam extra, extra largo para que nenhum dos argumentos da linha de comando seja perdido. Bem, a maioria não é perdida. Java sendo Java, muitas vezes faz as coisas da pior maneira possível, assim você alguns serviços java serão executados após o comprimento máximo permitido de argumentos que a tabela de processos acompanhará. Eu acredito que isso é 1024 caracteres. O comprimento de comando solitário permitido para iniciar um processo é muito maior, mas a tabela de processo do kernel não se preocupa em rastrear qualquer coisa com mais de 1K de comprimento. Uma vez que o comando é iniciado, o nome do comando e a lista de argumentos não são necessários, então o que é armazenado na tabela de processos é apenas 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
}