Verifica o processo e mata se estiver executando

2

Estou tentando descobrir se um processo está sendo executado ou não e, se estiver em execução, quero chamar um script ou imprimir algo. Eu tentei com o abaixo algumas maneiras, mas me dá erro de sintaxe ou erro de comando não encontrado.

APP_ID = ps -eaf | grep -i 'whoami' | grep -i <process_name> | grep -i java | awk '{print$2}'

if[''!= '${APP_ID}'] then
    echo "Stopping instance $APP_ID"

Eu obtenho o resultado como abaixo:

test.sh: line 15: APP_ID: command not found
test.sh: line 17: if[!= ${APP_ID}]: command not found
Stopping instance 

O que há de errado no script acima? E se houver algum erro, por que imprimir o echo na condição if ?

Além disso, o script abaixo falha dizendo test.sh: line 3: [ps: command not found

if [ps -eaf | grep -i 'whoami' | grep -i <process_name> | grep -i java]; then
    echo 'stop'
fi
    
por user179309 13.07.2016 / 10:12

3 respostas

10

Sua sintaxe tem muitos problemas:

  • remova espaços em torno de "=" ao definir uma variável

    errado:

    APP_ID = value
    

    direita:

    APP_ID=value
    
  • para executar um programa e colocar sua saída em uma variável, você precisa de $(...) (preferido no bash, não disponível no sh) ou backticks 'command' (suportado no bash e sh). (e lembre-se que ao atribuir uma variável, aspas não são necessárias, mas em outros casos elas são importantes: command "$(command)" )

    errado:

    APP_ID=command
    

    direita:

    APP_ID=$(command)
    
  • adicione espaços ao redor de tudo quando usar "[", e você precisa de um ponto-e-vírgula ou nova linha após o "]". Isso ocorre porque "[" é um comando embutido bash, e o não interno também é conhecido como "teste" (consulte man test ), que, assim como outros comandos, leva seus argumentos separados por espaço:

    errado:

    if[x!= y] then echo hello world fi
    

    direita:

    if [ x != y ]; then echo hello world; fi
    
  • use aspas duplas, e não aspas simples quando quiser expandir uma variável

    errado:

    if [ '' != '${APP_ID}' ]; then
    

    direita:

    if [ '' != "${APP_ID}" ]; then
    
  • Também para o exemplo acima, você pode usar -n (não vazio) em vez de comparar com uma string vazia

    if [ -n "${APP_ID}" ]; then
    
  • E para o exemplo do ps, você não precisa do grep e do awk:

    APP_ID=$(ps -C whoami --no-header --format 'pid')
    

E aqui está o script corrigido:

APP_ID=$(ps -C whoami --no-header --format 'pid')

if [ -n "${APP_ID}" ]; then
    echo "Stopping instance $APP_ID"
fi
    
por 13.07.2016 / 10:23
3

Isso é feito com mais facilidade com pgrep e pkill :

if pgrep process_name 2>/dev/null; then
  echo "Terminating process_name"
  pkill process_name
fi

Como o usuário @OrangeDog aponta nos comentários, existe a possibilidade teórica de que esse código de shell falhe ao finalizar o processo process_name se o processo aparecer entre a chamada para pgrep e pkill . Nesse caso, pgrep não detectaria o processo e pkill nunca executaria. Quanto de um problema isso é, eu não sei. Se o processo gerar apenas após a declaração, o que você pode fazer?

Apenas faça

echo "terminating process_name (if it is running)"
pkill process_name

para se livrar da condição de corrida irritante em qualquer caso.

    
por 13.07.2016 / 13:21
1

Não sei por que, mas o script acima não estava dando problemas de sintaxe, mas também não estava dando o ID do processo, embora o processo estivesse em execução.

Eu finalmente mudei como abaixo e funciona -

APP_ID=$(ps -ef | grep <app_name> | grep java | awk '{print $2}')

echo "Instance $APP_ID"
if [ -n "${APP_ID}" ]; then
    echo "Stopping instance $APP_ID"
fi

Obrigado mais uma vez pela explicação e sugestões.

@Peter Vou verificar novamente o script que você postou sobre por que não está funcionando para mim.

    
por 13.07.2016 / 12:17