Como interromper o programa ininterrupto?

1

Se eu executar mysqld na linha de comando, ele exibirá algumas mensagens de inicialização e, em seguida, pára de responder. Não produz saída e ignora qualquer entrada, e parece não haver maneira de se livrar dela. ctrl + z e ctrl + c não fazem nada, não há como voltar a um terminal - tenho que iniciar uma nova sessão. Isto significa, por exemplo, se eu estou conectando a um servidor via ssh eu tenho que iniciar uma nova conexão ssh.

Isso é muito chato. Existe alguma maneira no bash para dizer-lhe para desativar o processo em execução no momento? Qualquer outro programa que eu possa suspender com ctrl + z, mas não com o mysqld, embora eu não saiba por quê. Se eu começar com mysqld & , ele será executado em segundo plano e eu posso enviar sinais para ele normalmente, contanto que eu não cometa o erro de digitar fg , e ele funcione como um processo comum, então eu não sei porque ctrl + z não tem efeito sobre isso, já que eu pensei que era parte do bash ao invés de estar sob o controle do processo.

Então: Existe uma alternativa para ctrl + z, para quando ctrl + z não funciona?

    
por Benubird 15.07.2015 / 09:57

2 respostas

0

O Ctrl + Z é na verdade um recurso da interface do terminal genérica no kernel, não do bash. Isso faz com que um sinal SIGTSTP seja enviado para o processo de primeiro plano. Da mesma forma Ctrl + C envia SIGTERM e Ctrl + \ envia SIGQUIT.

Existem duas maneiras pelas quais um programa pode fazer com que Ctrl + Z perca seu efeito.

  • O programa pode ignorar o sinal SIGTSTP.
    Você pode verificar o comportamento do sinal de um processo com um depurador. No Linux, a informação está disponível através de /proc : grep Sig /proc/1234/status onde 1234 é o ID do processo mostra quais sinais são ignorados ( SigIgn , eles apenas são devolvidos inofensivamente) ou bloqueados ( SigBlk , eles são colocados em espera até que o programa os deixe entrar). O número é um bitmask e escrito em hexadecimal. SIGTSTP é o sinal 20 (execute kill -l no bash), então é ignorado se na linha SigIgn , o quinto dígito da direita é 8 ou acima.
  • O programa pode alterar as combinações de teclas.
    Você pode verificar as associações de teclas atuais com uma linha de comando como stty -a </dev/pts/42 , em que /dev/pts/42 é o terminal em que o processo está em execução. Procure por susp = ^Z .

Um daemon provavelmente ignorará a maioria dos sinais. Lance-o em segundo plano, se ele não for bifurcado por si só (a maioria dos daemons realmente bifurca um filho assim que ele inicia e deixa o pai imediatamente). Se você o lançou em primeiro plano, existem muitas maneiras de se recuperar (envie um sinal para ele ou para o shell pai), mas você precisará de outro shell para isso.

    
por 16.07.2015 / 02:29
2

O comando stty -a mostrará todos os atalhos de teclado no seu terminal atual. Geralmente, em sistemas semelhantes ao Unix, os únicos sinais mapeados são Ctrl + C (SIGINT), Ctrl + \ (SIGQUIT) e Ctrl + Z (SIGTSTP). Não há outras ligações para outros sinais e, portanto, nenhum outro sinal que você possa enviar dentro de sua sessão atual com o teclado.

Em geral, o% final% co_de no nome do programa geralmente indica "daemon". Os daemons têm a intenção de rodar em segundo plano e operar através de outros meios além de stdin / out (como canos, sinais, soquetes ...). Isso significa que poderia ser que você obtém um comportamento inesperado quando o próprio programa não está sendo executado em segundo plano (como o terminal parece "travar", porque o daemon fez algo na entrada, saída ou está fazendo algo / esperando em um loop)

Em geral, também pode ser que o daemon tenha armadilhas para sinais específicos e as manipule de forma diferente (ou até as ignore). Você tentou enviar SIGINT ( d , equivalente a Ctrl + C ), SIGQUIT ( kill -2 , equivalente a Ctrl + < kbd> \ ), ou SIGTSTP ( kill -3 , equivalente a Ctrl + Z ) durante a execução de kill -20 em background, apenas para testes?

EDITAR: Para alterar mysqld mappings, você precisará escrever:

stty <action> <new-mapping>

Por exemplo, para remapear SIGINT para Ctrl + X

stty intr ^x

Observe que esta configuração só é válida no terminal atual durante a sessão atual.

    
por 15.07.2015 / 10:29