¿Cómo iniciar limpiamente una aplicación GUI a través de la Terminal?

78

Algunas aplicaciones GUI se inician limpiamente a través de la línea de comando de la Terminal, pero otras no, y hacen que la Terminal espere a que la aplicación finalice. Incluso entonces, algunos no "liberan" la línea de comando.

El misterioso &sufijo de ampersand parece hacer que el terminal ponga el proceso en segundo plano (pero no estoy seguro de qué sucede allí).

¿Hay alguna forma de iniciar una aplicación a través de la Terminal para que no haya un efecto de "espera", como lanzar algo a través de Alt+ F2?

Me gustaría tener la línea de comando disponible nuevamente de inmediato, sin que haya nada en segundo plano e impresión en la terminal.

Peter.O
fuente
A pedido de htorque, borré su respuesta que usted aceptó. Por favor, ¿podría elegir otra respuesta (tendrá que deseleccionar la primera htorque, debería estar al acecho en la parte inferior de la página en rojo)
Oli
1
El método para lidiar con un programa que ya se está ejecutando (como se describe en con-f-use) es bueno para esa situación, pero como mi pregunta principal era sobre el lanzamiento limpio sin desorden de terminal , he aceptado screen(mencionado por Oli y RobinJ). Estoy impresionado por su capacidad; después de leerlo y probarlo ... Solo requiere escribir: screen -d -m gedit(o screen geditluego Ctrl+a dpara separarlo) ... y todavía tengo acceso completo a la vista de terminal de gedit (para mensajes de advertencia, etc.) en cualquier momento, screen -rincluso si yo mientras tanto, he cerrado la ventana de terminal original ...
Peter
Por cierto, algunas de las cosas que está atribuyendo a la terminal en realidad las realiza el shell, por ejemplo, interpretando el &sufijo del comando. Esto podría ser útil para aclarar: ¿Cuál es la diferencia entre Terminal, Consola, Shell y Línea de comando?
wjandrea

Respuestas:

17

En el caso de gedit, solo mantengo una copia abierta todo el tiempo. Siempre que tenga una copia en ejecución, el inicio de geditllamadas desde el terminal y luego el cierre del terminal no matarán a gedit.

Para otras cosas, lo que otras personas han dicho también funcionaría. Soy fanático de nohup... Pero si necesita un terminal que pueda desconectar pero luego volver a conectar, desea mirar screen.

  1. Ejecútelo en una terminal y luego ejecute algo que siga empujando la salida. Yo uso el servidor de desarrollo Django pero irssio incluso watch uptimesería un buen ejemplo.
  2. Mata la terminal y comienza una nueva.
  3. Corre screen -ry BOOM, estás de vuelta.

screenes mucho más grande que eso y puedes combinarlo byobupara una mejor experiencia de terminal. Leer alrededor

Oli
fuente
Esta es la primera visión real que he tenido en cuanto a qué pantalla no / se puede hacer ... gracias por la punta terminal de ...
Peter.O
La pantalla ya no está disponible, pero tmux puede reemplazarla. (tmux para iniciar una nueva sesión de tmux, ctrl + b, luego presione d para desactivar y tmux adjuntar para volver a conectar)
Gman Smith
84

Supongamos geditque el programa que desea ejecutar es independiente (también conocido como "desautorizado", "desenredado", "desacoplado"). Hay diferentes formas dependiendo de lo que quieras hacer exactamente:

Programa ya en ejecución

Desconocer:

disown -hes el camino a seguir si desea hacerlo con un programa que ya se está ejecutando (es decir, si lo olvidó nohup). Primero debes detenerlo usando Ctrl+ Z. Luego puede poner en segundo plano usando bg [jobId](por ejemplo bg 1). Obtiene una lista de trabajos en ejecución con su jobId usando jobs. Después de eso, puede desacoplarlo de la terminal usando disown -h %[jobId]. Ejemplo de sesión terminal:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

Programa aún no iniciado

nohup

nohupNo siempre está presente en todas las máquinas. Si sabe que desea desacoplar de antemano, usaría:

nohup gedit &

Tal vez tendrá que redirigir la salida de la shell, así y su programa de una fuente de entrada de pseudo, por lo que: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Desea redirigir la salida para que no le moleste o para usarla más tarde. La entrada nula puede ayudar a prevenir hickups en ssh an such.

Subshell:

Puedes lograr un efecto similar al

$ (geany >/dev/null 2>&1 &)

Los corchetes abren una nueva subshell para ejecutar gedit. >/dev/null 2>&1Redirige la salida de la shell a ninguna parte (suprimiendo la salida). Y &al final pone el proceso en segundo plano.

Multiplexación de terminales

También multiplexación de terminales mediante pantalla o byobu . Básicamente ejecuta el programa en una terminal propia. Realmente puedo recomendar byobu por otras razones también. A continuación hay una lista de atajos de boybu que pueden ser útiles para sus primeros pasos:

Útil:

  • F2 Crea una nueva ventana
  • F3 Ir a la siguiente ventana
  • F4 Ir a la ventana anterior
  • F6 Separarse de la sesión y cerrar sesión
  • Shift-F6 Separarse de la sesión, pero no cerrar sesión
  • F7 Ingrese al modo de retroceso / búsqueda
  • Ctrl-F5 Vuelva a conectar cualquier conector o agente SSH / GPG

Menos útil:

  • Shift-F2 Divide la pantalla horizontalmente
  • Ctrl-F2 Divide la pantalla verticalmente
  • Shift-F3 Mover el foco a la siguiente división
  • Shift-F4 Mover el foco a la división anterior
  • Shift-F5 Contraer todas las divisiones
  • F5 Actualizar todas las notificaciones de estado
  • F8 Cambiar el nombre de la ventana actual
  • F9 Inicie el menú de configuración de Byobu
  • F12 Clave de escape de la pantalla GNU
  • Alt-Pageup Desplácese hacia atrás a través del historial de esta ventana
  • Alt-Pagedown Desplácese hacia adelante a través del historial de esta ventana
  • Ctrl-a-! Activa o desactiva todas las combinaciones de teclas de Byobu

El 'at' daemon y otros

ates una pequeña herramienta útil para ejecutar un comando a una hora programada. Se puede 'mal usar' para separar un comando del shell:

echo './myprogram myoption1 myoption2' | at now

También puede examinar setsidy start-stop-daemon, pero los otros métodos deberían ser suficientes.

confundir
fuente
Consejo: si solo hay un trabajo, la ID del trabajo es opcional, por ejemplo, en lugar de bg %1que solo pueda escribir bg.
MasterMastic
25

El misterioso ampersand "&" sufijo, parece causar que el terminal ponga el proceso en segundo plano ... (pero no estoy seguro de qué sucede allí).

Lo hace, y es a menudo lo que quieres. Si olvida usar &, puede suspender el programa con ctrl-z y luego colocarlo en segundo plano con el comando bg, y continuar usando ese shell.

El proceso 'stdin, stdout y stderr todavía están conectados al terminal; puede redirigirlos desde / a / dev / null o cualquier otro archivo (por ejemplo, guardar un registro de salida en algún lugar), según lo desee:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

Puede ver el proceso en los trabajos, devolverlo al primer plano (comando fg) y enviarle señales (comando kill).

Algunos programas gráficos se separarán de la terminal; Si ese es el caso, cuando ejecute el comando "normalmente", notará que inicia el programa gráfico y "sale".


Aquí hay un script corto , puedes colocarlo en ~ / bin , al que llamé runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

Busco el programa ($ prog) antes de redirigir para que se puedan informar los errores de localización. Ejecútelo como "runbg your-command args ..."; aún puede redirigir stdout / err a un archivo si necesita guardar la salida en algún lugar.

Excepto por las redirecciones y el manejo de errores, esto es equivalente a la respuesta de htorque .

Comunidad
fuente
De acuerdo, gracias ... Parece que ctrl-z(suspender) me da acceso a la línea de comando nuevamente, pero borra la GUI hasta que emito, lo bgque parece suspenderla. (tiene sentido) ... ¿Hay otro comando por el cual pueda separar la GUI ... ¡Ajá! Ahora veo lo que quieres decir con sighals (kill command)... (cosas interesantes estas señales) ... Utilicé un fragmento de código para ddgenerar progresivamente las estadísticas ... y usé kill+ una SEÑAL ... ¿Hay una SEÑAL específica para separar un "trabajo"? "?
Peter.O
Acabo de notar su comentario a la respuesta de Rick ... Intenté disown trabajos -p gedit`` y parecía eliminar el trabajo ... (pero recibí mensajes del sistema en la Terminal cuando cerré manualmente gedit ... pero creo Tengo una Terminal jodida en este momento ... demasiado experimento :(
Peter.O
@fred: los trabajos son administrados por el shell, por lo que ninguna señal puede controlar eso. Puede encontrar que funciona mejor para iniciar varios shells: varios terminales GUI permiten pestañas y puede usar screen o tmux.
2
@fred: mejor no se ejecute jobs -p commandsi tiene varias instancias de un comando ejecutándose en segundo plano a la vez. puede usar jobspara encontrar la identificación de trabajo correcta y luego hacer jobs -p <job-id>para obtener el PID del trabajo. Personalmente, encuentro la versión con el subshell mucho más fácil. ;-)
htorque
2
@htorque, fred: puede ejecutar disown sin parámetros para que bash reprenda el último trabajo:gedit & disown
22

Para iniciar una aplicación y desconectarla del terminal lanzado, use & !.

firefox &!
Almiar
fuente
66
Es bueno saberlo, pero parece ser solo zsh. En bash, deberías ejecutarlo manualmente disown <pid-of-command>después de iniciar el comando en segundo plano.
htorque
Interesante ... Voy a investigar zsh, pero como novato en Linux, me quedaré con bash por ahora ... Gracias
Peter.O
¿Qué hace el signo de exclamación?
chiflado sobre natty
1
Los ! interrumpirá el proceso de la aplicación del proceso del terminal para que pueda cerrar el terminal sin la aplicación que se inició desde el cierre. Parece ser una cosa zsh, pero útil.
Rick
Pero esto también funcionó en bash @htorque ... Así que supongo que no es un problema.
Jasser
20

Utilizar nohup

nohup es un programa que ejecuta un comando dado con señales de bloqueo ignoradas, de modo que el comando puede continuar ejecutándose en segundo plano después de que finaliza su proceso principal. Ver la página de manual

Por ejemplo:

nohup gedit something
Florian Diesch
fuente
2
¿Qué es nohup? Por favor elabora.
Oxwivi
3
nohup es un programa que ejecuta un comando dado con señales de bloqueo ignoradas, de modo que el comando puede continuar ejecutándose en segundo plano después de que finaliza su proceso principal. Consulte la página de manual
Florian Diesch
En realidad creo que mi respuesta es incorrecta aquí. Pensándolo mejor, nohupdebería usarse en este escenario.
boehj
2
Cuando un shell interactivo recibe una señal SIGHUP, puede enviar (o no, según la configuración) una señal SIGHUP a todos sus hijos. Esto puede suceder (o no, nuevamente) cuando un terminal está cerrado. Un niño que no esté listo para manejar dicha señal ejecutará la acción predeterminada, es decir, saldrá. La nohupaplicación (y el disownbash incorporado) no permiten que la señal llegue a la aplicación.
enzotib
2
Una cosa a tener en cuenta es que nohupcrea un archivo en el directorio actual llamado nohup.out. Vea la página del manual para más detalles. Prefiero disownpor esta razón, y por el hecho de que disownfunciona después de su lanzamiento gedit.
Flimm
4

Abra el terminal, escriba la pantalla , escriba el comando que desea ejecutar, cierre el terminal. El programa debe seguir ejecutándose en la sesión de GNU Screen .

RobinJ
fuente
¿Qué es exactamente la pantalla GNU?
Oxwivi
Si entiendo la idea correctamente, es una especie de administrador de ventanas para la línea de comandos. Le permite ejecutar más de un programa a la vez en una sesión de interfaz de línea de comandos.
RobinJ
Byobu?
Oxwivi
Algo así, solo Byobu es más fácil de usar. Si no estoy equivocado, Byobu es solo una interfaz más fácil para GNU Screen.
RobinJ
1

Esto funcionó para mí:

$ (nohup gedit 2>/dev/null &)
Wesleycoder
fuente
1

xdg-open

Eche un vistazo a esta utilidad de uso general: https://linux.die.net/man/1/xdg-open

Esto abrirá una ubicación relativa en su administrador de archivos.

 $ xdg-open .

Esto abrirá un archivo pdf en un lector de pdf.

 $ xdg-open foo.pdf

Incluso puede proporcionar URL web

$ xdg-open www.google.com
Jonathan Komar
fuente
0

Como mucha gente pensó, nohup es lo que hay que considerar. Pero nohup queda abierto en el terminal y muestra la actividad del programa en el terminal, lo cual es irritante. Puede cerrar la terminal después de eso para evitarlo. Descubrí una solución muy simple que uso.

nohup gedit & exit

Y eso es. Abre gedit y cierra el terminal cuando se inicia gedit. Como gedit no está asociado con el terminal ahora, permanece activo.

Lokesh Devnani
fuente
0

Esto funciona incluso dentro de un script (como los alias, el trailer '&' normalmente no está permitido en los scripts porque no son interactivos):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
Sam
fuente
0

Esto funcionó para mí:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
Eyal Levin
fuente