Como posso desanexar um processo de um script bash?

13

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 comando disown no terminal diretamente, no entanto, no bash, disown não impede que o SIGINT seja encaminhado. A finalidade deste script é iniciar o openocd e, em seguida, o gdb com uma única chamada. Como o script nunca sai (ele está executando o gdb), o SIGINT ainda é encaminhado do gdb para o openocd, o que é um problema, já que o SIGINT é usado como o comando halt 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 invocação estiver em um script bash, o SIGINT será transmitido.

Qualquer ajuda seria muito apreciada.

ps este problema está no OS X, mas estou tentando usar ferramentas que também são portáveis para todas as ferramentas Unix.

    
por user2328113 15.03.2016 / 00:39

4 respostas

14

Para desanexar um processo de um script bash:

nohup ./process &

Se você interromper seu script com o SIGINT, por exemplo, o processo não será incomodado e continuará sendo executado normalmente. stdout & stderr será redirecionado para um arquivo: nohup.out.

Se você deseja executar um comando desanexado enquanto pode ver a saída no terminal, use tail :

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./process &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &
    
por 15.03.2016 / 11:50
5

Para mim, isso funciona perfeitamente bem com o disown

command & disown
    
por 05.05.2017 / 14:05
1

uma solução simples e portátil:

echo "openocd" | at now #openocd starts now, but via the at daemon, not the current shell!
pid=$(ps -ef | grep "[o]penocd" | awk '{print $1}')  
echo "openocd is running with pid: $pid"
gdb

Algumas ressalvas de portabilidade: ps opções dependem do sistema operacional! você poderia usar uma variante de: { 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 backticks.

    
por 15.03.2016 / 06:03
1

A solução que encontrei envolve um programa chamado 'detach' escrito por Annon Inglorion e que pode ser baixado do site

Uma vez compilado, ele pode ser usado em um script da seguinte forma:

$ ./detach -p debug.pid openocd <args> # detach openocd
$ gdb <args>                           # run gdb
$ kill -9 $(cat debug.pid)             # end openocd process
$ rm debug.pid                         # remove file containing process id

Esta primeira linha cria um novo processo (executando o openocd) e armazena o id do processo no arquivo (debug.pid) para uso posterior. Isso evita os problemas com o grepping para o pid, conforme previsto na resposta de Oliver. Ao sair do próximo programa de bloqueio (gdb), o arquivo que armazena o pid é usado para eliminar diretamente o processo separado.

    
por 04.05.2017 / 20:11

Tags