É perigoso fechar uma janela de terminal sem sair corretamente de uma aplicação?

18

Usando o Ubuntu 12.04 LTS, minha pergunta é que, se eu iniciei um aplicativo em uma janela de terminal, há algo ruim em apenas 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 tanto

exit

para finalizar o MATLAB e depois fechar a janela do terminal ou apenas fechar 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ê?

    
por Fixed Point 14.07.2013 / 03:13

2 respostas

22

Em geral, isso deve ser bom para fazer isso dessa maneira.

Quando você clica no "X" para fechar a janela do terminal, está enviando um "sinal" da sua área de trabalho (GNOME, KDE, etc.) para o aplicativo do terminal, solicitando que ele se desligue. Como você está executando o MATLAB neste shell, ele é 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" para os seus filhos.

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

sinais

Primeiro, com o "sinal", há, na verdade, uma família inteira de diferentes sinais que você pode enviar para processos Unix. Para simplificar, há quatro que você verá com frequência: SIGHUP , SIGTERM , SIGINT e SIGKILL .

  • SIGHUP

    The SIGHUP signal is sent to a process when its controlling terminal is closed. It was originally designed to notify the process of a serial line drop. In modern systems, this signal usually means that controlling pseudo or virtual terminal has been closed.

  • SIGTERM

    The SIGTERM signal is a generic signal used to cause program termination. Unlike SIGKILL, this signal can be blocked, handled, and ignored. It is the normal way to politely ask a program to terminate.

  • SIGINT

    The SIGINT (“program interrupt”) signal is sent when the user types the INTR character (normally C-c).

  • SIGKILL

    The SIGKILL signal is used to cause immediate program termination. It cannot be handled or ignored, and is therefore always fatal. It is also not possible to block this signal.

NOTA: SIGINT é o que é enviado quando você usa Ctrl + C para "quebrar" um programa da linha de comando enquanto está no meio da corrida.

qual está sendo usado?

O mais provável é que o SIGTERM esteja sendo chamado pelo seu ambiente de janelas e transmitido para o seu terminal. É mais provável que o seu terminal envie o SIGHUP para o MATLAB. Este sinal dá a todos os processos a oportunidade de fazer qualquer limpeza local (fechar arquivos, finalizar processos, etc.).

comando kill

Você mesmo pode enviar sinais usando o comando com um nome inadequado, kill . Então, para enviar o sinal SIGTERM para o seu terminal ou o SIGHUP to MATLAB, you could determine their PID using ps 'e, em seguida, 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ê os verá usados assim em vez de por seus nomes:

$ kill -15 <PID>

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

    
por 14.07.2013 / 03:40
2

É mais provável que esteja ok, mas você perderá dados dependendo de quais aplicativos você tenha aberto. Por exemplo, se você tiver um editor de arquivos aberto, poderá perder algumas das alterações se não salvar e sair corretamente. Se você está preocupado, apenas faça logout / saia do terminal corretamente. Se você não gosta de digitar exit ou logout , tente Ctrl-D .

    
por 14.07.2013 / 03:33