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
abc
estiver em execução, faça issose 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 abc
ou pgrep abc
seja 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 abc
algum lugar em seu nome ou argumentos), causando um falso positivo para seu teste. Existem várias opções nas quais você pode se inscrever ps
e grep
restringir pgrep
a 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 pidof
com 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
$