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
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.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24 de novembro ' 10 às 14h28echo $!
my-app & myVar=$! ; fg
.fg
traz o processo para o primeiro plano novamente. Posso imprimirecho $myVar
mais tarde e ' tenho certeza de que o my-app já foi concluído.