Qual sinal (processo) recebe após a saída da shell principal?

0

Esta é uma pergunta do Zshell, embora o Bash, se tiver a sintaxe do > (comando) (ou seja, a substituição do processo desse tipo), também possa sugerir uma solução. Este código realmente básico explica tudo:

% fun() {
   setopt localtraps
   trap "echo waiting >> /tmp/out; sleep 2; echo bye >> /tmp/out; exit 1;" EXIT
   echo "My PID: $sysparams[pid]"  # needs zsh/system module
   repeat 1000; do
      read -r -t 1 line
   done
}

% exec {MYFD}> >(fun)
% exit

Acima de trabalhos - fun () receberá a armadilha, as duas mensagens aparecerão em / tmp / out e "exit 1" fecharão o processo.

Minha pergunta: pode ser "EXIT" substituído por algum sinal real? Eu tentei o PIPE, HUP, INT, TERM e eles não funcionaram.

    
por Digger 11.05.2018 / 17:24

2 respostas

1

Seu código não explica tudo. Não tenho ideia do que você está tentando fazer. No entanto, posso responder a pergunta em seu título: o processo >(…) não recebe um sinal quando o shell principal sai. Ele sai porque chega ao final do script e, nesse momento, executa a EXIT trap até que execute o exit builtin.

Se você pensou que o script está sendo morto antecipadamente porque achou que as chamadas read -t 1 levariam um segundo cada: não, elas não retornam imediatamente assim que o pai sai. Quando o pai sai, as chamadas read na subshell estão tentando ler de um canal fechado, e a chamada do sistema read subjacente retorna imediatamente sem dados disponíveis.

    
por 12.05.2018 / 00:20
0

De acordo com os manuais para bash e zsh , sim, você pode, de fato, trap de qualquer sinal.

bash :

   trap [-lp] [[arg] sigspec ...]
          The command arg is to be read and executed when the shell receives signal(s) sigspec.  If arg is absent (and there is a single sigspec) or  -,  each  specified  signal  is
          reset  to  its  original disposition (the value it had upon entrance to the shell).  If arg is the null string the signal specified by each sigspec is ignored by the shell
          and by the commands it invokes.  If arg is not present and -p has been supplied, then the trap commands associated with each sigspec are displayed.  If  no  arguments  are
          supplied  or  if  only -p is given, trap prints the list of commands associated with each signal.  The -l option causes the shell to print a list of signal names and their
          corresponding numbers.  Each sigspec is either a signal name defined in <signal.h>, or a signal number.  Signal names are case insensitive and the SIG prefix is  optional.

zsh :

   trap [ arg ] [ sig ... ]
          arg is a series of commands (usually quoted to protect it from immediate evaluation by the shell) to be read and executed when the shell receives any of the signals speci-
          fied by one or more sig args.  Each sig can be given as a number, or as the name of a signal either with or without the string SIG in front (e.g. 1, HUP,  and  SIGHUP  are
          all the same signal).
    
por 11.05.2018 / 17:32