대화형 bash 셸에서 다음 명령을 실행할 때:
$ curl ipinfo.io/ip
123.45.67.890
내가 만들 경우 /etc/cron.d/myjob
:
24 * * * * tim ( date && curl ipinfo.io/ip && date ) > /tmp/cron.log 2>&1
/tmp/cron.log에서 컬로부터 다음 모니터링 정보를 얻습니다.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
^M 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0^M100 14 100 14 0 0 147 0 --:--:-- --:--:-- --:--:-- 148
123.45.67.890
어떤 경우에는 컬에서 모니터링 정보를 얻을 수 있지만 다른 경우에는 얻을 수 없는 이유는 무엇입니까? 두 가지 상황은 무엇입니까? 감사해요.
답변1
차이점은 첫 번째 경우에는 터미널에 쓰는 것입니다.curl
맨페이지일정을 밝혔습니다.
기본적으로 컬은 이 데이터를 터미널에 표시하므로, 컬을 호출하여 작동하고 터미널에 데이터를 쓰려고 하면장애를 입히다진행률 측정기, 그렇지 않으면 출력 믹싱 진행률 측정기와 응답 데이터가 엉망이 됩니다.
진행률 표시기가 비활성화되지 않은 경우 curl
이를 stderr로 출력하고 다운로드한 데이터를 stdin으로 출력합니다. cron 작업에서는 둘 다 터미널이 아니며 둘 다 로 리디렉션되므로 /tmp/cron.log
둘 다 로그 파일에 표시됩니다.
curl
이 동작은 일반적인 사용 시나리오에서 "잘 작동" 하기 위한 것입니다 . 첫 번째 예와 같이 를 사용하여 curl
데이터를 검색하여 터미널에 출력하면 보이는 것은 데이터뿐입니다. 데이터를 검색하여 파일이나 파이프로 출력하는 데 을 사용하면 curl
터미널에 진행 정보가 표시됩니다.
cron 작업에서는 두 가지를 이중 리디렉션으로 혼합합니다 /tmp/cron.log
. 혼합된 출력을 보고 싶지 않은 경우 이 -s
옵션을 사용하여 진행률 표시기를 완전히 비활성화하거나 표준 오류를 다른 파일로 리디렉션할 수 있습니다.
24 * * * * tim ( date && curl -s ipinfo.io/ip && date ) > /tmp/cron.log 2>&1
또는
24 * * * * tim ( date && curl ipinfo.io/ip && date ) > /tmp/cron.log 2>/tmp/cron.err