Estou executando um programa de servidor de jogos (SRCDS) que ignora completamente o SIGTERM. A única maneira de desligar o servidor de forma limpa é digitar "quit" interativamente.
Existe alguma maneira de envolver este programa em um script bash que capture SIGTERM e envie "quit" para o STDIN do programa? Caso contrário, em operação normal, o wrapper deve encaminhar STDIN e STDOUT como se não existissem.
Diagrama do que estou tentando alcançar:
Operação normal:
--- STDIN ---> | | --- STDIN ---> | |
| Bash Script | | Server Program |
<-- STDOUT --- | | <-- STDOUT --- | |
SIGTERM enviado:
"quit"
--- STDIN ---> | | --- STDIN ---> | |
-- SIGTERM --> | Bash Script | | Server Program |
<-- STDOUT --- | | <-- STDOUT --- | |
Depende se esse programa espera ser executado a partir de um terminal. Se sim, eu não acho que você pode fazer em
bash
; você deve usar algo comoexpect
. Exemplo:wrapper.expect:
exemplo com bc:
A
kill 4771
de outra janela fará comexpect
que envie umaquit
linha parabc
. Observe que4771
é o pid doexpect
processo, não dobc
subprocesso.Outra opção seria usar o
TIOCSTI
ioctl para injetar aquit
linha no terminal atual; mas, novamente, você não poderá fazê-lo a partir do shell; você ainda precisa de algum pequeno programa C (ou perl, python, etc) apenas para chamar oioctl()
(eTIOCSTI
já foi destruído em sistemas como o OpenBSD).Tente isto:
Vou adicionar uma explicação mais completa se este script responder à sua pergunta