Como obter o pid do último comando executado no shell script?

Quero ter um script de shell como este:

my-app & echo $my-app-pid 

Mas eu quero não sei como obter o pid do comando que acabou de ser executado.

Eu sei que posso apenas usar o comando jobs -p my-app para fazer o grep do pid. Mas se eu quiser executar o shell várias vezes, esse método não funcionará. Porque o jobspec é ambíguo.

Resposta

O PID do último comando executado está no $! variável de shell:

my-app & echo $! 

Comentários

  • Está imprimindo pid como por exemplo. [1] 893. Quero apenas um número.
  • Deve-se observar que significa programas iniciados em segundo plano . Se nenhum processo em segundo plano foi iniciado, o parâmetro não está definido.
  • Outra solução válida é sugerida em (um comentário para uma resposta a) Como obter pid do processo recém-iniciado : oh, e o " oneliner ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 de novembro ' 10 às 14h28
  • @ user3153014 String s como " [2] 2625 " são impressos por shell após iniciar a tarefa em segundo plano. Isso não está relacionado à saída de echo $!
  • Normalmente uso esse código em um script quando preciso esperar até que o processo termine. my-app & myVar=$! ; fg. fg traz o processo para o primeiro plano novamente. Posso imprimir echo $myVar mais tarde e ' tenho certeza de que o my-app já foi concluído.

Resposta

Obtenha PID:

#!/bin/bash my-app & echo $! 

Salve PID na variável:

#!/bin/bash my-app & export APP_PID=$! 

Salve todas as instâncias PID no arquivo de texto:

#!/bin/bash my-app & echo $! >>/tmp/my-app.pid 

Salvar saída, erros e PID em arquivos separados :

#!/bin/bash my-app >/tmp/my-app.log 2>/tmp/my-app.error.log & echo $! >>/tmp/my-app.pid echo "my-app PID"s: $(cat /tmp/my-app.pid)" 

Comentários

  • A pergunta não ' para perguntar sobre o redirecionamento, sua resposta será praticamente a mesma que a aceita, exceto que, se uma instância de my-app terminar e, talvez ainda pior, seu PID for reutilizado mais tarde, você ' Haverá informações incorretas em seu arquivo. Eu não ' não acho que esta resposta agregue muito valor à resposta aceita existente
  • Postagem @EricRenouf atualizada!
  • outra derivada que pode ser útil. Isso obtém o PID e ao mesmo tempo o trata como um processo de primeiro plano (principalmente): sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $? `
  • isnt APP = main & uma maneira de obter o PID?

Resposta

Tente algo como

pidof my_app >> /tmp/my_app.pid 

Comentários

  • comando externo, e lento, se o sistema pode fornecer PID diretamente por que pesquisar em todos os processos para encontrar apenas isso ? e também pode ' ter certeza de que ' obterá o valor correto

Resposta

Tente algo assim:

 ps ef | grep "[m]y-app" | awk "{print $2}" 

Colocando a primeira letra do seu processo entre [ ] garante que você não obtenha o processo grep em sua lista. Se necessário, você também pode adicionar um grep ao seu nome de usuário.

Comentários

  • Isso ' é muito frágil na melhor das hipóteses e não ' funciona se my-app for executado mais de uma vez – davidshen84 especificamente se preocupa com isso cas.
  • Se você seguir esse caminho, deve usar pgrep em vez disso.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *