Questão Como iniciar programas GUI linux a partir da linha de comando, mas separados da linha de comando?


Eu procurei por isso antes, mas nunca consegui encontrar uma resposta.

No Windows, se eu tiver uma janela do console aberta, digite winminee pressione enter, o Campo Minado aparecerá, completamente separado do programa cmd. A instância de Campo Minado não está vinculada ao prompt de comando de qualquer maneira que eu saiba, com exceção do pai do Campo Minado sendo definido para aquela instância do prompt de comando. É diferente no Linux, no entanto.

No Linux, se eu tiver uma janela de console aberta, digite emacs e pressione enter, o Emacs será aberto, mas parece estar ligado à linha de comando. Especificamente, parece que não posso mais usar a linha de comando até que essa instância do Emacs seja fechada. Existe uma maneira de replicar o comportamento do Windows no Linux?

Obrigado!


84


origem


dup de:superuser.com/questions/178587/… - behrooz
por favor, dê a resposta ao geekosaur. - Joshua Robison
no windows7 é minesweeper.exe aqui C: \ Arquivos de Programas \ Microsoft Games \ Minesweeper so minesweeper.exe geralmente não funcionará .. como esse diretório não está no caminho .. E de qualquer forma, você deve indicar a versão do Windows - barlop


Respostas:


Dentro bash, detach é um built-in, usado da seguinte forma:

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

Dentro zsh, você pode background e desanexar em uma única operação:

emacs &|

7





Acrescentar & para a linha de comando:

emacs &

Isso colocará o emacs em segundo plano e permitirá que você continue usando seu terminal.

Observe que isso ainda deixará o emacs como um subprocesso do seu terminal e, quando você sair do terminal, ele também sairá do emacs. Para evitar isso, digite:

(emacs &)

Os parênteses dizem ao terminal para separar o processo do emacs do terminal.

Ainda assim, as mensagens stdout e stderr do programa aparecerão no terminal. Para evitar isso, use:

(emacs &> /dev/null &)

103



Isso é exatamente o que eu queria. Obrigado!
Eu gosto especialmente da dica (emacs &).
Se você já iniciou a tarefa (emancs), use CTRL-Z para colocar em suspensão e, em seguida, use o comando "bg" para enviar para o plano de fundo. - Jayan
@StackTrace: se você fizer isso e fechar seu terminal, ele também matará o emacs. - Nathan Fellman
OK .. eu costumava usar "nohup" desanexar isso. Não pode ser feito depois que o processo é iniciado ... - Jayan


Usar nohup. Como isso: nohup amarok &

Espero que isto ajude.


18





eu postei uma resposta para um segmento mais antigo de tópico semelhante com respostas de várias fontes. A seguir, uma cópia dessa resposta adaptada para este segmento.


Seguintes trabalhos:

$ (gui_app &> /dev/null &)

Esta é a resposta de Nathan Fellman, mais o redirecionamento.

"&> / dev / null" redireciona stdout e stderr para o dispositivo nulo. O último e comercial torna o processo executado em segundo plano. Os parênteses ao redor do comando farão com que seu "gui_app" seja executado em uma subcamada.

Isso desanexará o processo "gui_app" do console em que você executa esse comando. Portanto, mesmo se você fechar o emulador de terminal pai da janela, o "gui_app" não será fechado. Eu corri isso, em seguida, olhei para a árvore de processo com o comando "pstree" e encontrei um aplicativo iniciado dessa forma se tornará o processo filho para "init".

Por exemplo,

$ gui_app &> /dev/null &

executará o aplicativo em segundo plano, mas se tornará um processo filho do processo do console e terminará quando você fechar o terminal. (Embora sair do terminal através do bash usando o comando de saída ou Ctrl-D, o bash será limpo, transferindo o processo em segundo plano para o init.)

"nohup" funciona como o NawaMan sugeriu, mas redireciona a saída e o erro para um arquivo por padrão. Como o JeffG respondeu, o comando "disown" (se disponível no shell) pode desanexar o processo do terminal depois que você iniciou um processo em segundo plano:

$ gui_app &
$ disown

(BTW tudo isso se aplica ao bash. Tenho certeza que outros shells têm outros métodos / sintaxe para fazer isso.)

Alguma referência: Processos de Desprovimento (Ferramentas Elétricas do UNIX)

Se é uma simples chamada para uma aplicação GUI - sem opções complicadas e tal - parece usar um lançador como "gmrun" ou dmenu (aviso: áudio alto) também é uma boa opção. Vinculá-lo a uma combinação de teclas. Eu não uso um lançador ainda, mas tentei os dois.

NOTA: CarlF no comentários do outro segmento relatórios aplicativos GUI iniciados via "gui_app &" método não fecha quando ele sai do terminal pai. Acho que estávamos fechando o terminal de maneiras diferentes. Eu estava fechando a janela em que o emulador de terminal estava sendo executado. Acho que ele pode ter saído do emulador de terminal por meio do shell (comando de saída ou Ctrl-D). Eu testei isso e vi que sair através do bash não para a GUI iniciada como processo em segundo plano do terminal, como diz CarlF. Parece que o bash entrega os processos em segundo plano ao init quando é dada a chance de limpar. Na verdade, esse deve ser o mecanismo pelo qual o processo em segundo plano iniciado em uma subcamada é transferido para o init.


18





Tente digitar xemacs & para abrir o XEmacs em segundo plano.

Por favor, não se refira a isso como "emulando o comportamento do Windows". Ai

Você também pode:

  • Abra um novo terminal
  • Use Alt + F2 ou o seu gerenciador de janelas para iniciar o programa, em vez de usar o terminal
  • Use o GNU Screen

9





O util-linux inclui uma ferramenta chamada setsid que basicamente faz o que desanexar:

$ setsid someprogram

Isso vai rodar someprogram em uma nova sessão.


9





Eu coloquei o seguinte código em um arquivo de script executável chamado "sbg" para "fundo silencioso". Ele faz todas as coisas necessárias para desconectar completamente o programa que está sendo iniciado a partir do shell: redireciona stdin, stdout e stderr de / para /dev/null, ignora os desligamentos, é executado em segundo plano e desanexa.

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

Então você pode apenas fazer sbg emacs. Você também pode passar qualquer argumento que quiser: sbg emacs --daemon FILE1 FILE2.


7



a solução de script funcionou melhor para mim. obrigado!! embora eu tenha usado (gui_app &> /dev/null &) em vez disso (@ resposta do EMPraptor) - Jimi Oke


command &

Coloque um e comercial após o comando.


3