¿Cómo obtener la ID del proceso para matar un proceso nohup?


204

Estoy ejecutando un proceso nohup en el servidor. Cuando trato de matarlo, mi consola de masilla se cierra en su lugar.

así es como trato de encontrar la ID del proceso:

ps -ef |grep nohup 

este es el comando para matar

 kill -9 1787 787

66
¿Estás tratando de matarlo desde un script o en la línea de comando? Necesita guardar el PID cuando lo hace nohupy usarlo más tarde para el kill, o encontrar el proceso por su nombre de comando en la ps -efsalida y obtener el PID de eso. Tienes que buscar el nombre del comando, no nohup.
merodeador

1
@mbratch Deberías hacer de eso una respuesta en lugar de un comentario.
Ansgar Wiechers

@AnsgarWiechers gracias por la sugerencia. A veces, si mi respuesta es muy breve, o si no estoy seguro de que cubra totalmente lo que está pidiendo el OP, dudo en publicarla como respuesta. Agregué una respuesta e incluí más información.
lurker

Respuestas:


353

Al usar nohupy poner la tarea en segundo plano, el operador de fondo ( &) le dará el PID en el símbolo del sistema. Si su plan es administrar manualmente el proceso, puede guardar ese PID y usarlo más tarde para matar el proceso si es necesario, a través de kill PIDo kill -9 PID(si necesita forzar la muerte). Alternativamente, puede encontrar el PID más adelante ps -ef | grep "command name"y ubicar el PID desde allí. Tenga en cuenta que la nohuppalabra clave / comando en sí no aparece en la pssalida del comando en cuestión.

Si usaste un script, podrías hacer algo como:

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

Esto se ejecutará my_commandguardando toda la salida en my.log(en un script, $!representa el PID del último proceso ejecutado). El 2es el descriptor de archivo para el error estándar ( stderr) y 2>&1le dice al shell que enrute la salida de error estándar a la salida estándar (descriptor de archivo 1). Se requiere &1para que el shell sepa que es un descriptor de archivo en ese contexto en lugar de solo un archivo llamado 1. Se 2>&1necesita para capturar cualquier mensaje de error que normalmente se escribe en un error estándar en nuestro my.logarchivo (que proviene de la salida estándar). Consulte Redirección de E / S para obtener más detalles sobre el manejo de la redirección de E / S con el shell.

Si el comando envía resultados de manera regular, puede verificar el resultado ocasionalmente con tail my.log, o si desea seguirlo "en vivo", puede usarlo tail -f my.log. Finalmente, si necesita matar el proceso, puede hacerlo a través de:

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
Una ligera aclaración, no es nohupper se, que imprime el PID, es el final &que lo ls &ls
pone en

1
¿Qué hace el '2> y 1'?
Viraj

44
@Viraj 2es el descriptor de archivo de "error estándar". >es la redirección de shell y &1es el descriptor de archivo de "salida estándar" ( &aquí se necesita para que el shell no piense que me estoy refiriendo a un archivo llamado 1). Entonces 2 > &1redirige cualquier salida de error estándar a la entrada estándar. Dado que los > my.logmedios anteriores para redirigir la salida estándar my.log, necesitamos una manera de asegurarnos de que los mensajes de error también se envíen my.log. 2 > &1asegura que tales errores pasen a la salida estándar, que a su vez va a my.log. Ver E / S redirección .
acechador

66
echo $!me da el pid de nohup en lugar del proceso generado: paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &actúa como un delimitador de comandos lo que podría intentar, sh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt". Puede funcionar, pero no lo he probado.
acechador

91

Estoy usando Red Hat Linux en un servidor VPS (y a través de SSH - masilla), para mí funcionó lo siguiente:

Primero, enumera todos los procesos en ejecución:

ps -ef

Luego, en la primera columna, encontrará su nombre de usuario; Lo encontré las siguientes tres veces:

  • Uno fue la conexión SSH
  • El segundo fue una conexión FTP
  • El último fue el proceso nohup

Luego, en la segunda columna, puede encontrar el PID del proceso de nohup y solo escribe:

kill PID 

(reemplazando el PID con el PID del proceso nohup, por supuesto)

¡Y eso es todo!

Espero que esta respuesta sea útil para alguien que también soy muy nuevo en bash y SSH, pero encontré el 95% del conocimiento que necesito aquí :)


3
Creo que te refieres a PID en lugar de UID aquí?
wprins

Estoy de acuerdo con @wprins. Matar el UID no funcionó para mí, pero matar el PID sí.
Ryan

En mi caso, ejecuté un script de shell de prueba (long_running_script.sh) con nohup y & y no sé cómo detenerlo. Finalmente, hice un ps -ef | grep long_running * y ensucia el PID. Luego hizo un PID de asesinato
Rennish Joseph

50

Supongamos que estoy ejecutando Ruby Script en segundo plano con el siguiente comando

nohup ruby script.rb &

entonces puedo obtener el pid del proceso de fondo anterior especificando el nombre del comando. En mi caso el comando es rubí.

ps -ef | grep ruby

salida

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

Ahora puedes matar fácilmente el proceso usando el comando kill

kill 25938

1
Sanjay, así que estoy seguro de que no me falta nada, ¿qué parte de tu respuesta es nueva o diferente de las respuestas proporcionadas hace años? ps -efy killambos estaban bien cubiertos arriba, entonces, ¿cuál es la parte nueva?
David C. Rankin

2
ps -ef le dará la larga lista de resultados y la búsqueda de esta larga lista será difícil. entonces creo que ps -ef | grep ruby ​​es mejor comando para buscar pid que solo hacer ps -ef
Sanjay Salunkhe

20

jobs -l debería darte el pid para la lista de procesos nohup. mátalos (-9) suavemente. ;)


11
Solo si el trabajo se inició en el shell actual. Y no, a kill -9menos que sepa que las señales regulares no funcionan.
tripleee

1
Esto es útil, si estás en alguna imagen de Docker donde ps no está instalado :-)
Andreas Profous

5

Tu podrías intentar

kill -9 `pgrep [command name]`

2
¡muy agradable! Utilicé pkill [command name]que puedes usar la -obandera para eliminar el proceso de coincidencia más antiguo o -nutilizar el más nuevo en su lugar.
zanona

4

Esto funciona en Ubuntu

Escriba esto para descubrir el PID

ps aux | grep java

Se mostrará todo el proceso de ejecución con respecto a Java

En mi caso es

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

Ahora mátalo kill -9 3315

El proceso zombie finalmente se detuvo.


4

Supongamos que está ejecutando un programa java con nohup, puede obtener la identificación del proceso java al

`ps aux | grep java`

salida

xxxxx     9643  0.0  0.0  14232   968 pts/2   

entonces puedes matar el proceso escribiendo

sudo kill 9643

o digamos que necesita matar todos los procesos de Java y luego simplemente usar

sudo killall java

Este comando mata a todos los procesadores Java. Puedes usar esto con el proceso. solo da el nombre del proceso al final del comando

sudo killall {processName}

2

cuando creas un trabajo en nohup, ¡te indicará la ID del proceso!

nohup sh test.sh &

la salida le mostrará la ID del proceso como

25013

puedes matarlo entonces:

kill 25013

1

Inicié el servidor django con el siguiente comando.

nohup manage.py runserver <localhost:port>

Esto funciona en CentOS:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

Este es el lugar para resolver la process not foundconfusión con nohup.
CodeSpent

0

Hoy me encontré con el mismo problema. Y como fue hace mucho tiempo, olvidé por completo qué comando usé y cuándo. Probé tres métodos:

  1. Usando el tiempo que se muestra en el ps -efcomando. Esto muestra el momento en que comienza su proceso, y es muy probable que no comience a ordenar justo antes de cerrar ssh (depende de usted). Desafortunadamente, no creo que el último comando sea el comando que ejecuto usando nohup, por lo que esto no funciona para mí.
  2. El segundo es el PPID, que también se muestra en el ps -efcomando. Significa ID de proceso principal, la ID del proceso que crea el proceso. El ppid es 1 en ubuntu para el proceso que usa nohup para ejecutarse. Entonces puedes usarps --ppid "1" para obtener la lista y verificar HORA (el tiempo total de CPU que usa su proceso) o CMD para encontrar el PID del proceso.
  3. Úselo lsof -i:portsi el proceso ocupa algunos puertos, y obtendrá el comando. Luego, al igual que la respuesta anterior, use ps -ef | grep commandy obtendrá el PID.

Una vez que encuentre el PID del proceso, puede usarlo kill pidpara finalizar el proceso.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.