Ctrl + c em um subprocesso está matando um processo nohup'ed anteriormente no script

13

Eu não sabia se isso pertencia ao SO (como é um bug de codificação), mas achei que vocês estariam mais bem informados sobre as sutilezas do software usado (então talvez até mesmo o U & L possa ser considerado).

Aqui está o script de código mínimo (veja as edições do script completo, há uma razão pela qual estou fazendo assim);

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

O que ele tenta fazer é executar um servidor em segundo plano, o que resulta em um arquivo de log.
Então eu follow esse arquivo de log usando less +F . Ao fazer isso, para sair disso, você deve pressionar ctrl + c antes de poder acertar Q .

O que acontece é que quando eu ctrl + c dentro do comando less (para parar tailing ) ele de alguma forma mata o servidor iniciado com nohup em o topo! Nada mais é afetado. Eu posso mudar + f para começar a rastrear o log novamente (o que não gera novas informações desde que o servidor é eliminado) e se eu pressionar Q resto do script é executado normalmente.

Você sabe por que isso acontece? Como evitá-lo / alguma outra coisa que eu deveria estar usando?

P.S.
O programa do servidor pode estar atento a um ^C , que pode ser o problema; há algo que eu possa fazer para parar isso? Como, quando eu executo o {SERVERCOMMAND} sozinho (de um modo de bloqueio), eu posso pressionar ctrl + c , que não o mata imediatamente; imprime Received ^C signal, shutting down (e depois se mata). Isso é o que acontece quando eu ^C in less (um% finalReceived ^C signal, shutting down é gravado no log).

P.P.S
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 ctrl + g fez exatamente o que o ^C estava fazendo de qualquer maneira (então isso pode ser um problema com meu emulador de terminal; konsole )

  • colocando a linha nohup & ou a linha less entre parênteses (para torná-la uma subshell)

  • executando o script em xterm em vez de konsole

por Hashbrown 30.01.2014 / 03:50

2 respostas

9

Eu estava certo em pensar que era SIGINT sendo enviado para todos os processos quando ctrl + c , mas eu era bobo em pensar que fazer outro processo traria fora do process group (veja minhas tentativas no P.P.S. ).

Este é, 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 encaixou na íntegra, esse é o roteiro agora;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

O servidor continua a enviar para o arquivo de log depois que eu ctrl + c em less .

Obrigado pelo tempo de todos.

    
por 31.01.2014 / 02:38
0

Você já tentou rejeitar ?

  disown -h %1

ou qualquer que seja seu trabalho; disown é um shell embutido, sua página man declara:

disown

disown [-ar] [-h] [jobspec ...]

Without options, each jobspec is removed from the table of active jobs. If the -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a' nor -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' option means to remove or mark all jobs; the '-r' option without a jobspec argument restricts operation to running jobs.

EDITAR

Engraçado, sua construção funciona no meu Arch Linux:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/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/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Antes do comando ps , eu tinha que rolar o arquivo out.log, então Ctrl + C , então q .

    
por 30.01.2014 / 05:17