encurtando a saída do comando ps efo cmd | grep

0

Eu quero condicionar se um determinado processo está sendo executado ou não. O processo tem uma descrição muito longa, mais ou menos como

/usr/bin/xpdf -remote myXpdfServer -title Bayes2_notes -papercolor cornsilk -geometry 1910x1019+0+29 /home/simon/research/Ward/Bayes2_notes.pdf

Eu às vezes tenho que usar um xterm com um pequeno número de colunas, digamos n. Neste caso, se eu executar ps -ef, então grep para algum elemento no final desta string, ps truncará a string, retornando apenas os primeiros n caracteres, e meu comando grep falhará.

Para corrigir isso, eu tentei ps efo cmd | grep etc etc. Isso ajuda alguns, mas Não tanto quanto eu gosto. Por exemplo, o comando óbvio para tentar:

ps eco cmd | grep xpdf | grep -v grep

retorna o seguinte:

| .................................. \ _ / usr / bin / xpdf -remote myXpdfServer

onde esses pontos denotam espaços em branco que não aparecem neste fórum. Eu gostaria muito de me livrar do lixo, especialmente do espaço em branco, no começo, ou seja, tudo o que precede / usr. Note que o encanamento para cortar ou sed ou algo mais não ajudará neste caso: o comprimento da string retornada pelo ps é determinado pelo número de colunas xterm, então encurtar esta string pelo pós-processamento não pode me ajudar, porque a string que preciso examinar já foi truncada no momento em que o corte consegue fazer sua parte. Tenho certeza que a única maneira de fazer o que eu quero fazer é adicionar algum outro sinalizador ao comando ps ef.

Muito obrigado por qualquer conselho!

    
por Leo Simon 19.08.2015 / 08:34

2 respostas

1

ps -ww fornece saída de largura ilimitada. Você pode usar tanto de sua linha de comando quanto desejar. Se você prefixar sua string para coincidir com [ ] , o grep não corresponderá a si próprio. Se você adicionar -q ao grep, não haverá saída, mas você poderá usar o código de retorno: será 0 se for encontrado, 1 caso contrário. Então

if ps alxww | grep -q '[ ]/usr/bin/xpdf -remote myXpdfServer -title Bayes2_notes -papercolor cornsilk -geometry 1910x1019+0+29 /home/simon/research/Ward/Bayes2_notes.pdf'
then echo running
else echo not
fi

grep, na verdade, corresponde a padrões, não a seqüências exatas. Em um padrão, existem personagens "mágicos" que não se sustentam por si mesmos. Felizmente, a string de linha de comando para a qual você está procurando não possui caracteres mágicos, portanto, seu padrão corresponde exatamente à string. Alguns caracteres mágicos são [ , * , . , ( , + . Em particular, o padrão [ ] significa corresponder ao caractere de espaço. Portanto, é um padrão aparentemente sem sentido porque é exatamente o mesmo que um espaço sozinho: "".

Mas como você sabe, fazer um ps|grep string encontrará o comando grep, bem como o comando que nos interessa. Mas usando [ ] , o grep não irá mais corresponder ao seu próprio comando porque na saída do ps existe serão os 3 chars "[]" e não o único caracter "", então o padrão (1 espaço) não será compatível.

É um pouco difícil de entender. Você pode ler sobre padrões, chamados expressões regulares , em man grep . Eles são incrivelmente úteis.

Quando você executa isRunning=$(ps -ef | grep -q '[ ]xpdf ') , sua variável é definida como uma string vazia porque grep -q não produz saída. O código de retorno do último comando executado pelo shell está disponível na variável $? da shell. Será 0 para verdadeiro, ou seja, o grep correspondido ou diferente de zero (normalmente 1). O valor a esperar é mostrado na seção STATUS DE SAÍDA de man grep .

Então, se você quiser manter o resultado que você pode fazer, por exemplo:

ps -ef | grep -q '[ ]xpdf '
isRunning=$?
if [ $isRunning = 0 ]
then echo "running. isRunning=$isRunning"
else echo "not. isRunning=$isRunning"
fi
    
por meuh 19.08.2015 / 20:13
0
% bl0ck_qu0te%

eu usaria

pidof nameofyourprogram 

Veja a página de manual para saber o status da sua condição.

    
por Katu 19.08.2015 / 08:59