É prejudicial fechar uma janela do terminal sem sair adequadamente de um aplicativo?

18

Usando o Ubuntu 12.04 LTS, minha pergunta é que, se eu iniciasse um aplicativo em uma janela de terminal, haveria algo de ruim em fechar a janela do terminal sem sair do aplicativo corretamente primeiro. Por exemplo, eu uso o MATLAB. Eu abro um terminal e digito

matlab -nodisplay -nodesktop -nosplash

e, em seguida, execute vários scripts. Então eu posso

exit

para finalizar o MATLAB e feche a janela do terminal ou apenas feche a janela do terminal. Qual é realmente a diferença entre esses dois métodos? O segundo método de alguma forma "prejudica" alguma coisa? O primeiro método é preferido? Por quê?

Ponto fixo
fonte

Respostas:

22

Em geral, isso deve ser bom para fazê-lo dessa maneira.

Quando você clica no "X" para fechar a janela do terminal, está enviando um "sinal" da área de trabalho (GNOME, KDE, etc.) para o aplicativo do terminal, dizendo-lhe para se desligar. Como você está executando o MATLAB neste shell, é considerado um processo filho para o aplicativo do terminal.

Portanto, parte das responsabilidades de ser um processo pai é que você, por sua vez, envia esse mesmo "sinal" próximo a seus filhos.

Agora, se você entende conceitualmente o que acabei de explicar, vamos substituir um pouco mais a terminologia real.

sinais

Primeiro com o "sinal", na verdade há toda uma família de sinais diferentes que você pode enviar para os processos do Unix. Para mantê-lo simples, existem 4 que muitas vezes você vai ver, SIGHUP, SIGTERM, SIGINT, e SIGKILL.

  • SIGHUP

    O sinal SIGHUP é enviado para um processo quando seu terminal de controle é fechado. Foi originalmente projetado para notificar o processo de queda da linha serial. Nos sistemas modernos, esse sinal geralmente significa que o controle de pseudo ou terminal virtual foi fechado.

  • SIGTERM

    O sinal SIGTERM é um sinal genérico usado para causar o encerramento do programa. Ao contrário do SIGKILL, esse sinal pode ser bloqueado, manipulado e ignorado. É a maneira normal de pedir educadamente que um programa seja encerrado.

  • SIGINT

    O sinal SIGINT (“interrupção do programa”) é enviado quando o usuário digita o caractere INTR (normalmente Cc).

  • SIGKILL

    O sinal SIGKILL é usado para causar o encerramento imediato do programa. Ele não pode ser manipulado ou ignorado e, portanto, é sempre fatal. Também não é possível bloquear este sinal.

NOTA: SIGINT é o que é enviado quando você usa Ctrl+ Cpara "interromper" um programa na linha de comando enquanto ele está no meio da execução.

qual deles está se acostumando?

Provavelmente, isso SIGTERMestá sendo chamado pelo seu ambiente de janelas e passado para o seu terminal. O seu terminal provavelmente estará enviando SIGHUPpara o MATLAB. Esse sinal oferece a todos os processos a oportunidade de fazer qualquer limpeza local (fechamento de arquivos, finalização de processos etc.).

comando kill

Você pode enviar sinais usando o comando com nome incorreto kill,. Então, para enviar o SIGTERMsinal ao seu terminal ou ao SIGHUP to MATLAB, you could determine their PID usingps` e execute este comando para enviar o sinal:

$ kill -SIGTERM <PID>

ou isto:

$ kill -SIGHUP <PID>

Você pode obter uma lista completa dos sinais usando este comando:

$ kill -l
 1) SIGHUP   2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP
 6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
...
...

Observe que os sinais têm números? Muitas vezes, você as vê usadas dessa maneira, e não pelos nomes:

$ kill -15 <PID>

Ou o infame -9, que pode matar praticamente qualquer processo.

slm
fonte
Eu sempre pensei que esses números eram negativos, mas na verdade são argumentos de linha de comando. Eu aprendi algo novo: D
Thomas
11
HUP - HangUP - é o sinal enviado se você "perder a linha" de um terminal, por exemplo, você estava conectado a um servidor Unix por modem. É provavelmente o sinal mais "suave" que encerra um processo. A maioria dos daemons não sai, mas relê seus arquivos de configuração no HUP. O comando nohup permite permitir que um processo em segundo plano continue após o fechamento do shell. Comandos como a tela sobrevivem ao desligamento e isola os comandos do HUP.
Baard Kopperud
@ BaardKopperud - obrigado, deixei intencionalmente o HUP de fora, não queria confundir a discussão.
Slm
@BaardKopperud - Acho que o que você está apontando é o seguinte: "O sinal SIGHUP é enviado para um processo quando seu terminal de controle é fechado. Ele foi originalmente projetado para notificar o processo de queda de linha serial. Nos sistemas modernos, esse sinal normalmente significa que o controle de pseudo ou terminal virtual foi fechado "Admito que menti um pouco na minha descrição, mas estava tentando simplificá-la.
Slm
@BaardKopperud - Eu me senti culpado, então modifiquei minha resposta para refletir com mais precisão o que está acontecendo. Obrigado!
slm
2

Provavelmente, tudo bem, mas você perderá dados, dependendo dos aplicativos que você abriu. Por exemplo, se você tiver um editor de arquivos aberto, poderá perder algumas das alterações se não salvar e sair corretamente. Se estiver preocupado, faça logout / saia do terminal corretamente. Se você não gosta de digitar exitou logoutapenas tenta Ctrl-D.

Marca
fonte
Por que isso seria melhor? A aplicação vai ficar SIGHUP vez de SIGTERM, mas ele ainda está sendo morto por um sinal, então eu não chamaria exatamente isso "salvar e sair corretamente"
Michael Mrozek
Na medida em Ctrl-Dque isso realmente só se aplica no prompt de comando.
Mark