¿Cómo terminar un proceso en segundo plano?


196

He comenzado un wget en una máquina remota en segundo plano usando &. De repente deja de descargarse. Quiero terminar su proceso, luego volver a ejecutar el comando. ¿Cómo puedo terminarlo?

No he cerrado su ventana de shell. Pero como sabes, no deja de usar Ctrl+ Cy Ctrl+ Z.

Respuestas:


256

Hay muchas formas de hacerlo.

Método # 1 - ps

Puede usar el pscomando para encontrar la ID del proceso para este proceso y luego usar el PID para matar el proceso.

Ejemplo

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

Método # 2 - pgrep

También puede encontrar la identificación del proceso usando pgrep.

Ejemplo

$ pgrep wget
1234

$ kill 1234

Método # 3 - pkill

Si está seguro de que es lo único wgetque ha ejecutado, puede usar el comando pkillpara eliminar el trabajo por su nombre.

Ejemplo

$ pkill wget

Método # 4 - trabajos

Si está en el mismo shell desde donde ejecutó el trabajo que ahora está en segundo plano. Puede verificar si todavía se está ejecutando con el jobscomando y también eliminarlo por su número de trabajo.

Ejemplo

Mi trabajo falso, sleep.

$ sleep 100 &
[1] 4542

Encuentra su número de trabajo. NOTA: el número 4542 es la ID del proceso.

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

Método # 5 - fg

Puede devolver un trabajo en segundo plano al primer plano con el fgcomando

Ejemplo

Trabajo falso, sleep.

$ sleep 100 &
[1] 4650

Obtenga el número del trabajo.

$ jobs
[1]+  Running                 sleep 100 &

Traiga el trabajo # 1 de nuevo al primer plano y luego use Ctrl+ C.

$ fg 1
sleep 100
^C
$

El jobsno tiene outputy fg EFS: -bash: fg: 1: no such job. Pero escribir fgfunciona bien y también pkill wgetfunciona bien. pero ps -eaf|grep wgety luego la kill <process number>dosis no detiene el trabajo. ps: uso el tercer número como número de proceso .
Mohammad Etemaddar

1
@MohammadEtemaddar: use el segundo número de la salida de ps. El 3er # es la identificación del proceso del padre.
slm

1
@MohammadEtemaddar - ah, el ps está encontrando el grep. Hacerlo de esta manera: ps -eaef| grep [w]get.
slm

1
@MohammadEtemaddar - también se puede utilizar pgrepen su lugar, pgrep wget.
slm

2
@MohammadEtemaddar - lo siento, el extra e es un error tipográfico. Debe leer ps -eaf | grep [w]get. Las opciones están en la pspágina del manual. man ps.
slm

70

En bash puedes usar fgpara poner el trabajo en primer plano y luego usar Ctrl+C

O enumere el proceso en segundo plano con jobsy luego haga

kill %1

(con 1 reemplazado por el número que jobsle dio)


13

Igualmente puede usar kill $!para matar el trabajo en segundo plano más reciente.


Si se usa como un comando como un alias en un perfil bash, asegúrese de incluir comillas simples.
Nate Ritter

6

EDITAR: Una vez en primer plano, puede Ctrl+ C, o como @Zelda menciona, matar con el '% x' donde 'x' es el número de trabajo enviará la señal predeterminada (probablemente SIGTERM en el caso de Linux).

simplemente escriba fgpara ponerlo en primer plano, si fue el último proceso que realizó en segundo plano (con '&').

Si no fue el último, escriba: jobsy busque el 'número de trabajo', representado en '[]'. Luego simplemente escriba:

fg 2

..donde '2' es el número de trabajo, por ejemplo:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.

4

La forma correcta es escribir y jobsluego usar el número de trabajo para matarlo. Para usar el pid para matarlo, debes ponerlo en primer plano como se señala en la primera respuesta.

Prueba esto

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

Si ejecuta trabajos justo después de matarlo, debería ver esto

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

Una cosa que no veo aquí, que he encontrado muy útil especialmente al probar comandos, es pidof. Puede usar pidof [command]para encontrar la identificación de proceso de un proceso que se está ejecutando actualmente. Me gusta porque me permite encontrar rápidamente la identificación del comando que quiero, que generalmente es algo que acabo de invocar.

Una vez que tenga el pid, simplemente puede matar el proceso. Permite crear scripts simples para matar un proceso solo si se está ejecutando actualmente.


1
Ah, esto me ayudó! kill% 1 no estaba funcionando por alguna razón, "kill: no se pudo analizar el argumento: '% 1'" y Ctrl + C no estaba funcionando; no pudo encontrar proceso en el PS o nada porque era la raíz (se me olvidó he usado sudo con él)
mjohnsonengr

1

Un ejemplo común es la stressherramienta. Digamos que ejecutó lo siguiente:

$ stress -c 4 -m 4 

y cerró la ventana de la terminal. El proceso continuaría consumiendo sus recursos desde el fondo.

Lo suyo es lo que hago:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrepenumera los PID del proceso sometido y lo almacena en una variable xque luego utiliza kill -9para terminarlo.


0

en bash último proceso detenido (Ctrl-Z) matarás por:

kill %%
kill -9 %%

o si quieres elegir, usa:

jobs

entonces:

kill %N

me gusta kill %2

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.