¿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!

Jason
fuente
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 &|
geekosaur
fuente
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 &)
Nathan Fellman
fuente
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.

NawaMan
fuente
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.

EMPraptor
fuente
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.

tonybaldwin
fuente
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
Borealid
fuente
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.

Ryan Thompson
fuente
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
command &

Ponga un signo y después del comando.

Jesse Dhillon
fuente
3

Si está utilizando bash, puede rechazar el proceso:

% firefox &
% disown 
JeffG
fuente
2

Puedes usar esta sola línea:

$ emacs & disown
Idham Perdameian
fuente
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.

MatthewD
fuente
0

simplemente usando &como en $ x &deja el proceso conectado a la terminal, cogí un pequeño programa llamado detach http://inglorion.net/software/detach/ que he alias ya dque es un poco como nohuppero no deja atrás un archivo de registro i Úselo para separar mupdf :d mupdf x.pdf

Dan D.
fuente
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.

midenok
fuente