일정을 변경하는 것 외에 매일 실행되도록 예약된 cron 작업이 있습니다. 명령이 예상대로 실행되는지 즉시 테스트할 수 있는 다른 방법이 있습니까?
편집: (의견에서) 쉘(내 쉘)에 입력하면 명령이 제대로 작동한다는 것을 알고 있지만 cron이 실행할 때 제대로 작동하는지 궁금합니다. ENV 또는 쉘 특정 항목(~ 확장자)의 영향을 받을 수 있습니다. 또는 소유권 및 라이선스 관련 또는...
답변1
다음 명령을 사용하여 crontab을 강제로 실행할 수 있습니다.
run-parts /etc/cron.daily
답변2
다음에 설명된 대로 cron 사용자 환경을 시뮬레이션할 수 있습니다."지금 크론 작업을 수동으로 실행하세요". 이를 통해 cron 사용자로 실행될 때 작업이 어떻게 작동하는지 테스트할 수 있습니다.
링크에서 발췌:
1 단계:나는 일시적으로 사용자의 crontab에 다음 줄을 넣었습니다.
* * * * * /usr/bin/env > /home/username/tmp/cron-env
그런 다음 파일이 작성된 후 파일을 가져옵니다.
2 단계: 저는 다음을 포함하는 run-as-cron bash 스크립트를 직접 만들었습니다.
#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"
문제의 사용자로서 저는 다음을 수행할 수 있었습니다.
run-as-cron /the/problematic/script --with arguments --and parameters
답변3
내가 아는 한, cron에는 특정 시간에 예약된 명령을 실행하는 특별한 목적이 있으므로 이를 직접 수행할 수 있는 방법은 없습니다. 따라서 가장 좋은 방법은 (임시) crontab 항목을 수동으로 생성하거나 환경을 삭제하고 재설정하는 스크립트를 작성하는 것입니다.
"환경 삭제 및 재설정" 지침:
스크립트를 시작하기 전에 저장된 환경을 가져오는 래퍼 스크립트(환경 제거)를 시작할 수 있습니다 env -i
(모든 변수를 내보내고 가능하면 먼저 설정해야 함).set -a
저장된 환경은 cron 작업의 기본 환경이 되며 env
cronjob(또는 사용된 cron 작업에 따라 쉘)로 실행하고 해당 출력을 저장하여 기록됩니다.declare -p
답변4
cron 작업을 직접 디버깅해야 한 후 다음 스크립트를 작성했습니다. 명령을 실행하기 전에 cron과 정확히 동일한 조건(수정된 환경을 포함하지만 비대화형 셸, 연결된 터미널 없음 등에서도 작동함)을 에뮬레이션하기 위해 최선을 다합니다.
명령/스크립트를 인수로 사용하여 호출하면 크론 작업을 즉각적이고 쉽게 디버깅할 수 있습니다. 또한 GitHub에서도 호스팅되고 업데이트될 수 있습니다.run-as-cron.sh
:
#!/bin/bash
# Run as if it was called from cron, that is to say:
# * with a modified environment
# * with a specific shell, which may or may not be bash
# * without an attached input terminal
# * in a non-interactive shell
function usage(){
echo "$0 - Run a script or a command as it would be in a cron job," \
"then display its output"
echo "Usage:"
echo " $0 [command | script]"
}
if [ "$1" == "-h" -o "$1" == "--help" ]; then
usage
exit 0
fi
if [ $(whoami) != "root" ]; then
echo "Only root is supported at the moment"
exit 1
fi
# This file should contain the cron environment.
cron_env="/root/cron-env"
if [ ! -f "$cron_env" ]; then
echo "Unable to find $cron_env"
echo "To generate it, run \"/usr/bin/env > /root/cron-env\" as a cron job"
exit 0
fi
# It will be a nightmare to expand "$@" inside a shell -c argument.
# Let's rather generate a string where we manually expand-and-quote the arguments
env_string="/usr/bin/env -i "
for envi in $(cat "$cron_env"); do
env_string="${env_string} $envi "
done
cmd_string=""
for arg in "$@"; do
cmd_string="${cmd_string} \"${arg}\" "
done
# Which shell should we use?
the_shell=$(grep -E "^SHELL=" /root/cron-env | sed 's/SHELL=//')
echo "Running with $the_shell the following command: $cmd_string"
# Let's redirect the output into files
# and provide /dev/null as input
# (so that the command is executed without an open terminal
# on any standard file descriptor)
so=$(mktemp "/tmp/fakecron.out.XXXX")
se=$(mktemp "/tmp/fakecron.err.XXXX")
"$the_shell" -c "$env_string $cmd_string" > "$so" 2> "$se" < /dev/null
echo -e "Done. Here is \033[1mstdout\033[0m:"
cat "$so"
echo -e "Done. Here is \033[1mstderr\033[0m:"
cat "$se"
rm "$so" "$se"