Não há uma maneira limpa de fechar um arquivo aberto (porta de rede ou outro) em um aplicativo que não o espera.
Existe uma maneira de fechar o arquivo sob seu nariz, mas o aplicativo pode não reagir bem. Há uma boa chance de que isso colida, o que derrotaria o propósito. Você pode executar uma chamada do sistema em um processo remoto com a ptrace
chamada do sistema. Use lsof
ou netstat
para encontrar o descritor de arquivo no qual você está interessado. Em seguida, anexe seu depurador favorito ao processo em questão e execute uma chamada de sistema close
(ou shutdown
).
#!/bin/sh
# Usage: shutdown-in-process PID FD
gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call close($2)
detach
quit
EOF
Como isso tem uma boa chance de travar o aplicativo, porque sua interface com o ambiente não corresponderá mais à sua estrutura de dados interna, considere outras abordagens. Em particular, se o propósito é ter uma aplicação diferente ouvindo em uma porta UDP ou TCP, você poderia redirecionar o tráfego para uma porta diferente no nível da camada de rede ( iptables
no Linux, pfctl
no BSD,…) .