¿Cómo iniciar los programas Linux GUI desde la línea de comandos, pero separados de la línea de comandos?


89

He buscado esto antes, pero nunca he podido encontrar una respuesta.

En Windows, si tengo una ventana de consola abierta, escriba winminey presione Intro, aparecerá Buscaminas, completamente separado del programa cmd. La instancia de Buscaminas no está vinculada al símbolo del sistema de ninguna manera que yo sepa, con la excepción de que el padre del Buscaminas se configuró en esa instancia del símbolo del sistema. Sin embargo, es diferente en Linux.

En Linux, si tengo una ventana de consola abierta, escriba emacsy presione Intro, se abrirá Emacs, pero parece estar vinculado a la línea de comando. Específicamente, parece que ya no puedo usar la línea de comando hasta que se cierre esa instancia de Emacs. ¿Hay alguna manera de replicar el comportamiento de Windows en Linux?

¡Gracias!



por favor dale la respuesta a geekosaur.
Joshua Robison

en windows7 es minesweeper.exe aquí C: \ Archivos de programa \ Microsoft Games \ Minesweeper, por lo que minesweeper.exe generalmente no funcionará ... ya que ese directorio no está en la ruta ... Y de todos modos, debe indicar la versión de Windows
barlop

Respuestas:


10

En bash, detaches un incorporado, utilizado de la siguiente manera:

emacs &
detach %+ # or % + the number in brackets printed after the above

En zsh, puedes poner en segundo plano y separar en una sola operación:

emacs &|

108

Anexar &a la línea de comando:

emacs &

Esto pondrá a emacs en segundo plano y le permitirá continuar usando su terminal.

Tenga en cuenta que esto todavía dejará emacs como un subproceso de su terminal, y cuando salga del terminal también saldrá de emacs. Para evitar esto, escriba:

(emacs &)

Los paréntesis le dicen al terminal que desconecte el proceso de emacs del terminal.

Aún así, los mensajes stdout y stderr del programa aparecerán en el terminal. Para evitar esto, use:

(emacs &> /dev/null &)

99
Me gusta especialmente el consejo (emacs &).

1
si ya ha comenzado la tarea (emancs), use CTRL-Z para poner a dormir y luego use el comando "bg" para enviar al fondo.
Jayan

@StackTrace: si haces eso y cierras tu terminal, también matará a emacs.
Nathan Fellman

1
OK ... solía usar "nohup" para separar esto. No se puede hacer una vez que se inicia el proceso ...
Jayan

Al presionar Ctrl+ Cen la ventana de terminal se emitió este comando, el proceso finaliza: <
Richard de Wit

21

Utilizar nohup. Me gusta esto:nohup amarok &

Espero que esto ayude.


19

Publiqué una respuesta a un hilo anterior de tema similar con respuestas de varias fuentes. A continuación hay una copia de esa respuesta adaptada para este hilo.


Siguientes trabajos:

$ (gui_app &> /dev/null &)

Esta es la respuesta de Nathan Fellman más la redirección.

"&> / dev / null" redirige tanto stdout como stderr al dispositivo nulo. El último comercial hace que el proceso se ejecute en segundo plano. Los paréntesis alrededor del comando harán que su "gui_app" se ejecute en una subshell.

Hacer esto desconectará el proceso "gui_app" de la consola desde la que ejecuta este comando. Entonces, incluso si cierra la ventana en la que se está ejecutando el emulador de terminal principal, "gui_app" no se cerrará. Ejecuté esto, luego miré el árbol de procesos con el comando "pstree" y encontré que una aplicación iniciada de esta manera se convertirá en un proceso hijo para "init".

Por ejemplo,

$ gui_app &> /dev/null &

ejecutará la aplicación en segundo plano, pero se convertirá en un proceso secundario del proceso de la consola y finalizará cuando cierre el terminal. (Aunque salir del terminal a través de bash usando el comando de salida o Ctrl-D permitirá que bash se limpie entregando el proceso en segundo plano a init).

"nohup" funciona como NawaMan ha sugerido, pero eso redirige la salida y el error a un archivo de forma predeterminada. Como JeffG ha respondido, el comando "desautorizar" (si está disponible en el shell) puede separar el proceso del terminal después de que haya iniciado un proceso en segundo plano:

$ gui_app &
$ disown

(Por cierto, todo esto se aplica a bash. Estoy seguro de que otros shells tienen otros métodos / sintaxis para hacerlo).

Alguna referencia: Procesos de rechazo (UNIX Power Tools)

Si se trata de una simple llamada a una aplicación GUI, sin opciones complicadas y tal, parece que usar un lanzador como "gmrun" o dmenu (advertencia: audio fuerte) también es una buena opción. Asociarlo a una combinación de teclas. Todavía no uso un lanzador pero he probado esos dos.

NOTA: CarlF en los comentarios de los otros hilos informa que las aplicaciones GUI iniciadas mediante el método "gui_app &" no se cierran cuando sale del terminal principal. Creo que estábamos cerrando la terminal de diferentes maneras. Estaba cerrando la ventana en la que se ejecutaba el emulador de terminal. Creo que puede haber estado saliendo del emulador de terminal a través del shell (comando de salida o Ctrl-D). Probé esto y vi que salir de bash no detiene la GUI iniciada como proceso de fondo del terminal, como dice CarlF. Parece que bash deja de lado los procesos en segundo plano para iniciar cuando se le da la oportunidad de limpiar. De hecho, este debe ser el mecanismo por el cual el proceso en segundo plano iniciado en una subshell se transfiere a init.


11

util-linux incluye una herramienta llamada setsid que básicamente hace lo que hace detach:

$ setsid someprogram

Esto se ejecutará someprogramen una nueva sesión.


9

Intenta escribir xemacs &para abrir XEmacs en segundo plano.

No se refiera a esto como "emular el comportamiento de Windows". Ay.

También podrías:

  • Abrir una nueva terminal
  • Use Alt + F2 o su administrador de ventanas para iniciar el programa, en lugar de usar el terminal
  • Usar pantalla GNU

7

Puse el siguiente código en un archivo de script ejecutable llamado "sbg" para "fondo silencioso". Hace todas las cosas necesarias para desconectar completamente el programa que se inicia desde el shell: redirige stdin, stdout y stderr de / a /dev/null, ignora los bloqueos, se ejecuta en segundo plano y se desconecta.

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

Entonces puedes simplemente hacer sbg emacs. También se puede pasar ningún argumento que desea: sbg emacs --daemon FILE1 FILE2.


La solución de secuencias de comandos funcionó mejor para mí. ¡¡Gracias!! aunque usé en su (gui_app &> /dev/null &)lugar (respuesta de @ EMPraptor)
Jimi Oke


3

Si está utilizando bash, puede rechazar el proceso:

% firefox &
% disown 


1

Como dicen las otras respuestas, puede usar lo siguiente:

$ emacs &

Sin &embargo, si se olvida , simplemente presione y Ctrl-zluego use bg:

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

FYI: Ctrl-zdetiene el proceso de emacs y lo bgenvía a un segundo plano.



0

Pon esto a tu ~/.bashrc:

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

Ahora no tiene que recordar qué programas son X11 y hacer manipulaciones especiales para ellos porque se separarán automáticamente. Tenga en cuenta que setsides mejor que nohupporque el último bloquea la señal HUP, que no es lo que necesita.

PD: Ahora estás winminelisto en Linux.

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.