Como obter o ID do processo para matar um processo de nohup?

204

Estou executando um processo de nohup no servidor. Quando tento matá-lo, meu console de massa fecha.

é assim que eu tento encontrar o ID do processo:

ps -ef |grep nohup 

este é o comando para matar

 kill -9 1787 787
user2535056
fonte
6
Você está tentando matá-lo a partir de um script ou na linha de comando? Você precisa salvar o PID ao executá-lo nohupe usá-lo posteriormente para o kill, ou encontrar o processo pelo nome do comando na ps -efsaída e obter o PID a partir dele. Você precisa procurar o nome do comando, não nohup.
lurker
1
@ mbratch Você deve fazer disso uma resposta em vez de um comentário.
Ansgar Wiechers
@AnsgarWiechers obrigado pela sugestão. Às vezes, se minha resposta é muito breve, ou se não tenho certeza de que está cobrindo totalmente o que o OP está pedindo, hesito em publicá-la como resposta. Adicionei uma resposta e incluí mais informações.
lurker

Respostas:

353

Ao usar nohupe você colocar a tarefa em segundo plano, o operador em segundo plano ( &) fornecerá o PID no prompt de comando. Se seu plano é gerenciar manualmente o processo, você pode salvar esse PID e usá-lo mais tarde para finalizar o processo, se necessário, via kill PIDou kill -9 PID(se precisar forçar a finalização). Como alternativa, você pode encontrar o PID posteriormente ps -ef | grep "command name"e localizá-lo a partir daí. Observe que a nohuppalavra-chave / comando em si não aparece na pssaída do comando em questão.

Se você usou um script, pode fazer algo como:

nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt

Isso será executado, my_commandsalvando toda a saída my.log(em um script, $!representa o PID do último processo executado). O 2é o descritor de arquivo para o erro padrão ( stderr) e 2>&1diz ao shell para encaminhar saída de erro padrão para a saída padrão (descritor de arquivo 1). Requer &1que o shell saiba que é um descritor de arquivo nesse contexto, em vez de apenas um arquivo chamado 1. O 2>&1é necessário para capturar as mensagens de erro que normalmente são escritos para o erro padrão para o nossomy.log arquivo (que é proveniente de saída padrão). Consulte Redirecionamento de E / S para obter mais detalhes sobre como lidar com o redirecionamento de E / S com o shell.

Se o comando enviar a saída regularmente, você poderá verificar a saída ocasionalmente com tail my.log, ou se desejar segui-la "ao vivo", poderá usar tail -f my.log. Por fim, se você precisar interromper o processo, poderá fazê-lo via:

kill -9 `cat save_pid.txt`
rm save_pid.txt
espreitador
fonte
15
Um ligeiro esclarecimento, não é nohupper se, que imprime o PID, é a final &que fundos de TI, por exemplo, ls &iria mostrar o PID para a execuçãols
karmakaze
1
O que o '2> & 1' faz?
Viraj
4
@Viraj 2é o descritor de arquivo "erro padrão". >é o redirecionamento do shell e &1é o descritor de arquivo "saída padrão" ( &é necessário aqui para que o shell não pense que estou me referindo a um arquivo chamado 1). Então, 2 > &1redireciona qualquer saída de erro padrão para a entrada padrão. Como os > my.logmeios anteriores para redirecionar a saída padrão para my.log, precisamos de uma maneira de garantir que as mensagens de erro também sejam acessadas my.log. 2 > &1garante que esses erros vão para a saída padrão, que por sua vez vai para my.log. Veja I / O redirecionamento .
Lurker
6
echo $!dá-me o pid de nohup em vez do processo gerado: paste.fedoraproject.org/428697/99695314
Nehalem J Wani
1
@Mvorisek &atua como um delimitador de comandos para que você possa tentar sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt",. Pode funcionar, mas não tentei.
Lurker
91

Estou usando o red hat linux em um servidor VPS (e via SSH - putty), para mim o seguinte funcionou:

Primeiro, você lista todos os processos em execução:

ps -ef

Então, na primeira coluna, você encontra seu nome de usuário; Encontrei o seguinte três vezes:

  • Uma era a conexão SSH
  • O segundo foi uma conexão FTP
  • O último foi o processo de nohup

Em seguida, na segunda coluna, você pode encontrar o PID do processo de nohup e digitar apenas:

kill PID 

(substituindo o PID pelo PID do processo de nohup, é claro)

E é isso aí!

Espero que esta resposta seja útil para alguém que também sou muito novo no bash e no SSH, mas encontrei 95% do conhecimento necessário aqui :)

Phonebox
fonte
3
Eu acho que você quis dizer PID em vez de UID aqui?
Wprins
Eu concordo com @wprins. Matar o UID não funcionou para mim, mas matar o PID funcionou.
21717 Ryan
No meu caso, eu executei um script de shell de teste (long_running_script.sh) com nohup e & e dint know how to stop it. Finalmente, eu fiz um ps -ef | grep long_running * e encontre o PID. Então fiz um kill PID
Rennish Joseph 30/06/19
50

suponha que eu esteja executando o script ruby ​​em segundo plano com o comando abaixo

nohup ruby script.rb &

então eu posso obter o pid do processo em segundo plano, especificando o nome do comando. No meu caso, o comando é ruby.

ps -ef | grep ruby

resultado

ubuntu   25938 25742  0 05:16 pts/0    00:00:00 ruby test.rb

Agora você pode facilmente matar o processo usando o comando kill

kill 25938
Sanjay Salunkhe
fonte
1
Sanjay, só para ter certeza de que não estou perdendo nada, que parte da sua resposta é nova ou diferente das respostas fornecidas anos atrás? ps -efe killforam ambos bem abordados acima, então qual é a nova parte?
David C. Rankin
2
ps -ef fornecerá uma longa lista de resultados e a pesquisa nessa longa lista será difícil. então eu acho que ps -ef | grep ruby é melhor comando para procurar pid do que simplesmente fazer ps -ef
Sanjay Salunkhe
20

jobs -l deve fornecer o pid para a lista de processos nohup. mate (-9) com cuidado. ;)

Puneet S. Chauhan
fonte
11
Somente se o trabalho foi iniciado no shell atual. E não, a kill -9menos que você saiba que sinais regulares não funcionam.
Tripleee
1
Isso é útil, se você estiver em alguma imagem do docker em que o ps não esteja instalado :-)
Andreas Profous
5

Você poderia tentar

kill -9 `pgrep [command name]`
Balliver
fonte
2
muito agradável! Eu usei pkill [command name]você pode usar a -obandeira para matar o processo de correspondência mais antigo ou -nusar o mais novo.
Zanona 6/11
4

Isso funciona em Ubuntu

Digite isso para descobrir o PID

ps aux | grep java

Todo o processo em execução referente ao java será mostrado

No meu caso é

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

Agora mate kill -9 3315

O processo zumbi finalmente parou.

John Joe
fonte
4

Suponha que você esteja executando um programa java com nohup, para obter o ID do processo java

`ps aux | grep java`

resultado

xxxxx     9643  0.0  0.0  14232   968 pts/2   

então você pode matar o processo digitando

sudo kill 9643

ou vamos dizer que você precisa matar todos os processos Java, basta usar

sudo killall java

esse comando mata todos os processadores java. você pode usar isso com o processo. basta fornecer o nome do processo no final do comando

sudo killall {processName}
NuOne
fonte
2

quando você cria um trabalho no nohup, ele indica o ID do processo!

nohup sh test.sh &

a saída mostrará o ID do processo, como

25013

você pode matá-lo então:

kill 25013
broid
fonte
1

Iniciei o servidor django com o seguinte comando.

nohup manage.py runserver <localhost:port>

Isso funciona no CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 
Naseer-shaik
fonte
Este é o caminho para resolver a process not foundconfusão com nohup.
precisa saber é o seguinte
0

Hoje eu encontrei o mesmo problema. E como foi há muito tempo, esqueci completamente qual comando eu usava e quando. Eu tentei três métodos:

  1. Usando o STIME mostrado no ps -efcomando Isso mostra a hora em que você inicia o processo e é muito provável que você não faça o comando antes de fechar o ssh (depende de você). Infelizmente, não acho que o comando mais recente seja o comando executado usando nohup; portanto, isso não funciona para mim.
  2. O segundo é o PPID, também mostrado no ps -efcomando. Significa o ID do processo pai, o ID do processo que cria o processo. O ppid é 1 no ubuntu para processos que usam nohup para executar. Então você pode usarps --ppid "1" para obter a lista e verificar TIME (o tempo total da CPU que seu processo usa) ou o CMD para encontrar o PID do processo.
  3. Use lsof -i:portse o processo ocupar algumas portas e você receberá o comando. Então, assim como a resposta acima, use ps -ef | grep commande você receberá o PID.

Depois de encontrar o PID do processo, você pode usá-lo kill pidpara finalizar o processo.

Youth Wu
fonte