Em sistemas POSIX, os sinais de terminação geralmente têm a seguinte ordem (de acordo com muitas páginas MAN e as especificações POSIX):
SIGTERM - peça educadamente que um processo seja encerrado. Ele deve terminar normalmente, limpando todos os recursos (arquivos, soquetes, processos filho, etc.), excluindo arquivos temporários e assim por diante.
SIGQUIT - pedido mais forte. Ele deve terminar sem graça, ainda limpando recursos que absolutamente precisam de limpeza, mas talvez não exclua arquivos temporários, talvez escreva informações de depuração em algum lugar; em alguns sistemas também um dump de memória será gravado (independentemente se o sinal foi capturado pelo aplicativo ou não).
SIGKILL - pedido mais forte. O processo nem é solicitado a fazer nada, mas o sistema irá limpar o processo, quer goste ou não. Provavelmente, um dump de memória foi gravado.
Como o SIGINT se encaixa nessa imagem? Um processo CLI geralmente é encerrado por SIGINT quando o usuário pressiona CRTL + C, no entanto, um processo em segundo plano também pode ser encerrado por SIGINT usando o utilitário KILL. O que não consigo ver nas especificações ou nos arquivos de cabeçalho é se o SIGINT é mais ou menos forte do que o SIGTERM ou se há alguma diferença entre o SIGINT e o SIGTERM.
ATUALIZAR:
A melhor descrição dos sinais de término que encontrei até agora está na documentação GNU LibC . Isso explica muito bem que existe uma diferença pretendida entre SIGTERM e SIGQUIT.
Diz sobre SIGTERM:
É a maneira normal de pedir educadamente que um programa seja encerrado.
E diz sobre SIGQUIT:
e produz um core dump ao encerrar o processo, como um sinal de erro de programa. Você pode pensar nisso como uma condição de erro do programa “detectada” pelo usuário. [...] Certos tipos de limpeza são melhor omitidos no manuseio do SIGQUIT. Por exemplo, se o programa criar arquivos temporários, ele deve lidar com as outras solicitações de encerramento excluindo os arquivos temporários. Mas é melhor para o SIGQUIT não excluí-los, para que o usuário possa examiná-los em conjunto com o dump principal.
E SIGHUP também é explicado bem o suficiente. SIGHUP não é realmente um sinal de término, significa apenas que a "conexão" com o usuário foi perdida, então o aplicativo não pode esperar que o usuário leia mais nenhuma saída (por exemplo, saída stdout / stderr) e não há nenhuma entrada a esperar do usuário por mais tempo. Para a maioria dos aplicativos, isso significa que é melhor encerrar. Em teoria, um aplicativo também pode decidir que entra no modo daemon quando um SIGHUP é recebido e agora é executado como um processo em segundo plano, gravando a saída em um arquivo de log configurado. Para a maioria dos daemons já em execução em segundo plano, SIGHUP normalmente significa que eles devem reexaminar seus arquivos de configuração, portanto, você os envia para processos de segundo plano após editar os arquivos de configuração.
No entanto, não há nenhuma explicação útil do SIGINT nesta página, a não ser que ele é enviado por CRTL + C. Existe alguma razão pela qual alguém lidaria com o SIGINT de uma maneira diferente do SIGTERM? Em caso afirmativo, qual seria o motivo e como o tratamento seria diferente?
sudo fuser -l
em seu prompt de comando. Para mim, isso traz à tona:HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
kill -l
uma lista de sinais.