Um comando que retorna um ID de processo, se estiver em execução, ou alguma outra saída, se não estiver?

1

Eu estou procurando um comando que me dará o PID, e ele não está rodando, deve me dar alguma saída que não seja em branco.

No meu programa, às vezes, a biblioteca que estou usando dá saída em branco mesmo se esse processo estiver em execução e não consigo detectar se a saída em branco é devido à biblioteca ou porque o processo parou!

Alterar a chamada da biblioteca levará tempo, então estou procurando sugestões de um comando shell como solução alternativa?

    
por solarisguest 06.02.2014 / 05:37

3 respostas

1

Encontrando PIDs

Existem outras ferramentas em vez de ps para pesquisar processos com base em seus nomes.

$ pgrep name

Exemplo

$ sleep 100 &
[1] 2556

$ pgrep sleep
2556

Acima, podemos ver o processo chamado sleep é iniciado e, em seguida, em segundo plano. Se usarmos pgrep para procurar processos com esse nome, receberemos seu PID.

Verificando o status

Quanto à sua pergunta sobre a saída estar em branco. Quando os comandos retornam, muitas vezes eles retornam um código de status que fica armazenado em uma variável especial, $? em shells Bourne, como Bash. Então você simplesmente precisa interrogar o conteúdo desta variável para descobrir se o nome do processo que você estava procurando estava presente ou não.

Exemplo

Exemplo semelhante usando sleep novamente.

$ sleep 100 &
[1] 3228

Procure o PID de um processo chamado sleep .

$ pgrep sleep
3228

Verifique sua variável de status, $? , um zero significa que ela foi executada com êxito e encontrou o que procurávamos.

$ echo $?
0

Agora, se procurarmos por um processo falso chamado sleepy .

$ pgrep sleepy

Não apenas não obtemos saída, mas a variável de status possui uma, denotando que o comando que executamos não teve êxito em encontrar o que procurávamos.

$ echo $?
1
    
por 06.02.2014 / 06:36
1

Você pode combinar comandos da seguinte maneira:

ps <pid> || echo "message"

Se o pid existir, você receberá um pid ou você receberá uma mensagem impressa.

    
por 06.02.2014 / 05:44
0

Vou atacar a questão de um ângulo diferente. A resposta pgrep <some string> deve ser sua última escolha. Deixe-me explicar por quê.

Em qualquer sistema operacional Unix / Linux, não há maneira previsível de descobrir se 'um processo' está sendo executado, a menos que você tenha o PID desse processo. Todos os métodos baseados na correspondência de padrões de sequência no vetor arg do processo estão fadados ao fracasso mais cedo ou mais tarde. Exemplo: você pode pensar que, por exemplo pgrep mysqld é exatamente o que você precisa para descobrir se o seu banco de dados MySQL está rodando, mas falha no dia em que alguém inicia uma segunda instância do MySQL naquele host, o que seria uma ação perfeitamente legal.

Devido a problemas em usar correspondência de padrões de strings ao encontrar processos, você verá que quase todos os scripts 'profissionais' usam o método pidfile , ou seja, eles garantem que o PID seja salvo em um arquivo quando o processo é iniciado. O problema então se torna: "Como verificar se o PID está sendo executado?" onde você geralmente faria ps -p xxxx -o pid= , que retornará o próprio PID se o processo estiver sendo executado e, caso contrário, nada. O benefício deste comando é que ele é portátil em Linux / Solaris / BSD.

Eu repito: se você precisar recorrer a algo como pgrep name no seu script de verificação, então você fez algo errado quando iniciou o processo. pgrep name deve ser a última opção que você tenta e é realmente relevante somente se você não controlar como o processo é iniciado. Também não se deixe enganar por postagens de blogs na Internet que o levarão a acreditar que o Unix / Linux tem o conceito de um nome para um processo. No Unix / Linux não existe o nome de um processo, pelo menos não é algo remotamente único. Eu gostaria que houvesse, mas não há. A única coisa única sobre um determinado processo é o PID.

    
por 15.02.2014 / 20:24