Eu não sabia se isso pertencia ao SO (como é um bug de codificação), mas pensei que vocês teriam mais conhecimento sobre as sutilezas do software usado (então talvez até o U&L possa ser considerado).
Aqui está o script de código mínimo (veja as edições para o script completo, há uma razão para eu fazer dessa maneira);
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
O que ele tenta fazer é executar um servidor em segundo plano, que gera um arquivo de log.
Então eu follow
que arquivo de log usando less +F
. Ao sair, você deve pressionar ctrl+ cantes de pressionar Q.
O que acontece é que, quando eu ctrl+ cdentro do less
comando (para parar tailing
), de alguma forma, mata o servidor iniciado nohup
no topo! Nada mais é afetado. Eu posso shift+ fcomeçar a ajustar o log novamente (que não recebe novas informações desde que o servidor foi morto) e se eu clicar Qno restante do script, ele será executado normalmente.
Você sabe por que isso acontece? Como evitá-lo / outra coisa que eu deveria estar usando?
PS
O programa do servidor pode estar ouvindo um ^C
, que pode ser o problema; Existe algo que eu possa fazer para impedir isso? Por exemplo, quando apenas corro {SERVERCOMMAND}
por conta própria (de maneira bloqueadora), posso pressionar ctrl+ c, o que não mata imediatamente; ele imprime Received ^C signal, shutting down
(e depois se mata). Isto é o que está acontecendo quando eu ^C
no less
(A última Received ^C signal, shutting down
é gravado no log).
PPS
Eu tenho tentado várias coisas (nenhuma funcionou);
tentando desconectar o stdin do script alterando
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
usando
stty intr ^G
para substituir o comando de interrupção, mas, em seguida, ctrl+ gfez exatamente o que^C
estava fazendo de qualquer maneira (de modo que este pode ser um problema com o meu emulador de terminal em vez;konsole
)colocando o
nohup
& / ou aless
linha entre parênteses (para torná-lo um subshell)executando o script em
xterm
vez dekonsole
I think it is due to the handling within the database software, not on the shell
. Como um programa faria isso? Como, então, posso parar com isso?nohup
impede que o processo recebaSIGHUP
sinal enquanto CTRL + C enviaSIGINT
sinal. É por issonohup
que não tem o efeito que você esperava.Respostas:
Eu estava certo ao pensar que estava
SIGINT
sendo enviado a todos os processos quando ctrl+ c, mas fui bobo ao pensar que fazer outro processo o traria de fora doprocess group
(veja minhas tentativas noP.P.S.
).Este é, não apenas o caso de uso exato, mas a solução correta.
Por causa de como meu script foi estruturado, a resposta não se encaixava literalmente, este é o script agora;
O servidor continua a saída para o arquivo de log após I ctrl+ cno
less
.Obrigado pelo tempo de todos.
fonte
Você já tentou renegar ?
ou seja qual for o seu trabalho; disown é um shell embutido, sua página de manual afirma:
EDITAR
Engraçado, sua construção funciona no meu Arch Linux:
Antes do comando ps , eu tinha que rolar o arquivo out.log Ctrl+C, então q.
fonte
nohup
linha em uma função que pordisowns
si só, mas deveria ser a mesma quenohup
. Eu não acho que este é umSIGHUP
problema, pois quando eu remover aless
linha, o script termina com o servidor ainda está em execução