Linux - Evitar cat: não existe esse arquivo ou diretório quando o arquivo não existe

3

Estou verificando por meio de um script bash se um processo está sendo executado com base no PID armazenado em um arquivo. Recebo o erro mostrado acima quando o arquivo não existe, pois o comando está tentando acessar o arquivo e verifico se o PID está realmente lá, portanto é normal, mas eu gostaria de evitá-lo, se possível.

Existe tal maneira?

O comando que estou usando pode ser encontrado abaixo.

se matar -0 $ (cat "$ pid_file")

Agradeço antecipadamente.

croussou
fonte
mostre o conteúdo do pid_file - aposto que existe um \nno final desse arquivo.
mnmnc
No código semi-humano: Se existir $ PID_file , mate kill -0 $ (cat "$ pid_file"). Veja também se -e . Código UNTESTED possível: se [-e $ pid_file], em seguida, echo "$ pid_file encontrado. Enviando sinal kill -0 $ (cat" $ pid_file ") else echo" $ pid_file is not exist. "Fi done
Hennes
obrigado por responder, o arquivo PID apenas armazena o número do processo PID de um aplicativo em execução ... portanto, quando o aplicativo não está em execução e o arquivo não é gerado, eu gostaria de testar se o PID existe mesmo assim apenas para estar seguro lado.
croussou
Tente comcat "$pid_file" | head -n 1 | tr -d "\n"
mnmnc 22/06
Você tentou com pgrep? verifique o -Finterruptor.
mnmnc

Respostas:

3

[[ -f "$pid_file ]] && (cat "$pid_file" | head -n 1 | tr -d "\n")

Este comando retornará um status diferente de zero. Se você deseja um "sempre retorne zero" (sacrificando a legibilidade):

[[ ! -f "$pid_file ]] || (cat "$pid_file" | head -n 1 | tr -d "\n")

Felipe Lema
fonte
Ah, entendo, basicamente agora estou fazendo o oposto, se o arquivo existe ou o PID existe com base no arquivo ... vou alterá-lo como sua sugestão e voltar, obrigado.
croussou
2

Você precisa de uma condição para verificar se o arquivo existe e, se não desejar ver erros ao tentar killum PID que não existe mais, redirecione-o stderrpara /dev/null. Você vai acabar com algo como:

PID_EXISTS=$([[ -f "$pid_file" ]] && kill -0 $(<"$pid_file") 2> /dev/null && echo 1 || echo 0)

Isso armazenará 1um pid existente e 0um inexistente. Você pode usar a variável em uma comparação, como:

if [[ $PID_EXISTS -eq 1 ]]; then echo FOUND; else echo NOTFOUND; fi

Ou apenas imprima seu resultado:

echo $PID_EXISTS

Não cat. Miau!

jweyrich
fonte
Neste caso, eu sugiro para purgar o PID não mais existente na lista com uma sed... Mesmo baixo, há uma probabilidade de que este PID antes ou depois será usado de novo ...
Hastur
1

Ou, você pode apenas usar pgrep:

if pgrep -F "$pid_file" &>/dev/null; then
    echo yep
else
    echo nope
fi
cYrus
fonte