Estou tentando desanexar um processo de um script bash para que o SIGINT não seja encaminhado para o processo quando eu sair do script.
Eu usei o disown
comando diretamente no terminal, no entanto, no bash, disown
não impede que o SIGINT seja encaminhado. O objetivo deste script é iniciar o openocd e depois o gdb com uma única chamada. Como o script nunca sai (está executando o gdb), o SIGINT ainda é encaminhado do gdb para o openocd, o que é um problema, pois o SIGINT é usado como o comando de parada no gdb.
No terminal, seria algo parecido com isto:
$ openocd & # run openocd demonized
$ disown $! # disown last pid
$ gdb # invoke GDB
quando invocado no terminal nesta ordem, o SIGINT não é passado do gdb para o openocd. No entanto, se essa mesma chamada estiver em um script bash, o SIGINT será passado.
Qualquer ajuda seria muito apreciada.
ps esse problema está no OS X, mas estou tentando usar ferramentas que também são portáveis para todas as ferramentas do Unix.
nohup
não é a resposta certa. Você deve adicionar algum código de exemplo ou pseudocódigo para mostrar com mais precisão o que deseja.screen
?Respostas:
Para desanexar um processo de um script bash:
Se você interromper o script bash com
SIGINT
(ctrl + c) ou o shell sair do envio,SIGHUP
por exemplo, o processo não será incomodado e continuará sendo executado normalmente.stdout
&stderr
Será redirecionado para um arquivo de log:nohup.out
.Se você deseja executar um comando desanexado enquanto pode ver a saída no terminal, use
tail
:fonte
nohup
necessário? Qual é a diferença entrenohup COMMAND &
eCOMMAND &
se seu objetivo é apenas executar o comando em segundo plano e liberar o terminal?Para mim, isso funciona perfeitamente bem com desdém
fonte
A solução que encontrei envolve um programa chamado 'desanexar', escrito por Annon Inglorion e disponível para download em seu site
Uma vez compilado, ele pode ser usado em um script da seguinte maneira:
Essa primeira linha cria um novo processo (executando o openocd) e armazena a identificação do processo no arquivo (debug.pid) para uso posterior. Isso evita os problemas de grepping para o pid, conforme fornecido na resposta de Oliver. Ao sair do próximo programa de bloqueio (gdb), o arquivo que armazena o pid é usado para matar o processo desanexado diretamente.
fonte
detach
faz maravilhas.uma solução simples e portátil:
Algumas advertências de portabilidade: as
ps
opções dependem do sistema operacional! você poderia passar a usar uma variante:{ ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1
.at
não pôde estar disponível (estranho, mas isso acontece ...).$(...)
precisa de um shell não muito antigo; caso contrário, use reticulares.fonte
at
inicie um script que inicie o programa e forneça seu pid em um arquivo, e faça com que o script principal espere por isso arquivo para aparecer e, em seguida, leia o pid dele.