Como impedir que o aplicativo iniciado no Terminal saia indesejadamente?

10

Eu inicio aplicativos do Terminal com comandos como este:

/Applications/Mail.app/Contents/MacOS/Mail &

A parte importante é a  &.

  • Para Unix / Linux / Solaris:

    • Eu aprendi na escola que adicionar o  &faz o programa viver por conta própria.
    • Lembro-me fortemente de ter lançado um comando  xeyes &e ter o programa em execução seguro, mesmo depois de fechar o shell.
  • No Mac OS X (dentro do Unix):

    1. Inicio um aplicativo  &e fecho a janela do Terminal: o aplicativo sai!
    2. Por que esse comportamento indesejável ocorre no Mac OS X?
    3. Como isso pode ser consertado ?
Nicolas Barbulesco
fonte
Pergunta relacionada: apple.stackexchange.com/q/119319/20773
Eric3

Respostas:

7

A maneira "padrão" de realizar o que você deseja realizar (no OS X, Linux, FreeBSD ou outros sistemas) é usar o comando nohup:

nohup program &

Isso iniciará program, que será executado em segundo plano em relação ao shell por causa dos &- e ignorará os sinais de interrupção devido ao comando nohup.

Dessa forma, o programa continuará sendo executado mesmo que você feche o shell. Não importa se você está fechando o shell porque está fechando o Terminal.app ou se está fechando o shell porque está desconectando de uma conexão ssh com o computador ou similar.

jksoegaard
fonte
1
Isso cria um arquivo nohup.outna pasta atual. Mesmo quando não há nada para escrever. Depois de algumas semanas, eu teria arquivos nohup.outem todo lugar no meu Mac. :-(
Nicolas Barbulesco
1
@NicolasBarbulesco Use nohup command>/dev/null&ou command&disown.
Lri
6

Quando você fecha uma janela do terminal, ele envia um SIGHUP (sinal de interrupção) para o shell, que envia o SIGHUP para todos os processos iniciados . Esse é um comportamento tradicional para o bash e muitos outros shells, e a solução tradicional para isso é usar nohup.

Existem várias maneiras pelas quais diferentes máquinas Unix podem ser diferentes, portanto, é possível que os emuladores de terminal específicos que você usou ou os shells específicos que você usou tenham se comportado de maneira diferente. Mas não é específico para o OS X. Por exemplo, há uma pergunta sobre esse mesmo problema no Ubuntu.

Alan Shutko
fonte
6

Usando o "e comercial" &", você está dizendo ao Terminal para executar o processo em segundo plano do próprio shell. Assim, quando você fecha o shell (e mata o processo), a GUI (Mail.app em si) também fecha.

O comando correto para iniciar o Mail a partir do terminal é simplesmente:

open -a Mail; exit

Edit: Acabei de encontrar isso no U&L Stack Exchange: O que significa e comercial no final de uma linha de script de shell? As respostas fornecidas são excelentes e explicam exatamente o que está acontecendo com mais detalhes e melhor do que eu jamais pude! Eu recomendo a leitura.

njboot
fonte
Que tal passar parâmetros de linha de comando para o aplicativo? Assim:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco
2
@NicolasBarbulesco Essa é uma questão separada - veja a página man aberta e acho que uma pergunta aqui
user151019
Que tal iniciar um aplicativo específico, não estando /Applications, mas em um caminho específico? Assim:/Users/nicolas/Desktop/Firefox-29-fr/Firefox.app/Contents/MacOS/firefox -profile "/Users/nicolas/Desktop/Firefox-29-fr/Profil-Firefox-29-fr/" -no-remote &
Nicolas Barbulesco 06/06
@NicolasBarbulesco abra [caminho completo] ou cd para o diretório e abra [arquivo]. Você pode usar ~ / para sua pasta pessoal e o caractere especial "asterisco", como uma notação mais curta, supondo que nenhuma outra string corresponda ao valor, IE: ~ / De * / Fire * ... etc. Ou apenas escreva um script simples: cat> nameofscript ..... #! / bin / sh .... abre [caminho completo] .... ^ D ..... chmod + x nome do script ...... \ nome do script .... e opcional, mv nome do script $ PATH / yourpersonalbin. Não recomendo ler o homem aberto. É um comando simples e, como comando simples, a desvantagem é que não é tão poderoso.
Njboot 6/06/2014
1
Desculpe, ainda precisa usar o argumento -a:open -a Applications/Mail.app/Contents/MacOS/Mail; exit
njboot
3

O @jksoegaard possui os comandos adequados, mas como você mencionou no comentário, ele cria um arquivo nohup.out. Para impedir que o arquivo nohup.out seja criado, é necessário redirecionar STDOUT e STDERR para outro lugar. O comando completo seria nohup program &>/dev/null &. Isso executará seu programa em segundo plano, ignorando o SIGHUP e enviando todos os STDOUT e STDERR para / dev / null.

No entanto, se você não se lembrou de adicionar nohup (como na sua pergunta original), pode usar o disown -arhcomando para marcar todos os trabalhos em execução em segundo plano para ignorar o SIGHUP.

Insomniac Software
fonte
Boa resposta, mas ainda complicada. E boa imagem de perfil. :-)
Nicolas Barbulesco
3

Eu encontrei a solução :

(/Applications/Mail.app/Contents/MacOS/Mail &)

É simples, é bonito e funciona!

Os parênteses  ( )iniciam o comando em uma subcasca.

Nicolas Barbulesco
fonte
--e o & retorna do programa para o shell sem esperar, para que você possa continuar usando o shell ou finalizá-lo, sem o programa que você começou a sair.
r_alex_hall
0

Ou você pode tentar open -a /Applications/Mail.app

Uso: abrir [-e] [-t] [-f] [-W] [-R] [-n] [-g] [-h] [-s] [- b] [-a] [nomes de arquivos] [--args argumentos]
Ajuda: Abrir abre arquivos de um shell.
      Por padrão, abre cada arquivo usando o aplicativo padrão para esse arquivo.
      Se o arquivo estiver no formato de uma URL, ele será aberto como uma URL.
Opções:
      -a Abre com o aplicativo especificado.
      -b Abre com o identificador de pacote de aplicativos especificado.
      -e Abre com o TextEdit.
      -t Abre com o editor de texto padrão.
      -f Lê a entrada da entrada padrão e abre com o TextEdit.
      -F --fresh Inicia o aplicativo atualizado, ou seja, sem restaurar as janelas. O estado persistente salvo é perdido, excluindo documentos sem título.
      -R, --reveal Seleciona no Finder em vez de abrir.
      -W, --wait-apps Bloqueia até que os aplicativos usados ​​sejam fechados (mesmo que já estejam em execução).
          --args Todos os argumentos restantes são passados ​​em argv para a função main () do aplicativo, em vez de abertos.
      -n, --new Abre uma nova instância do aplicativo, mesmo que já esteja em execução.
      -j, --hide Inicia o aplicativo oculto.
      -g, --background Não traz o aplicativo para o primeiro plano.
      -h, --header Pesquisa os locais dos arquivos de cabeçalho nos cabeçalhos correspondentes aos nomes de arquivos fornecidos e os abre.
      -s Para -h, o SDK a ser usado; se fornecido, apenas os SDKs cujos nomes contêm o valor do argumento são pesquisados.
                        Caso contrário, o SDK com versão mais alta em cada plataforma é usado.
Halomaple
fonte
-2

Eu encontrei uma solução: combater o mal com o mal.

Eu inicio meu aplicativo com este tipo de comando:

/Applications/Mail.app/Contents/MacOS/Mail & exit

O shell sai de uma só vez. E o aplicativo sobrevive, mesmo depois de fechar a janela do Terminal.

Mas esta solução não é muito útil.

Nicolas Barbulesco
fonte
1
Você realmente deveria estar abrindo aplicativos incluídos no pacote aberto . Isso é uma prova do futuro, pois o conteúdo do pacote muda e também é canônico.
Ian C.
@Ian - Aqui estou particularmente interessado em abrir aplicativos que estejam em um caminho específico, que não estejam e que não estejam /Applicationsincluídos no meu Mac.
Nicolas Barbulesco 6/06/2014
1
.appas pastas são chamadas de "pacotes" e o opencomando pode iniciá-las, estejam elas na /Applicationspasta ou em qualquer outra pasta. O termo "pacote configurável" neste contexto não significa "enviado com o OS X".
ninguém
abrir é o mesmo que clicar no ícone. Não é o mesmo que iniciar o aplicativo a partir da linha de comando que o OP pede.
quer