ping cron 작업이 cron 일정에서는 작동하지 않지만 명령줄에서는 작동합니다.

ping cron 작업이 cron 일정에서는 작동하지 않지만 명령줄에서는 작동합니다.

나는 이 크론을 예약했습니다:

0 * * * * ping -D -O -c 3492 8.8.8.8 | grep received > /home/user/.direc/packet_drops.txt

이 명령은 수동으로 실행할 때 제대로 작동하고 ping이 완료된 후 일반적으로 .txt 파일로 내보냅니다.

cron에서 실행하면 파일은 비어 있습니다. 동일한 사용자, 동일한 문제로 수동 명령과 cron을 시도했습니다.

내가 무엇을 놓치고 있나요? 또한 오류 출력을 리디렉션하려고 시도했지만 여전히 비어 있습니다.

답변1

귀하의 질문에 대한 설명에서 언급했듯이 파일을 볼 때 파일이 비어 있는 가능한 이유는 /home/user/.direc/packet_drops.txt다음에 cron 작업을 실행할 때 파일이 잘렸기 때문입니다.

파이프라인은 작업이 시작되자마자 설정되며 리디렉션은 초기 설정의 일부로 수행됩니다. ping매시간 시작하고 3492초 동안 실행되므로 packet_drops.txt잘리기 전에 (이론적으로) 시간당 108초의 읽기 창만 갖습니다.

장기 실행 작업이 종료될 때만 로그 파일을 덮어쓰는 방법(논평)는 출력을 임시 파일로 인쇄하고 작업이 끝나면 대상 파일을 바꾸는 것입니다.

보다 쉽게 ​​관리할 수 있습니다 script.

#!/bin/sh

trap 'rm -f -- "$tmpfile"' EXIT
tmpfile=$(mktemp)
ping -D -O -c 3492 8.8.8.8 | grep received >"$tmpfile"
cat -- "$tmpfile" >/home/user/.direc/packet_drops.txt

그리고 더 간단한 cron 작업을 정의합니다(실패할 가능성이 적으므로 디버그하기가 더 쉽습니다).

0 * * * * /path/to/script

awk또는 문장을 간결하게 유지하기 위해 파일 조작 기능을 활용할 수 있습니다 .

ping -D -O -c 3492 8.8.8.8 | awk -v file=/h..s.txt '/received/ { print >file }'

(이 코드 블록의 가독성을 위해 파일 이름이 단축되었습니다.)

이 AWK 스크립트는 여전히 출력 파일을 자르지만 received입력 데이터에서 줄 일치가 발견된 경우에만 그렇게 합니다.

답변2

Crontab에는 최소한의 환경 변수 세트가 있습니다. cronjob이 ping 또는 grep 명령을 찾지 못할 수 있습니다. 간단한 명령을 사용하여 cronjob에서 환경 변수를 확인할 수 있습니다.

* * * * * env &> /tmp/cron-env.txt

작업이 한 번 실행될 때까지 기다린 후 다시 삭제합니다. PATH 변수에 대한 출력을 검색하고 ping 및 grep 명령에 대한 경로가 포함되어 있는지 확인하십시오.

다음을 사용하여 이러한 명령의 경로를 찾을 수 있습니다.

whereis <command>

이를 포함하지 않으면 cronjob에 PATH 변수를 추가할 수 있습니다.

PATH=/bin:/usr/sbin:/usr/bin:/sbin:
* * * * * some-cron-job

관련 정보