Ejecutar programas en segundo plano desde la terminal

136

¿Cómo ejecuto un programa en el fondo de un shell, con la capacidad de cerrar el shell mientras dejo el programa ejecutándose? Digamos que mi IU está teniendo problemas o, por alguna razón, necesito iniciar un programa desde la ventana del terminal, por ejemplo nm-applet:

nm-applet

Cuando se inicia, ocupa el primer plano de la ventana de terminal.

¿Hay alguna manera simple de ejecutar el programa en segundo plano sin necesidad de dejar el terminal abierto o que ocupe todo el terminal?

En esa nota, encontré una forma de ejecutar programas desde el terminal y hacer que permita otras entradas, agregando un ampersand ( &) al comando como tal:

nm-applet &

Pero esto no es de mucha utilidad ya que cualquier proceso iniciado en el terminal se anula una vez que se cierra el terminal.                                                                        

ARMÓNICO
fuente
77
nohup 'comando' y esto parece funcionar. ¿Algún problema con esto?
OVERTONE

Respuestas:

173

Recientemente me ha gustado setsid. Comienza como si estuvieras ejecutando algo desde la terminal, pero puedes desconectarte (cerrar la terminal) y simplemente continúa.

Esto se debe a que el comando realmente se bifurca y mientras la entrada llega al terminal actual, es propiedad de un padre completamente diferente (que permanece vivo después de cerrar el terminal).

Un ejemplo:

setsid gnome-calculator

También estoy bastante interesado en lo disownque se puede utilizar para separar un proceso del árbol actual. Lo usa junto con el ampersand de fondo:

gnome-calculator & disown

También aprendí sobre el desove de subcapas con paréntesis. Este método simple funciona:

(gnome-calculator &)

Y, por supuesto, nohupcomo mencionaste. No estoy loco nohupporque tiene una tendencia a escribir ~/nohup.outsin que yo se lo pida. Si confías en eso, podría ser para ti.

nohup gnome-calculator

Y para los procesos a más largo plazo, hay cosas como screeny otros terminales-muxers virtuales que mantienen las sesiones vivas entre las conexiones. Probablemente, esto realmente no se aplique a usted porque solo desea acceso temporal a la salida del terminal, pero si desea regresar algún tiempo después y ver la última actividad del terminal, la pantalla probablemente sea su mejor opción.

Internet está lleno de screentutoriales, pero aquí hay un simple inicio rápido:

Oli
fuente
Oli, en el caso de DISPLAY =: 0 unity --sustituya cuál de las anteriores usaría y por qué?
chiflado sobre natty
44
@nuttyaboutnatty envolver todo el lote en su propia sesión de shell: sh -c "sleep 10s && cvlc '/home/omm.ogg'" & disown. Esa es prácticamente mi solución para todo para asegurarme de que se bifurca correctamente.
Oli
1
@nuttyaboutnatty Eso es lo que quiero decir, pero no terminarías con dos instancias en ejecución porque --replacehace lo que parece y realmente termina la instancia anterior. Ejecutarlo por segunda vez desde xsession finalizaría la copia vinculada a TTYn y le permitiría usarla en el futuro si la necesitara. Probablemente haya una mejor manera de hacerlo, pero justo lo que viene a mi mente cada vez que lo necesito.
Oli
1
Perfecto, el que funcionó para mí fue la subshell '(gnome-calculator &)'. Lo uso para iniciar una aplicación de consola mono en segundo plano. Con las otras técnicas, la aplicación mono se bloqueará al instante.
Nikolaos Georgiou
2
Nota para futuros usuarios : la creación de nohup.outpuede ser suprimida con la redirección de stdout y sterr para /dev/nullque sea así:nohup firefox &> /dev/null &
Sergiy Kolodyazhnyy
55

Aquí están las dos formas con las que iría. En primer lugar, no ejecutarlo desde una terminal; presione Alt+ F2para abrir el cuadro de diálogo de ejecución y ejecútelo desde allí (sin &).

Desde una terminal, ejecuta

nm-applet &

Pero NO cierre la terminal usted mismo. Es decir, no presione el botón X para cerrar, y no use Archivo -> Salir de su barra de menú. Si cierra el terminal de esa manera, enviará una señal HUP (Hang UP) al bash que se ejecuta dentro, lo que a su vez enviará la señal HUP a todos sus hijos (por lo que nohup funciona en este caso).

En su lugar, salga del shell ejecutando exito presionando Ctrl+ D. bash luego rechazará a sus hijos, luego saldrá, dejando los procesos en segundo plano aún en ejecución. Y cuando bash sale, la terminal ha perdido su proceso hijo, por lo que también se cerrará.

Haciéndolo todo a la vez:

nm-applet & exit
geirha
fuente
¡Eso es increíble! Nunca lo supe y parece ser la única persona que menciona esto. Definitivamente ese es mi enfoque favorito cuando estoy en un entorno de escritorio. Lástima que no pueda votar más; p
7hi4g0
Intenté esto con una aplicación diferente y falló: matlab & exitejecutar como dos comandos separados funcionó bien:matlab & exit
MattKelly
Me preguntaba por qué OP dijo que cerrar la terminal hacía que sus programas en segundo plano se bloqueen. Nunca he intentado cerrar una terminal con el botón "x" en la ventana.
user1717828
el botón x es matar, no sale limpiamente, el comando de salida sí. podría reasignar el botón x a un comando de salida en su lugar ...
Tim Baker
14

Como señalaste, puedes correr

nohup nm-applet &  

para ignorar la señal final al cerrar el terminal. Ningún problema con eso.

desgua
fuente
¿Alguna otra alternativa? Solo por el bien de los conocimientos, no por otra cosa
SOBRETALLE
En wikipedia ( en.wikipedia.org/wiki/Nohup ) hay una sugerencia de uso echo command | at nowque no pude hacer que funcione.
desgua
2
Me pregunto cómo funciona desde la interfaz de usuario cuando haces doble clic en un ícono o programa.
GANANCIA
execproporciona una alternativa nohup <command> &para ejecutar un proceso en segundo plano y devolver el indicador de shell actual.
JSStuball
12

Una cosa que faltan muchas otras respuestas es cómo separar un proceso en ejecución que actualmente bloquea el shell. En la mayoría de las terminales y shells, Ctrl+ Zdetendrá el proceso de ejecución y lo llevará de vuelta a un indicador de entrada. Entonces, puedes emitir

bg

para enviar el proceso en ejecución a un segundo plano. Problema

fg

en lugar de volver a poner el proceso en ejecución en primer plano.

EDITAR : Más detalles en esta respuesta que descubrí más tarde.

krlmlr
fuente
7

Use (exec PROGRAM &> /dev/null & )para permitir que PID de subshell sea asumido por PROGRAM. He probado este enfoque varias veces con varios programas diferentes. Cerrar el terminal original no tiene ningún efecto en el programa recién generado

Pequeña demostración:

$ # this is before running
$ (exec firefox &> /dev/null &)
$ # and look, we still in side the terminal and can continue working
Sergiy Kolodyazhnyy
fuente
Hmmm (exec firefox)cuelga el terminal hasta que salgo de Firefox ... y cerrando el terminal SIGHUPs el shell y el subshell
kos
He editado mi respuesta. Probado con varios otros programas. No he observado Firefox u otro programa que cuelgue el terminal de control en esta versión
Sergiy Kolodyazhnyy
funciona bien para mí
Zanna
No creo que sea necesario usar el exec de bash, podría ser que necesites el PID por alguna razón.
marinara
2

Puedo recomendar el terminal byobu. Puede separar fácilmente su proceso presionando la tecla F6.

Speter
fuente
1

Aunque hay buenas respuestas arriba, me gustaría dar mis 2 centavos sobre cómo uso MATLAB en segundo plano.

sudo -b matlab

La -betiqueta de sudo puede ejecutar aplicaciones en segundo plano. También puede cerrar la terminal después de ejecutar este comando.

Probablemente, no esté relacionado, pero hay un sitio web maravilloso que puede usar para explicar los comandos de shell. http://explainshell.com/explain/8/sudo

usuario3342981
fuente
0

No sé si es la forma correcta, pero acabo de comenzar otra sesión mientras dejo la anterior sola. Por ejemplo, ejecuté un servidor web simple en mi frambuesa. el web.py uno. entonces comienzo una nueva sesión mientras la dejo sola. Eso es. También es muy útil, ya que todavía está actualizado a pesar de que está trabajando en la otra sesión.

León
fuente
2
Bienvenido a Ask Ubuntu! Recomiendo editar esta respuesta para expandirla con detalles específicos sobre cómo hacerlo. (Consulte también ¿Cómo escribo una buena respuesta? Para obtener consejos generales sobre qué tipos de respuestas se consideran más valiosas en Ask Ubuntu.)
David Foerster
0

En caso de que se use KDE, también puede usarlo kstart, lo que iniciará su programa desconectado del terminal. También se asegura de que el entorno KDE esté configurado correctamente para el comando. (Consulte el kstart.cppcódigo fuente como referencia . Como puede ver a partir de ahí, usa KProcess::startDetached, y KProcessse deriva de QProcess, e startDetachedinicia un nuevo proceso, y se separa de él).

Similar es también kde-openor xdg-openo gnome-open.

Albert
fuente
Tal como está, parece casi más un comentario que una respuesta. Por favor, edite su expansión. No solo le des una sola frase; explica por qué tienes razón, idealmente con citas. Las respuestas sin explicación están sujetas a eliminación.
anónimo2