크론 작업을 수동으로 실행/크론 작업 실행을 시뮬레이션하시겠습니까? [복사]

크론 작업을 수동으로 실행/크론 작업 실행을 시뮬레이션하시겠습니까? [복사]

작업을 실행한 후 크론 메일 전송이 작동하는지 테스트하고 싶습니다. 이것을 테스트한 다음 몇 초마다 실행되도록 cron 작업을 설정하는 더 우아한 방법이 있습니까? 그렇다면 cron 작업 실행을 시뮬레이션하거나 cron 작업을 수동으로 시작하지만 cron이 자동으로 실행될 때와 동일한 동작을 수행할 수 있는 방법이 있습니까?

답변1

명령줄에서 cron 작업을 실행하는 것과 cron 내부에서 cron 작업을 실행하는 것의 주요 차이점은 환경입니다. 다른 잠재적인 차이점으로는 현재 디렉터리, 터미널 가용성, 사용된 셸 등이 있습니다.

이것은 cron을 통해 cron 작업을 실행하는 매우 정확한 시뮬레이션입니다. 셸로 인한 차이를 방지하려면 작업을 스크립트에 넣고 스크립트 경로만 crontab에 입력하세요. cron이 전달하는 환경 변수의 정확한 설정과 값은 구현에 따라 다릅니다. crontab(5)시스템의 매뉴얼 페이지를 확인하세요. ifne입력이 수신되면 인수에 지정된 명령을 실행하는 명령입니다.더 많은 유틸리티.

env -i HOME="$HOME" LOGNAME="$LOGNAME" PATH=/usr/bin:/bin SHELL=/bin/sh USER="$USER" \
    /path/to/script </dev/null 2>&1 |
ifne mail -r "Cron Daemon" -s "Cron <$USER@$(hostname)> /path/to/script" "$USER"

cron과 유사한 설정을 만드는 또 다른 방법은 다음과 같습니다.at. 하지만 프로세스에서 받은 환경 변수를 at사용하여 명령을 실행하는 역할을 담당하므로 이 부분은 여전히 ​​모의 작업이 필요합니다.at

echo /path/to/script |
env -i HOME="$HOME" LOGNAME="$LOGNAME" PATH=/usr/bin:/bin SHELL=/bin/sh USER="$USER" \
    at now

답변2

몇 년 전에 만들었지만 최근에 실패하기 시작한 스크립트의 크론 실행을 시뮬레이션하는 방법은 다음과 같습니다.

나는 다음과 같은 스크립트를 만들었습니다 dumpenv.

#!/bin/sh

base=$(basename $0)

env -0 > /tmp/$base.$$.dump

그러면 모든 환경 변수가 /tmp/.

*/1 * * * *  [path to newly created script]

이로 인해 스크립트가 1분마다 실행됩니다. 1분 후 cron이 실행하는 작업에서 본 환경 덤프를 얻었습니다. crontab 라인이 1분 이상 실행되면 파일 이름의 pid 부분( $$)만 다른 이름을 가진 동일한 파일 묶음을 생성합니다. 그것은 큰 문제가 아닙니다. 이 가능성에 대해 코딩하여 하나의 파일만 얻을 수 있지만 여기서의 주요 원칙은 "충분히 좋다"는 것이며 dumpenv여러 덤프가 유용한 다른 상황에서 이를 사용 하고 싶을 수도 있습니다 . 어쨌든, 추가된 crontab 라인을 제거하여 /tmp많은 쓰레기 로 채워지는 것을 방지하는 것이 좋습니다 .

/tmp/command그런 다음 실행하려는 명령이 한 줄에 포함된 추가 파일을 만들었습니다.널 문자로 종료합니다.널 문자가 필요합니다.

그런 다음 다음을 발행합니다.

cat [path to dumpfile crated earlier] /tmp/command | xargs -0 -x env -i

이는 cron에서 명령을 실행할 때 표시되는 오류를 복제합니다. 이것이 수행하는 작업은 xargs다음 형식의 명령을 작성하는 것입니다.

env -i [list of environment variables] [command to execute]

실행해 보세요. 환경 변수 목록은 덤프 파일에서 가져옵니다. 실행되는 명령은 파일 env에서 나옵니다 ./tmp/command

위에서 언급한 및 필수 null 문자에 대한 인수는 -0변수를 전달할 때 환경 손상을 방지하기 위한 것입니다. 환경에 개행 문자가 포함된 환경 변수가 없으면 스크립트 및 명령 호출에서 이를 생략할 수 있으며 파일에는 줄 종결자로 널 문자가 필요하지 않습니다.envxargs-0envdumpenvxargs/tmp/command

xargs가 자동으로 stdin을 /dev/null로 리디렉션했기 때문에 명시적으로 stdin을 /dev/null로 리디렉션하지 않았습니다. 또한 stdout/stderr를 리디렉션하는 데 신경 쓰지 않으며 명령이 실패할 때 이메일을 받고 싶지도 않습니다. 이러한 기능이 필요한 경우 Giles의 답변은 이를 구현하는 방법을 제공합니다.

답변3

루이스의 대답중대하다. 나는 몇 가지 가능한 개선점을 제안했습니다.

/tmp/command다음 코드에서 Louis가 제안한 대로 실행할 스크립트의 경로가 포함된 파일을 생성하지 마세요.

cat [path to dumpfile crated earlier] /tmp/command | xargs -0 -x env -i

대신 다음 대안을 통해 명령에서 직접 스크립트 이름을 지정할 수 있습니다( \x00cron 스크립트 경로에 추가하는 것이 필수적입니다.)

printf "/path/to/cron/script\x00" | cat /path/to/dumpfile/created/earlier - | xargs -0 -x env -i

이렇게 하면 파일을 만들 필요가 없습니다 /tmp/command.

관련 정보