크론 환경에서 무언가를 실행하시나요?

크론 환경에서 무언가를 실행하시나요?

Cron은 STDERR에 작성된 모든 내용이 커널(또는 확실하지 않은 cron)이 SIGPIPE를 수신하도록 하는 방식으로 전송된 모든 프로그램을 실행합니다. 이 기능은 어떻게 작동하나요? cron이 SIGPIPE를 보내나요, 아니면 커널이 보내나요? cron에서 무언가를 실행하지 않고 어떻게 동일한 효과를 얻을 수 있습니까? 누군가 Perl 스크립트를 실행하는 방법을 말해 줄 수 있습니까?

#!/usr/bin/env perl
warn 'foo';
print "bar;

STDERR에 "foo"를 쓰려고 시도하고 "bar"를 쓰지 않을 때 SIGPIPE를 수신합니까? Perl이 종료되고 쉘 변수가 $?반환되는 것을 보고 싶습니다 255.

답변1

STDERR을 파이프의 쓰기 측으로 리디렉션한 다음 읽기 측을 닫으면 이를 수행할 수 있습니다.

#!/usr/bin/env perl
pipe R,STDERR;
close R;
warn 'foo';
print "bar";

답변2

"이 기능은 어떻게 작동하나요?"

당신이 설명하는 것은 실제 기능이 아니라 오해로 인한 기능 장애입니다. SIGPIPE를 보내는 것은 cron이 아니라 사용하는 방식입니다.

기본적으로 cron은 프로세스의 stdout 및 stderr을 crontab 소유자에게 이메일로 보냅니다.이메일을 보내(참고 man cron: MTA가 설치되어 있지 않으면 출력이 리디렉션되지 않는 한 삭제됩니다.) 이렇게 하려면 프로세스가 완료될 때까지 기다려야 합니다. 그러나 다음을 사용하여 프로세스를 백그라운드에 두는 경우 &:

* * * * * /bin/someprogram &

프로그램이 이제 stdout 또는 stderr에 쓰려고 하면 파이프가 손상되었기 때문에(읽기 끝이 닫힘) SIGPIPE를 수신하게 됩니다.[이는 MTA가 누락되고 출력이 많은 경우 이전 cron의 비백그라운드 프로세스에서도 발생할 수 있습니다.]

그래서 나는 당신의 crontab에 다음과 같은 것이 있다고 생각합니다.

* * * * * /bin/someprogram > log.file &

이는 stdout이 파일로 리디렉션되지만 stderr 파이프가 여전히 손상되었음을 의미합니다. 이는 잘못된 결론으로 ​​이어집니다."cron은 STDERR에 작성된 모든 내용이...SIGPIPE가 되는 방식으로 전송된 모든 프로그램을 실행합니다.".

&배경을 제거하거나 stderr를 리디렉션하여 crontab을 수정할 수도 있습니다 .

* * * * * /bin/someprogram 1>&2&> log.file &

네가 원한다면. WRT는 qqx가 말했듯이 이것을 직접 복제합니다. 파이프의 한쪽 끝을 닫고 쓰십시오.

관련 정보