Como determinar se um processo está em execução ou não e usá-lo para criar um script de shell condicional?

Como determinar se um processo está em execução ou não e usá-lo para criar um script de shell condicional?

Como posso determinar se um processo está em execução ou não e, em seguida, fazer com que um script bash execute algumas coisas com base nessa condição?

Por exemplo:

  • se o processo abcestiver em execução, faça isso

  • se não estiver funcionando, faça isso.

Responder1

Um script bash para fazer algo assim seria mais ou menos assim:

#!/bin/bash

# Check if gedit is running
# -x flag only match processes whose name (or command line if -f is
# specified) exactly match the pattern. 

if pgrep -x "gedit" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

Este script está apenas verificando se o programa "gedit" está em execução.

Ou você só pode verificar se o programa não está rodando assim:

if ! pgrep -x "gedit" > /dev/null
then
    echo "Stopped"
fi

Responder2

Qualquer solução que use algo parecido ps aux | grep abcou pgrep abcseja falha.

Por que?

Como você não está verificando se um processo específico está em execução, você está verificando se há algum processo em execução que corresponda ao abc. Qualquer usuário pode facilmente criar e executar um executável nomeado abc(ou que contenha abcalgum lugar em seu nome ou argumentos), causando um falso positivo para seu teste. Existem várias opções nas quais você pode se inscrever pse greprestringir pgrepa pesquisa, mas você ainda não obterá um teste confiável.

Então, como faço para testar de forma confiável um determinado processo em execução?

Isso depende do que você precisa do teste.

Quero garantir esse serviçoabcestá em execução e, se não, inicie-o

É para isso que serve o systemd. Ele pode iniciar o serviço automaticamente e acompanhá-lo, e pode reagir quando morrer.

VerComo posso verificar se meu servidor de jogo ainda está em execução...para outras soluções.

abcé meu roteiro. Preciso ter certeza de que apenas uma instância do meu script está em execução.

Neste caso, use um lockfile ou um lockdir. Por exemplo

#!/usr/bin/env bash

if ! mkdir /tmp/abc.lock; then
    printf "Failed to acquire lock.\n" >&2
    exit 1
fi
trap 'rm -rf /tmp/abc.lock' EXIT  # remove the lockdir on exit

# rest of script ...

VerBash Perguntas frequentes 45para outras formas de bloqueio.

Responder3

Isto é o que eu uso:

#!/bin/bash

#check if abc is running
if pgrep abc >/dev/null 2>&1
  then
     # abc is running
  else
     # abc is not running
fi

Em inglês simples:se 'pgrep' retornar 0, o processo está em execução, caso contrário, não está.


Leitura relacionada:

Script Bash ::Comparações de strings

Manuais Ubuntupgrep

Responder4

Seguindo a ideia de @rommel-cid, você pode usar pidofcom o || (||) para executar um comando se o processo não existir e && para executar algo se o processo existir, criando assim uma condicional if/then/else rápida. Por exemplo, aqui está um com um processo em execução (meu navegador Chrome, cujo nome do processo é "chrome") e outro testando um processo que não existe. Suprimi a saída padrão usando 1>/dev/null para que ela não fosse impressa:

$ (pidof chrome 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run instea\
d"
its running? ok, so am i then
$ (pidof nosuchprocess 1>/dev/null && echo "its running? ok, so am i then" ) || echo "it's not running? ok i'll run\
 instead"
it's not running? ok i'll run instead
$

informação relacionada