Vários dos meus programas regulares travam (regularmente) com a mensagem "Sinal definido pelo usuário 1". Eu sei que existe um nohupcomando, mas existe um nousr1comando? Ou algo que fará algo parecido nohupcom o USR1?
Vários dos meus programas regulares travam (regularmente) com a mensagem "Sinal definido pelo usuário 1". Eu sei que existe um nohupcomando, mas existe um nousr1comando? Ou algo que fará algo parecido nohupcom o USR1?
Respostas:
Uma solução hacky simples para ter o utilitário análogo nohup, mas para SIGUSR1, seria obter uma cópia da fonte coreutils , descompactá-la,
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
, opcionalmente, também altere o nome do arquivo de saída
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, compile essa fonte e instale o nohupbinário recém-compilado para /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
Depois disso, como verifiquei, sleep 1000sai USR1, enquanto nousr1 sleep 1000está imune a esse sinal.
nohup, a propósito, é desassociar o processo do terminal para que ele não seja enviado SIGHUPem primeiro lugar. O fato de ele também configurar um manipulador de sinal é um bônus adicional, mas deve ser desnecessário.
signal(SIGHUP,SIG_IGN);chamada nohup.c, o processo receberá o SIGHUP. O nohupque, além de ignorar o sinal, é apenas reabrir os descritores stdin, stdout, stderr como arquivos não terminais. Realmente não desassocia o processo do terminal de nenhuma maneira especial. Ou seja, o processo será enviado SIGHUPquando o terminal desligar. Por outro lado, o bash, que faz o mesmo com o disowncomando, mas não tenho certeza de como ele é implementado - talvez da maneira que você quer dizer.
E o trapcomando interno do shell ?
trap 'echo "Thou shalt not USR1 me"' USR1
Você precisa usar o formulário do trapcomando com um argumento em branco. Tente o seguinte:
trap '' SIGUSR1; myprogram
Isso ignorará o sinal SIGUSR1, que é o que você está tentando fazer. Embora eu concorde com os comentaristas de que provavelmente há mais coisas acontecendo aqui do que aparenta.
A forma incorreta:
trap 'echo ...' SIGUSR1; myprogram
ainda permitirá myprogramreceber o SIGUSR1, mas o shell executará echoo trapcomando a partir do .
trap '' SIGUSR1; gvimdiff file1 file2e o Vim morreu com "Vim: Sinal mortal capturado USR1".