Não há nohup, existe um comando nousr1?

12

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?

user2624632
fonte
3
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.

Ruslan
fonte
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.
Ruslan
Isso parece funcionar bem.
precisa saber é o seguinte
8

E o trapcomando interno do shell ?

trap 'echo "Thou shalt not USR1 me"' USR1 
Janne Pikkarainen
fonte
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 .

Adrian Pronk
fonte
Isso parece funcionar bem.
precisa saber é o seguinte
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
Mais informações aqui: stackoverflow.com/q/4515274/41861
Adrian Pronk
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.
precisa saber é o seguinte