cron에서 wget 출력을 / dev / null로 출력


38

Pronion 승객을 유지하기 위해 crontab에서 5 분마다 다음 명령을 실행하고 있습니다.

*/5 * * * * wget mysite.com > /dev/null 2>&1

내가 이것을 실행하면 사이트 URL에서 wget을 수행하여 STDOUT / STDERR을 / dev / null로 라우팅합니다. 커맨드 라인에서 이것을 실행하면 정상적으로 작동하며 내 홈 디렉토리에 index.html 파일을 생성하지 않습니다.

cron에서 실행될 때 5 분마다 새로운 index.html 파일을 생성하여 원하지 않는 수많은 색인 파일을 남겨 둡니다.

cron 작업을 실행하는 데 구문이 올바르지 않습니까? 커맨드 라인에서 문제없이 작동하지만 cron에서는 내 홈 디렉토리에 index.html 파일을 생성합니다.

나는 간단한 실수를하고 있다고 확신합니다. 누군가 도울 수 있다면 그것을 고맙게 생각할 것입니다.


1
또 다른 질문은 명령 행에서 직접 실행할 때 파일이 작성되지 않는 이유입니다. 문서에서 알 수 wget있는 한 터미널에서 실행 하는 것과 다른 방법으로 진행률 표시 줄이 표시되는지 여부 만 다릅니다 .
Barmar

답변:


61

다음과 같이 할 수 있습니다.

*/5 * * * * wget -O /dev/null -o /dev/null example.com

여기 -O다운로드에 파일을 전송 /dev/null하고 -o로그를 /dev/null대신 표준 에러의. 그렇게하면 리디렉션이 전혀 필요하지 않습니다.


1
감사합니다. STDERR / STDOUT으로 리디렉션하는 것보다 직접적입니다. 감사합니다.
nulltek

17

실제로 내용을 다운로드하거나 200 OK 만 받으시겠습니까? 서버가 요청을 처리하도록해야하는 경우 단순히 --spider인수 를 사용하지 않는 이유는 무엇입니까?


좋은 생각입니다. 실제로 200 OK 응답 만 필요합니다.
nulltek

나는 편견이없는 누군가가 지적하기를 바랐지만 ... 어느 솔루션을 사용하게 되었습니까? 내 대답은 정말 올바른 방법입니다 :)
Nacht-Reinstate Monica

10

다음을 사용합니다.

/5 * * * * wget -O - mysite.com > /dev/null 2>&1

-O -옵션은 가져온 컨텐츠가 stdout으로 전송되도록합니다.


4
참고 foo > /dev/null 2>&1더 간결로 기록됩니다 foo &> /dev/null.
amalloy

3
@amalloy 만 해당됩니다 bash. 에서 shcron이 일반적으로 사용하는에서 앰퍼샌드 리디렉션은 작동하지 않습니다.
Soviero

5

당신은 코멘트에 "200 OK"응답 만 필요하다고 말합니다.

이것에 비해 몇 가지 추가적인 장점이있는 솔루션이 가능합니다
wget -O /dev/null -o /dev/null example.com. 아이디어는 어떤 식 으로든 출력을 버리지 않고 출력을 전혀 만들지 않는 것입니다.

응답 만 필요하다는 것은 로컬 파일 index.html로 다운로드 한 데이터를 먼저 다운로드 할 필요가 없음을 의미합니다.
HTTP 프로토콜에서 'GET'명령 은 문서다운로드하는 데 사용됩니다 . 실제로 문서를 다운로드하는 것을 제외한 모든 작업을 수행하는 방식으로 문서에 액세스하려면 특수 명령 'HEAD'가 있습니다.
이 작업에 'GET'을 사용하면 문서가 로컬로 다운로드되어 삭제됩니다. 'HEAD'를 사용하면 필요한 작업 만 수행 할 수 있으며 처음에는 문서를 전송하지 않습니다. 정의에 따라 항상 'GET'과 동일한 결과 코드를 반환합니다.

방법을 사용하는 구문 HEAD과는 wget조금 이상하다 : 우리는 옵션을 사용합니다 --spider. 이러한 맥락에서 우리는 원하는 것을 수행합니다. 'GET'대신 'HEAD'로 URL에 액세스하십시오.
옵션 -q(quiet)을 사용하여 기능 wget에 대한 세부 사항을 출력하지 않을 수 있습니다.

그것을 결합하면 wgetstderr에 아무것도 출력하지 않으며 문서를 저장하지 않습니다.

wget -q --spider 'http://example.com/'

종료 코드는 요청의 성공 여부를 알려줍니다.

$ wget -q --spider 'http://example.com/'
$ echo $?
0
$ wget -q --spider 'http://example.com/nonexisting'
$ echo $?                                          
8

의 명령에서 crontab두 경우 모두 출력이 없다는 사실은 다시 출력을 표시하지 않고 오류 표시를 사용할 수 있음을 의미합니다.

예제 명령이 다음과 같이 변경됩니다.

*/5 * * * * wget -q --spider mysite.com

이것과 같은 장점이 있습니다 wget -O /dev/null -o /dev/null example.com. 추가적인 이점은 로그 출력 및 문서 출력이 로컬에서 생성 및 삭제되지 않고 생성되지 않는다는 것입니다. 또는 큰 차이점은 문서를 다운로드 한 다음 폐기하지 않는 것 index.html입니다.


나는이 접근법도 좋아합니다. 귀하의 의견과 답변에 감사드립니다.
nulltek

3

Phusion 승객을 살리기 위해

귀하의 질문이 이것에 관한 것이기를 바랍니다.

빠르고 강력한 웹 서버 및 애플리케이션 서버

keepalive 스크립트가 필요하지 않습니다.

그렇지 않으면 kasperd의 솔루션이 완벽합니다.


매우 건설 적이지는 않지만 피드백에 감사드립니다. 일반적으로 컨테이너 결함은 아니지만 응용 프로그램 서버가 실패합니다.
Felix Frank

1
나는 그것을 유지하기 위해 어떤 cronjob이 필요하지 않아야한다는 것에 동의합니다. 그러나 Nginx / Passenger 튜닝을 연구하는 동안 빠른 수정이었습니다. 실제로 / dev / null로 출력하는 가장 좋은 방법을 찾고있었습니다. 짐이 없을 때 한 번에 승객이 실패하거나 2 분 동안 멈췄으므로 URL을 요청하면 승객이 계속 해고됩니다.
nulltek

1
wget명령에 의해 살아남는 것이 무엇인지 이해하는 것이 좋습니다 . 많은 상황에서 메시지를 유지해야 할 필요성은 수정해야하는 근본적인 디자인 결함의 증상입니다. 그러나이 모든 것이 고쳐지더라도 Keep Alive 메시지가 올바른 솔루션 인 몇 가지 사례가 남아 있습니다. 연결 유지 메시지가 필요하지 않더라도 cron 작업은 여전히 ​​모니터링 설정의 유용한 부분이 될 수 있습니다.
kasperd

이것은 답변보다 의견으로 더 좋습니다.
moopet
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.