¿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.
fuente
Respuestas:
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:
También estoy bastante interesado en lo
disown
que se puede utilizar para separar un proceso del árbol actual. Lo usa junto con el ampersand de fondo:También aprendí sobre el desove de subcapas con paréntesis. Este método simple funciona:
Y, por supuesto,
nohup
como mencionaste. No estoy loconohup
porque tiene una tendencia a escribir~/nohup.out
sin que yo se lo pida. Si confías en eso, podría ser para ti.Y para los procesos a más largo plazo, hay cosas como
screen
y 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
screen
tutoriales, pero aquí hay un simple inicio rápido:fuente
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.--replace
hace 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.nohup.out
puede ser suprimida con la redirección de stdout y sterr para/dev/null
que sea así:nohup firefox &> /dev/null &
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
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
exit
o 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:
fuente
matlab & exit
ejecutar como dos comandos separados funcionó bien:matlab &
exit
Como señalaste, puedes correr
para ignorar la señal final al cerrar el terminal. Ningún problema con eso.
fuente
echo command | at now
que no pude hacer que funcione.exec
proporciona una alternativanohup <command> &
para ejecutar un proceso en segundo plano y devolver el indicador de shell actual.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
para enviar el proceso en ejecución a un segundo plano. Problema
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.
fuente
Use
(exec PROGRAM &> /dev/null & )
para permitir que PID de subshell sea asumido porPROGRAM
. He probado este enfoque varias veces con varios programas diferentes. Cerrar el terminal original no tiene ningún efecto en el programa recién generadoPequeña demostración:
fuente
(exec firefox)
cuelga el terminal hasta que salgo de Firefox ... y cerrando el terminal SIGHUPs el shell y el subshellPuedo recomendar el terminal byobu. Puede separar fácilmente su proceso presionando la tecla F6.
fuente
Aunque hay buenas respuestas arriba, me gustaría dar mis 2 centavos sobre cómo uso MATLAB en segundo plano.
La
-b
etiqueta 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
fuente
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.
fuente
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 elkstart.cpp
código fuente como referencia . Como puede ver a partir de ahí, usaKProcess::startDetached
, yKProcess
se deriva deQProcess
, estartDetached
inicia un nuevo proceso, y se separa de él).Similar es también
kde-open
orxdg-open
ognome-open
.fuente