Como iniciar de forma limpa um aplicativo GUI através do Terminal?

78

Alguns aplicativos de GUI são iniciados de maneira limpa via linha de comando do Terminal, mas outros não, e fazem com que o Terminal aguarde o término do aplicativo. Mesmo assim, alguns não "liberam" a linha de comando.

O misterioso &sufixo " e comercial" parece fazer com que o terminal coloque o processo em segundo plano (mas não tenho certeza do que acontece lá).

Existe uma maneira de iniciar um aplicativo pelo Terminal para que não ocorra um efeito de "espera", assim como iniciar algo via Alt+ F2?

Gostaria de ter a linha de comando disponível novamente imediatamente, sem algo ainda em segundo plano e sem impressão no terminal.

Peter.O
fonte
A pedido de htorque, eu apaguei sua resposta que você aceitou. Por favor, você poderia escolher outra resposta (você terá que desmarcar htorque do primeiro - deve estar à espreita na parte inferior da página em vermelho)
Oli
1
O método para lidar com um programa que já está em execução (conforme descrito por con-f-use) é bom para essa situação, mas como minha pergunta principal era sobre o lançamento limpo sem desordem de terminal , aceitei screen(mencionado por Oli e RobinJ). Estou impressionado com sua capacidade; depois de ler e experimentar ... Requer apenas a digitação de: screen -d -m gedit(ou screen geditentão Ctrl+a ddesconectar) ... e ainda tenho acesso total à visualização do terminal do gedit (para mensagens de aviso etc.) a qualquer momento, screen -rmesmo que eu ter fechado a janela de terminal original, entretanto ...
Peter.O
BTW, algumas das coisas que você atribui ao terminal são realmente feitas pelo shell, por exemplo, interpretando o &sufixo do comando. Isso pode ser útil para esclarecimentos: Qual é a diferença entre Terminal, Console, Shell e Linha de Comando?
Wjandrea #

Respostas:

17

No caso do gedit, eu apenas mantenho uma cópia aberta o tempo todo. Contanto que você tenha uma cópia em execução, iniciar geditchamadas do terminal e depois fechar o terminal não matará o gedit.

Por outras coisas, o que as outras pessoas disseram também funcionaria. Sou fã de nohup... Mas se você precisar de um terminal, poderá desconectar e depois reconectá-lo, quer dar uma olhada screen.

  1. Execute-o em um terminal e, em seguida, execute algo que continua pressionando a saída. Eu uso o servidor de desenvolvimento Django, mas irssiou mesmo watch uptimeseriam bons exemplos.
  2. Mate o terminal e comece um novo.
  3. Corra screen -re BOOM, você voltou.

screené muito maior que isso e você pode combiná-lo byobupara obter uma melhor experiência de terminal. Leia ao redor.

Oli
fonte
Esta é a primeira visão real que eu tive, como o que a tela não / pode fazer ... obrigado pela dica terminal de ...
Peter.O
tela não está mais disponível, mas o tmux pode substituir a tela. (tmux para iniciar uma nova sessão tmux, ctrl + b, em seguida, pressione d para deatach e tmux anexar para recolocar)
Gman Smith
84

Suponha que gedito programa que você deseja executar seja desanexado (também conhecido como "deserdado", "desemaranhado", "desacoplado"). Existem diferentes maneiras, dependendo do que você deseja fazer exatamente:

Programa já em execução

Disown:

disown -hé o caminho a percorrer se você quiser fazer isso com um programa já em execução (ou seja, se você se esqueceu nohup). Você primeiro precisa parar usando Ctrl+ Z. Então você pode colocar em segundo plano usando bg [jobId](por exemplo bg 1). Você obtém uma lista dos trabalhos em execução com o jobId usando jobs. Depois disso, você pode separá-lo do terminal usando disown -h %[jobId]. Exemplo de sessão de terminal:

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

Programa ainda não iniciado

nohup

nohupnem sempre está presente em todas as máquinas. Se você sabe que deseja desacoplar antes, usaria:

nohup gedit &

Talvez você vai querer redirecionar a saída shell bem e seu programa de uma fonte de entrada pseudo, então: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Você deseja redirecionar a saída para não se incomodar com ela ou usá-la mais tarde. A entrada nula pode ajudar a evitar hickups no ssh.

Subshell:

Você pode obter um efeito semelhante ao

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

Os colchetes abrem um novo subshell para executar o gedit. O >/dev/null 2>&1redireciona a saída do shell para lugar nenhum (suprimindo a saída). E &no final coloca o processo em segundo plano.

Multiplexação de terminais

Também multiplexação de terminal usando tela ou byobu . Basicamente, você executa o programa em um terminal próprio. Eu realmente recomendo o byobu por outras razões também. Abaixo está uma lista de atalhos de boybu que podem ser úteis para seus primeiros passos:

Útil:

  • F2 Crie uma nova janela
  • F3 Mover para a próxima janela
  • F4 Mover para a janela anterior
  • F6 Desconecte-se da sessão e saia
  • Shift-F6 Desconecte da sessão, mas não saia
  • F7 Entre no modo de rolagem / pesquisa
  • Ctrl-F5 Reconecte todos os soquetes ou agentes SSH / GPG

Menos útil:

  • Shift-F2 Dividir a tela horizontalmente
  • Ctrl-F2 Dividir a tela verticalmente
  • Shift-F3 Mover o foco para a próxima divisão
  • Shift-F4 Mover o foco para a divisão anterior
  • Shift-F5 Recolher todas as divisões
  • F5 Atualizar todas as notificações de status
  • F8 Renomeie a janela atual
  • F9 Inicie o menu de configuração do Byobu
  • F12 Chave de escape da tela GNU
  • Alt-Pageup Role para trás através do histórico desta janela
  • Alt-Pagedown Role para a frente no histórico desta janela
  • Ctrl-a-! Ativar ou desativar todas as combinações de teclas de Byobu

O daemon 'at' e outros

até uma pequena ferramenta útil para executar um comando em um horário agendado. Pode ser 'mal utilizado' para desanexar um comando do shell:

echo './myprogram myoption1 myoption2' | at now

Além disso, você pode analisar setside start-stop-daemon, mas os outros métodos devem ser suficientes.

confundir
fonte
Dica: se houver apenas um trabalho, o ID do trabalho é opcional; por exemplo, em vez de bg %1você, basta digitar bg.
21416 MasterMastic
25

O misterioso e comercial "&" sufixo, parece fazer com que o terminal coloque o processo em segundo plano ... (mas não tenho certeza do que acontece lá).

Sim, e muitas vezes é o que você deseja. Se você esquecer de usar &, poderá suspender o programa com ctrl-z e colocá-lo em segundo plano com o comando bg - e continuar a usar esse shell.

O processo 'stdin, stdout e stderr ainda estão conectados ao terminal; você pode redirecionar aqueles de / para / dev / null ou qualquer outro arquivo (por exemplo, salve um log de saída em algum lugar), conforme desejado:

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

Você pode ver o processo nos trabalhos, trazê-lo de volta ao primeiro plano (comando fg) e enviar sinais (comando kill).

Alguns programas gráficos serão desconectados do terminal; se for esse o caso, quando você executar o comando "normalmente", notará que ele inicia o programa gráfico e "sai".


Aqui está um script curto , você pode colocá-lo em ~ / bin , que chamei de 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

Eu procuro o programa ($ prog) antes de redirecionar para que erros na localização possam ser relatados. Execute-o como "runbg your-command args ..."; você ainda pode redirecionar stdout / err para um arquivo se precisar salvar a saída em algum lugar.

Exceto pelos redirecionamentos e tratamento de erros, isso é equivalente à resposta do htorque .

Comunidade
fonte
Ok, obrigado ... Parece que ctrl-z(suspend) me dá acesso à linha de comando novamente, mas apaga a GUI até eu emitir o bgque parece des-suspendê-la. (faz sentido) ... Existe outro comando pelo qual eu posso desconectar a GUI ... Aha! Agora eu vejo o que você quer dizer com sighals (kill command)... (coisas interessantes esses sinais) .. Eu usei um trecho de código para gerar ddestatísticas progressivamente progressivas .. e ele usou kill+ um SINAL ... Existe um SINAL específico para desanexar um "trabalho" "?
Peter.O
Acabei de reparar no seu comentário à resposta de Rick ... Tentei os disown trabalhos -p gedit`` e parecia remover o trabalho .... (mas recebi mensagens do sistema no Terminal quando fechei manualmente o gedit ... mas acho Eu tenho um Terminal ferrou-up no momento ... muito experimentar :(
Peter.O
@fred: os trabalhos são gerenciados pelo shell, portanto, nenhum sinal pode controlar isso. Você pode achar que funciona melhor iniciar vários shells - vários terminais da GUI permitem guias e você pode usar o screen ou tmux.
2
@fred: melhor não execute jobs -p commandse você tiver várias instâncias de um comando executando em segundo plano por vez. você pode usar jobspara encontrar o ID do trabalho correto e, em seguida, jobs -p <job-id>obter o PID do trabalho. Pessoalmente, acho a versão com o subshell muito mais fácil. ;-)
htorque 31/10/10
2
@ htorque, fred: Você pode executar o repúdio sem parâmetros para que o bash repudie o último trabalho:gedit & disown
22

Para iniciar um aplicativo e desanexá-lo do terminal iniciado, use & !.

firefox &!
Rick
fonte
6
É bom saber, mas isso parece ser apenas zsh. No bash, você teria que executar manualmente disown <pid-of-command>depois de iniciar o comando em segundo plano.
Htc #
Interessante ... vou analisar o zsh, mas como um novato no Linux, vou ficar com o bash por enquanto ... Obrigado
Peter.O
o que o ponto de exclamação faz?
noz sobre natty
1
O ! interromperá o processo do aplicativo do processo do terminal para que você possa fechar o terminal sem que o aplicativo que foi iniciado seja fechado. Parece ser uma coisa zsh, mas útil.
Rick
Mas isso também funcionou no bash @htorque .... Então eu acho que não é um problema.
Jasser
20

Usar nohup

nohup é um programa que executa um determinado comando com sinais de interrupção ignorados, para que o comando possa continuar em execução em segundo plano após o término do processo pai. Veja a página de manual

Por exemplo:

nohup gedit something
Florian Diesch
fonte
2
O que é nohup? Por favor elabore.
Oxwivi 31/05
3
nohup é um programa que executa um determinado comando com sinais de interrupção ignorados, para que o comando possa continuar em execução em segundo plano após o término do processo pai. Veja a página de manual
Florian Diesch
Na verdade, acho que minha resposta está incorreta aqui. Em uma reflexão mais aprofundada, nohupdeve ser usado neste cenário.
boehj
2
Quando um shell interativo recebe um sinal SIGHUP, pode enviar (ou não, dependendo das configurações) um sinal SIGHUP para todos os seus filhos. Isso pode acontecer (ou não, novamente) quando um terminal está fechado. Uma criança que não esteja pronta para lidar com esse sinal executará a ação padrão, ou seja, sair. O nohupaplicativo (e o disownbash embutido) não permitem que o sinal chegue ao aplicativo.
Enzotib 31/05
2
Uma coisa a ter cuidado é que nohupcria um arquivo no diretório atual chamado nohup.out. Veja a página de manual para mais detalhes. Eu prefiro disownpor esse motivo e pelo fato de disownfuncionar após o lançamento gedit.
Flimm
4

Abra o terminal, digite tela , digite o comando que deseja executar, feche o terminal. O programa deve continuar em execução na sessão GNU Screen .

RobinJ
fonte
O que exatamente é o GNU Screen?
Oxwivi
Se eu entendi a idéia corretamente, é um tipo de gerenciador de janelas para a linha de comando. Ele permite que você execute mais de um programa ao mesmo tempo em uma sessão da interface da linha de comandos.
RobinJ
Byobu?
Oxwivi 31/05
Algo assim, apenas Byobu é mais fácil de usar. Se eu estiver errado com o npot, o Byobu é apenas uma interface mais fácil para o GNU Screen.
RobinJ
1

Isso funcionou para mim:

$ (nohup gedit 2>/dev/null &)
wesleycoder
fonte
1

xdg-open

Dê uma olhada neste utilitário de uso geral: https://linux.die.net/man/1/xdg-open

Isso abrirá um local relativo no seu gerenciador de arquivos.

 $ xdg-open .

Isso abrirá um arquivo pdf em um leitor de pdf.

 $ xdg-open foo.pdf

Você pode até fornecer URLs da web

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

Como muita gente imaginou, nohup é a coisa a considerar. Mas o nohup stills permanece aberto no terminal e exibe a atividade do programa no terminal, o que é irritante. Você pode simplesmente fechar o terminal depois disso para evitar isso. Eu descobri uma solução muito simples que eu uso.

nohup gedit & exit

E é isso. Abre o gedit e fecha o terminal quando o gedit é iniciado. Como o gedit não está associado ao terminal agora, ele permanece ativo.

Lokesh Devnani
fonte
0

Isso funciona mesmo dentro de um script (como aliases, o trailer '&' normalmente não é permitido em scripts porque eles não são interativos):

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

Isso funcionou para mim:

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

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