Estou tentando verificar se um processo (suponha que seja chamado some_process
) está sendo executado em um servidor. Se for, então eco 1, caso contrário, eco 0.
Este é o comando que estou usando, mas ele funciona apenas parcialmente (mais informações abaixo). Note que eu preciso escrever o script em uma linha.
ps aux | grep some_proces[s] > /tmp/test.txt && if [ $? -eq 0 ]; then echo 1; else echo 0; fi
Nota: O [s]
no some_proces[s]
é para evitar grep
de retornar em si.
Se some_process
estiver em execução, o "1"
eco será exibido, o que é bom. No entanto, se some_process
não estiver em execução, nada será repetido.
ps -Ccmd
para encontrar processos cujo nome de comando seja "cmd", que pode eliminar completamente ogrep
.ps
definirá o código de saída para um valor diferente de zero se ele não encontrar um processo de correspondência.Respostas:
Não há necessidade de verificar explicitamente
$?
. Apenas faça:Observe que isso depende do eco não falhar, o que certamente não é garantido. Uma maneira mais confiável de escrever isso é:
fonte
echo 1
falhar,echo 0
será executado. Nesse caso, o eco 1 nunca falhará, mas observe que A&& B || C não é se-então-outro. C pode ser executado quando A for verdadeiro. (Da verificação de shell ).if ps aux | grep some_proces[s]; then echo 1; else echo 0; fi
. Localmente, parece funcionar para mim. É porque o OP teve o redirecionamento no comando que ele tentou?grep -q
ou redirecionado para / dev / null).pgrep
.&&
significa "e se for bem-sucedido"; colocando suaif
declaração no lado direito, você garante que ela só será executada segrep
retornar0
. Para corrigi-lo, use;
:(ou apenas use uma quebra de linha).
fonte
Use
grep -vc
para ignorargrep
naps
saída e conte as linhas simultaneamente.fonte
Você pode fazer pleno uso dos operadores
&&
e||
assim:Para excluir o próprio grep, você também pode fazer algo como:
fonte
mais oneliners aqui
fonte