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?
A melhor pergunta pode ser o que está enviando o sinal usr1 em primeiro lugar? Se nada for, a mensagem de saída pode simplesmente ser enganosa.
Grant
2
Parece que você pode ter alguns problemas sérios nos seus "programas regulares" ... simplesmente desabilitar os sinais pode não corrigir ou permitir que os aplicativos subjacentes funcionem corretamente. Eu sugiro fortemente que você examine seu ambiente cuidadosamente antes de desabilitar as coisas.
Mdpc
@ Granant: eu concordo. Existe um utilitário que pode me dizer o que está enviando esses sinais?
user2624632
Respostas:
3
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.
A principal funcionalidade de 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.
Simon Richter
@SimonRichter Se você remover a 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.
Boa ideia, mas não funcionou. O processo foi encerrado de qualquer maneira com "Sinal definido pelo usuário 1".
user2624632
Manipuladores de sinal (que não sejam SIG_IGN e SIG_DFL) não são herdados por processos filhos.
aecolley 16/08/14
2
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 .
Opa, eu falei cedo demais. Eu estava correndo trap '' SIGUSR1; gvimdiff file1 file2e o Vim morreu com "Vim: Sinal mortal capturado USR1".
user2624632
Hmmm, olhando o código-fonte em code.google.com/p/vim/source/browse/src/os_unix.c parece que o VIM reativa o sinal USR1 e o trata como um erro fatal. Sua única esperança seria se você pudesse fazer com que o sistema operacional se recusasse a emitir o sinal USR1. Não sei se há algo por aí que possa fornecer essa funcionalidade.
Adrian Pronk: não é apenas o Vim; também é Firefox, Aqualung, Thunderbird e outros. Mas não outros aplicativos, como o Konsole, que funcionam para sempre.
Respostas:
Uma solução hacky simples para ter o utilitário análogo
nohup
, mas paraSIGUSR1
, seria obter uma cópia da fonte coreutils , descompactá-la,, opcionalmente, também altere o nome do arquivo de saída
, compile essa fonte e instale o
nohup
binário recém-compilado para/usr/bin/nousr1
:Depois disso, como verifiquei,
sleep 1000
saiUSR1
, enquantonousr1 sleep 1000
está imune a esse sinal.fonte
nohup
, a propósito, é desassociar o processo do terminal para que ele não seja enviadoSIGHUP
em 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);
chamadanohup.c
, o processo receberá oSIGHUP
. Onohup
que, 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á enviadoSIGHUP
quando o terminal desligar. Por outro lado, o bash, que faz o mesmo com odisown
comando, mas não tenho certeza de como ele é implementado - talvez da maneira que você quer dizer.E o
trap
comando interno do shell ?fonte
Você precisa usar o formulário do
trap
comando com um argumento em branco. Tente o seguinte: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:
ainda permitirá
myprogram
receber o SIGUSR1, mas o shell executaráecho
otrap
comando a partir do .fonte
trap '' SIGUSR1; gvimdiff file1 file2
e o Vim morreu com "Vim: Sinal mortal capturado USR1".