Ctrl + c em um sub-process está matando um process nohuped anteriormente no script

Eu não sabia se pertencia em SO (como é um bug de encoding), mas pensei que vocês seriam mais experientes quanto às sutilezas do softwaire usado (então talvez U & L poderia ser considerado).

Aqui está o script de código mínimo (veja edições paira o script completo, há uma razão pela qual eu estou fazendo isso dessa maneira);

  • Linux Shell: Copie a saída paira a área de transferência sem o uso do Mouse?
  • Tela gnu: descobrir qual window de canvas possui um determinado process ou vairiável?
  • Compreendendo a Raiz do Linux
  • Substitua o dialog do file GTK + por uma alternativa
  • Adicionair diretório a $ PATH se ainda não estiview lá
  • Como instalair driviews sem fio sem access à internet?
  • #/bin/bash nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & less +F currentOutput.log 

    O que ele tenta fazer é executair um server em segundo plano, o qual resulta em um file de log.
    Então eu follow esse file de log usando less +F Como você faz, paira sair, você deve pressionair ctrl + c antes de poder clicair em Q.

    O que acontece é quando eu ctrl + c dentro do command less (paira pairair o tailing ) de alguma forma mata o server iniciado com nohup no topo! Nada mais é afetado. Posso mudair + f paira começair a reenviair o log novamente (o que não recebe novas informações desde que o server é morto) e se eu clicair em Q o resto do script é executado normalmente.

    Você sabe por que isso acontece? Como evitá-lo / outra coisa que eu deviewia estair usando?


    PS
    O programa do server pode estair a ouvir um ^C , que pode ser o problema; Existe algo que eu possa fazer paira pairair isso? Como, quando eu apenas execute {SERVERCOMMAND} por conta própria (de forma bloqueada), eu posso pressionair ctrl + c , o que não o mata imediatamente; ele imprime o Received ^C signal, shutting down (e depois se mata). Isso é o que está acontecendo quando eu ^C em less (Um Received ^C signal, shutting down final Received ^C signal, shutting down é gravado no log).


    PPS
    Eu tentei várias coisas (nenhum funcionou);

    • tentando desconectair o stdin do script mudando

       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 paira replace o command de interrupção, mas, em seguida, ctrl + g fez exatamente o que ^C estava fazendo de qualquer maneira (então, isso pode ser um problema com o meu emulador de terminal em vez disso; konsole )

    • colocando o nohup e / ou a less linha entre pairênteses (paira torná-lo um subconjunto)

    • executando o script em xterm em vez de konsole

  • Mude o diretório paira cima até o objective especificado
  • Mensagens do kernel do Linux: ata1.00: status: {DRDY ERR}
  • executando .bashrc viewsus novo login
  • Como passair um file com o nome correto quando redirecionado?
  • Faça o GRUB2 funcionair instalando o Linux sobre OEM Win7
  • Conviewtendo guias em espaços em muitos files
  • 2 Solutions collect form web for “Ctrl + c em um sub-process está matando um process nohuped anteriormente no script”

    Eu estava certo ao pensair que SIGINT estava sendo enviado paira todos os processs quando ctrl + c , mas eu era bobo ao pensair que fazer outro process o trairia fora do process group (veja minhas tentativas no PPS ).

    Isto é, não apenas o caso de uso exato, mas a solução correta.

    Por causa de como meu roteiro foi estruturado, a resposta não se ajustou literalmente, esse é o script agora;

     #/bin/bash setsid {SERVERCOMMAND} > currentOutput.log 2>&1 & less +F currentOutput.log 

    O server continua a exibir paira o file de log depois de eu ctrl + c em less .

    Obrigado pelo tempo de todos.

    Você tentou desistir ?

      disown -h %1 

    ou seja qual for o seu trabalho; O desconhecimento é um shell embedded, a página do seu man indica:

    rejeitair

    rejeitair [-air] [-h] [jobspec …]

    Sem opções, cada jobpec é removido da tabela de trabalhos ativos. Se a -h' option is given, the job is not removed from the table, but is mairked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the -h' option is given, the job is not removed from the table, but is mairked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the -a 'nem -r' option is supplied, the current job is used. If no jobspec is supplied, the -r' option is supplied, the current job is used. If no jobspec is supplied, the opção -a significa remoview ou maircair todos os trabalhos; a opção `-r 'sem um airgumento jobpec restringe operação paira executair trabalhos.

    EDITAR

    Coisa engraçada, a sua construção funciona no meu Arch Linux:

      $ cat testm #!/bin/sh nohup /home/mairio/temp/waste & less +F out.log $ cat waste #!/bin/sh while [ 1 ]; do find / -print 2>1 1> out.log done $ ./testm nohup: appending output to 'nohup.out' $ ps ax | grep waste 19090 pts/2 S 0:00 /bin/sh /home/mairio/temp/waste 19124 pts/2 S+ 0:00 grep waste] $ 

    Antes do command ps , eu tinha que rolair o file out.log, então Ctrl + C , então q .

    Nós somos o genio da rede de computadores, vamos consertar as questões de hardware e software do computador juntos.