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.
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:
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 .
@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 :)
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.
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. ;)
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:
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.
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.
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.
nohup
e usá-lo posteriormente para okill
, ou encontrar o processo pelo nome do comando naps -ef
saída e obter o PID a partir dele. Você precisa procurar o nome do comando, nãonohup
.Respostas:
Ao usar
nohup
e 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, viakill PID
oukill -9 PID
(se precisar forçar a finalização). Como alternativa, você pode encontrar o PID posteriormenteps -ef | grep "command name"
e localizá-lo a partir daí. Observe que anohup
palavra-chave / comando em si não aparece naps
saída do comando em questão.Se você usou um script, pode fazer algo como:
Isso será executado,
my_command
salvando toda a saídamy.log
(em um script,$!
representa o PID do último processo executado). O2
é o descritor de arquivo para o erro padrão (stderr
) e2>&1
diz ao shell para encaminhar saída de erro padrão para a saída padrão (descritor de arquivo1
). Requer&1
que o shell saiba que é um descritor de arquivo nesse contexto, em vez de apenas um arquivo chamado1
. O2>&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á usartail -f my.log
. Por fim, se você precisar interromper o processo, poderá fazê-lo via:fonte
nohup
per se, que imprime o PID, é a final&
que fundos de TI, por exemplo,ls &
iria mostrar o PID para a execuçãols
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 chamado1
). Então,2 > &1
redireciona qualquer saída de erro padrão para a entrada padrão. Como os> my.log
meios anteriores para redirecionar a saída padrão paramy.log
, precisamos de uma maneira de garantir que as mensagens de erro também sejam acessadasmy.log
.2 > &1
garante que esses erros vão para a saída padrão, que por sua vez vai paramy.log
. Veja I / O redirecionamento .echo $!
dá-me o pid de nohup em vez do processo gerado: paste.fedoraproject.org/428697/99695314&
atua como um delimitador de comandos para que você possa tentarsh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"
,. Pode funcionar, mas não tentei.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:
Então, na primeira coluna, você encontra seu nome de usuário; Encontrei o seguinte três vezes:
Em seguida, na segunda coluna, você pode encontrar o PID do processo de nohup e digitar apenas:
(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 :)
fonte
suponha que eu esteja executando o script ruby em segundo plano com o comando abaixo
então eu posso obter o pid do processo em segundo plano, especificando o nome do comando. No meu caso, o comando é ruby.
resultado
Agora você pode facilmente matar o processo usando o comando kill
fonte
ps -ef
ekill
foram ambos bem abordados acima, então qual é a nova parte?jobs -l deve fornecer o pid para a lista de processos nohup. mate (-9) com cuidado. ;)
fonte
kill -9
menos que você saiba que sinais regulares não funcionam.Você poderia tentar
fonte
pkill [command name]
você pode usar a-o
bandeira para matar o processo de correspondência mais antigo ou-n
usar o mais novo.Isso funciona em
Ubuntu
Digite isso para descobrir o
PID
Todo o processo em execução referente ao java será mostrado
No meu caso é
Agora mate
kill -9 3315
O processo zumbi finalmente parou.
fonte
Suponha que você esteja executando um programa java com nohup, para obter o ID do processo java
resultado
então você pode matar o processo digitando
ou vamos dizer que você precisa matar todos os processos Java, basta usar
esse comando mata todos os processadores java. você pode usar isso com o processo. basta fornecer o nome do processo no final do comando
fonte
quando você cria um trabalho no nohup, ele indica o ID do processo!
a saída mostrará o ID do processo, como
você pode matá-lo então:
fonte
Iniciei o servidor django com o seguinte comando.
Isso funciona no CentOS:
fonte
process not found
confusão com nohup.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:
ps -ef
comando 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.ps -ef
comando. 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.lsof -i:port
se o processo ocupar algumas portas e você receberá o comando. Então, assim como a resposta acima, useps -ef | grep command
e você receberá o PID.Depois de encontrar o PID do processo, você pode usá-lo
kill pid
para finalizar o processo.fonte