Executando algo em um ambiente cron?

1

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 .

    
por Evan Carroll 07.03.2013 / 21:46

2 respostas

3

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";
    
por 07.03.2013 / 21:57
3

"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.

    
por 07.03.2013 / 22:09

Tags