Uma possibilidade é que o programa capture a seqüência Ctrl + C . Verifique a saída de stty -a
; a configuração intr
indica qual combinação de teclas (se houver) envia um sinal SIGINT e isig
indica se as chaves de sinal estão ativadas ( -isig
significa que elas estão desativadas).
Se o programa consiste em vários processos, pressionar Ctrl + C envia SIGINT para todos os processos na grupo de processos . Você pode obter o mesmo efeito enviando o sinal para o grupo de processos, em vez de enviá-lo para um dos processos. Para enviar um sinal para um grupo de processos, primeiro determine seu líder: esse é o primeiro processo que inicia todos os outros; se você executar o grupo de processos em segundo plano, esse é o PID mostrado por jobs -l
. O PID do líder do grupo de processos é o PGID (id do grupo de processos); envie o sinal para o negativo. Por exemplo. se o PGID for 1234, execute kill -INT -1234
.
Se o programa consistir em um script de wrapper e um aplicativo principal, há dois casos a serem considerados. Se não houver limpeza para fazer, para que o script wrapper termine assim que a aplicação principal terminar, faça a chamada do script de wrapper exec
:
#!/bin/sh
export SOMEVAR=somevalue
…
exec /path/to/application "$@"
Desta forma, o aplicativo substitui o script, herdando seu PID. Alguns shells otimizam um script que termina executando outro programa, mas não todos. Essa abordagem não funciona quando o script precisa executar alguma limpeza, como a remoção de arquivos temporários.
Considere fazer o script detectar um sinal e transmitir o sinal para o aplicativo. Aqui está um esboço de como isso acontece:
/path/to/application "$@" &
app_pid=$!
trap -INT 'kill -INT $app_pid'
wait $!
rm /temp/file