¿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.
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:
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 .
@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í :)
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í.
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. ;)
¡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
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:
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í.
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.
Ú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.
nohup
y usarlo más tarde para elkill
, o encontrar el proceso por su nombre de comando en laps -ef
salida y obtener el PID de eso. Tienes que buscar el nombre del comando, nonohup
.Respuestas:
Al usar
nohup
y 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 dekill PID
okill -9 PID
(si necesita forzar la muerte). Alternativamente, puede encontrar el PID más adelanteps -ef | grep "command name"
y ubicar el PID desde allí. Tenga en cuenta que lanohup
palabra clave / comando en sí no aparece en laps
salida del comando en cuestión.Si usaste un script, podrías hacer algo como:
Esto se ejecutará
my_command
guardando toda la salida enmy.log
(en un script,$!
representa el PID del último proceso ejecutado). El2
es el descriptor de archivo para el error estándar (stderr
) y2>&1
le dice al shell que enrute la salida de error estándar a la salida estándar (descriptor de archivo1
). Se requiere&1
para que el shell sepa que es un descriptor de archivo en ese contexto en lugar de solo un archivo llamado1
. Se2>&1
necesita para capturar cualquier mensaje de error que normalmente se escribe en un error estándar en nuestromy.log
archivo (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 usarlotail -f my.log
. Finalmente, si necesita matar el proceso, puede hacerlo a través de:fuente
nohup
per se, que imprime el PID, es el final&
que lols &
ls
2
es el descriptor de archivo de "error estándar".>
es la redirección de shell y&1
es el descriptor de archivo de "salida estándar" (&
aquí se necesita para que el shell no piense que me estoy refiriendo a un archivo llamado1
). Entonces2 > &1
redirige cualquier salida de error estándar a la entrada estándar. Dado que los> my.log
medios anteriores para redirigir la salida estándarmy.log
, necesitamos una manera de asegurarnos de que los mensajes de error también se envíenmy.log
.2 > &1
asegura que tales errores pasen a la salida estándar, que a su vez va amy.log
. Ver E / S redirección .echo $!
me da el pid de nohup en lugar del proceso generado: paste.fedoraproject.org/428697/99695314&
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.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:
Luego, en la primera columna, encontrará su nombre de usuario; Lo encontré las siguientes tres veces:
Luego, en la segunda columna, puede encontrar el PID del proceso de nohup y solo escribe:
(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í :)
fuente
Supongamos que estoy ejecutando Ruby Script en segundo plano con el siguiente comando
entonces puedo obtener el pid del proceso de fondo anterior especificando el nombre del comando. En mi caso el comando es rubí.
salida
Ahora puedes matar fácilmente el proceso usando el comando kill
fuente
ps -ef
ykill
ambos estaban bien cubiertos arriba, entonces, ¿cuál es la parte nueva?jobs -l debería darte el pid para la lista de procesos nohup. mátalos (-9) suavemente. ;)
fuente
kill -9
menos que sepa que las señales regulares no funcionan.Tu podrías intentar
fuente
pkill [command name]
que puedes usar la-o
bandera para eliminar el proceso de coincidencia más antiguo o-n
utilizar el más nuevo en su lugar.Esto funciona en
Ubuntu
Escriba esto para descubrir el
PID
Se mostrará todo el proceso de ejecución con respecto a Java
En mi caso es
Ahora mátalo
kill -9 3315
El proceso zombie finalmente se detuvo.
fuente
Supongamos que está ejecutando un programa java con nohup, puede obtener la identificación del proceso java al
salida
entonces puedes matar el proceso escribiendo
o digamos que necesita matar todos los procesos de Java y luego simplemente usar
Este comando mata a todos los procesadores Java. Puedes usar esto con el proceso. solo da el nombre del proceso al final del comando
fuente
cuando creas un trabajo en nohup, ¡te indicará la ID del proceso!
la salida le mostrará la ID del proceso como
puedes matarlo entonces:
fuente
Inicié el servidor django con el siguiente comando.
Esto funciona en CentOS:
fuente
process not found
confusión con nohup.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:
ps -ef
comando. 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í.ps -ef
comando. 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.lsof -i:port
si el proceso ocupa algunos puertos, y obtendrá el comando. Luego, al igual que la respuesta anterior, useps -ef | grep command
y obtendrá el PID.Una vez que encuentre el PID del proceso, puede usarlo
kill pid
para finalizar el proceso.fuente