Você pode fazer isso redirecionando STDERR para o fim de gravação de um canal e, em seguida, fechando o final de leitura:
#!/usr/bin/env perl
pipe R,STDERR;
close R;
warn 'foo';
print "bar";
O Cron executa qualquer programa que lhe seja enviado de tal maneira que qualquer coisa escrita no STDERR faça com que o kernel (ou o cron I'm insure) receba o SIGPIPE. Como esta funcionalidade funciona? O cron está enviando o SIGPIPE ou é o kernel? Como posso obter o mesmo efeito, sem executar algo no cron? Alguém poderia me dizer, por exemplo, como executar um script Perl tal que
#!/usr/bin/env perl
warn 'foo';
print "bar;
Recebe um SIGPIPE quando tenta escrever 'foo' para STDERR e nunca escreve 'bar'? Eu quero ver Perl terminar e shell variável $?
return 255
.
Você pode fazer isso redirecionando STDERR para o fim de gravação de um canal e, em seguida, fechando o final de leitura:
#!/usr/bin/env perl
pipe R,STDERR;
close R;
warn 'foo';
print "bar";
"How does this functionality work?"
O que você está descrevendo não é realmente funcionalidade, é disfuncionalidade causada por um equívoco. Não é o cron que envia o SIGPIPE, mas é pelo jeito que você está usando.
Por padrão, o cron envia por e-mail a stdout e stderr de um processo para o dono do crontab usando sendmail (veja man cron
; se você não tiver um MTA instalado, a saída será descartada) ), a menos que sejam redirecionados. Para fazer isso, ele deve aguardar a conclusão do processo. No entanto, se você tiver feito o segundo plano do processo com &
:
* * * * * /bin/someprogram &
Ele não irá esperar, e se o programa agora tentar escrever para stdout ou stderr, ele terá um SIGPIPE, porque o pipe está quebrado (a extremidade de leitura foi fechada). [Isso também pode acontecer com um processo que não seja em segundo plano em versões antigas, se o seu MTA estiver faltando e você tiver muitos resultados]
Então, eu acho que você tem algo parecido com isso no seu crontab:
* * * * * /bin/someprogram > log.file &
O stdout é redirecionado para um arquivo, mas o stderr ainda está quebrado. Isto levou você à conclusão errônea de que o "cron executa qualquer programa que lhe seja enviado de tal forma que qualquer coisa escrita para STDERR cause ... SIGPIPE" .
Você pode consertar seu crontab removendo o background &
ou redirecionando o stderr também:
* * * * * /bin/someprogram 1>&2&> log.file &
Se você quiser. WRT duplicando isso sozinho, como diz o qqx, apenas feche uma extremidade de um pipe e, em seguida, escreva para ele.