Como inicializar um aplicativo GUI através do Terminal?

76

Alguns aplicativos de GUI são inicializados de forma limpa por meio da 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 e comercial% sufixo & 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 através do Terminal para que não haja efeito de "suspensão", assim como lançar algo através de Alt + F2 ?

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

    
por Peter.O 31.10.2010 / 11:50

11 respostas

17

No caso do gedit, apenas mantenho uma cópia aberta o tempo todo. Contanto que você tenha uma cópia existente em execução, o lançamento de gedit chamadas do terminal e o fechamento do terminal não eliminarão o gedit.

Para outras coisas, o que outras pessoas disseram também funcionaria. Eu sou um fã de nohup ... Mas se você precisar de um terminal, você pode desanexar, mas depois voltar a anexá-lo, você quer olhar para screen .

  1. Execute-o em um terminal e execute algo que continue pressionando a saída. Eu uso o servidor de desenvolvimento do Django, mas irssi ou mesmo watch uptime seriam bons exemplos.
  2. Mate o terminal e inicie um novo.
  3. Execute screen -r e BOOM, você está de volta.

screen é muito maior que isso e você pode combiná-lo com byobu para uma melhor experiência de terminal. Leia por aí.

    
por Oli 31.05.2011 / 14:25
84

Suponha que gedit seja o programa que você deseja executar desanexado (também conhecido como "deserdado", "desembaraçado", "desacoplado"). Existem diferentes maneiras, dependendo do que você quer 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ê esqueceu de nohup it). Você primeiro tem que pará-lo usando Ctrl + Z . Então você pode colocar no brackground usando bg [jobId] (por exemplo, bg 1 ). Você obtém uma lista de tarefas em execução com o jobId usando jobs . Depois disso, você pode dissociá-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

nohup nem sempre está presente em todas as máquinas. Se você sabe que quer dissociar de antemão, você usaria:

nohup gedit &

Talvez você queira redirecionar também a saída do shell e seu programa seja uma pseudo-fonte de entrada, portanto: nohup ./myprogram > foo.out 2> bar.err < /dev/null & . Você gostaria de redirecionar a saída para não ficar incomodado com ela ou usá-la posteriormente. A entrada nula pode ajudar a prevenir hickups em ssh e assim por diante.

Subshell:

Você pode conseguir um efeito semelhante por

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

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

Multiplexação de terminal

Também multiplexação terminal usando tela ou byobu . Você basicamente executa o programa em um terminal próprio. Eu realmente posso recomendar 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 janela seguinte
  • F4 Mover para a janela anterior
  • F6 Desanexe da sessão e faça o logout
  • Shift-F6 Desanexe da sessão, mas não efetue logout
  • F7 Digite o modo de rolagem / pesquisa
  • Ctrl-F5 Reconecta qualquer soquete ou agente SSH / GPG

Menos útil:

  • Shift-F2 Dividir a tela horizontalmente
  • Ctrl-F2 Dividir a tela verticalmente
  • Shift-F3 Move o foco para a próxima divisão
  • Shift-F4 Move o foco para a divisão anterior
  • Shift-F5 Recolher todos os grupos
  • F5 Atualiza todas as notificações de status
  • F8 Renomeie a janela atual
  • F9 Lançar o menu de configuração do Byobu
  • F12 Chave de Escape da Tela GNU
  • Alt-Pageup Rola de volta pelo histórico desta janela
  • Alt-Pagedown Navegue pelo histórico desta janela
  • Ctrl-a -! Ative ou desative todas as combinações de teclas do Byobu

O daemon 'at' e outros

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

echo './myprogram myoption1 myoption2' | at now

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

    
por con-f-use 31.05.2011 / 14:28
25

The mysterious ampersand "&" suffix, seems to cause the terminal to put the process into the background... (but I'm not sure what happens there).

Faz, e é frequentemente o que você quer. Se você esquecer de usar o & amp ;, você pode 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, salvar 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 em tarefas, 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", você notará que ele inicia o programa gráfico e "sai".

Aqui está um pequeno script , você pode colocá-lo em ~/bin , que eu nomeei 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 os erros na localização possam ser reportados. Execute-o como "runbg your-command args ..."; você ainda pode redirecionar o stdout / err para um arquivo se precisar salvar a saída em algum lugar.

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

    
por Roger Pate 31.10.2010 / 12:25
21

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

firefox &!
    
por Rick 31.10.2010 / 13:20
20

Use nohup

nohup is a program that runs a given command with hangup signals ignored, so that the command can continue running in the background after its parent process terminates. See the manpage

Por exemplo:

nohup gedit something
    
por Florian Diesch 31.05.2011 / 14:10
4

Abra o terminal, digite tela , digite o comando que você quer executar, feche o terminal. O programa deve continuar rodando na sessão Tela GNU .

    
por RobinJ 31.05.2011 / 17:00
1

Isso funcionou para mim:

$ (nohup gedit 2>/dev/null &)
    
por wesleycoder 31.12.2012 / 00:20
0

xdg-open

Veja este utilitário de propósito geral: link

Isso abrirá um local relativo em 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
    
por 21.03.2019 / 11:12
0

Como muitas pessoas imaginaram, nohup é a coisa a considerar. Mas nohup ainda permanece aberto no terminal e exibe a atividade do programa no terminal 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. Ele abre o gedit e fecha o terminal quando o gedit é iniciado. Como o gedit não está associado ao terminal agora, ele permanece ativo.

    
por Lokesh Devnani 03.09.2015 / 19:25
0

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

bash -i >/dev/null 2>&1 <<<'nohup gedit &'
    
por Sam 02.01.2018 / 20:40
0

Isso funcionou para mim:

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
    
por Eyal Levin 13.06.2018 / 10:43