환경 cron을 시뮬레이트하는 방법은?
일반적으로 cron에는 환경이 설정되어 있지 않기 때문에 cron 스크립트의 실행 방법에 몇 가지 문제가 있습니다.cron과 같은 방법으로 bash(?)를 호출하여 스크립트를 설치하기 전에 테스트할 수 있는 방법이 있습니까?
다음 항목을 crontab에 추가합니다(일시적으로).
* * * * * env > ~/cronenv
실행 후 다음을 수행합니다.
env - `cat ~/cronenv` /bin/sh
이것은 cron이 /bin/sh를 실행한다고 가정합니다.이것은 사용자의 기본 셸에 관계없이 기본입니다.
주 : 만 、 만 、env에는, 고도의 이 포함되어 (예: 「보다 낫다」).PS1=$(__git_ps1 " (%s)")$는 알 수 없는 에러가 나다.env: ": No such file or directory.
Cron은 기본적으로 다음 환경만 제공합니다.
HOME의 홈LOGNAMEPATH=/usr/bin:/usr/sbinSHELL=/usr/bin/sh
더 필요한 경우 crontab의 스케줄링 테이블 전에 환경을 정의하는 스크립트를 소스할 수 있습니다.
몇 가지 접근법:
cron env 및 소스 내보내기:
더하다
* * * * * env > ~/cronenvcrontab에 접속하여 한 번 실행한 후 전원을 끄고 실행한다.
env - `cat ~/cronenv` /bin/sh은 지금 '안' 안에 .
shenvironmentcron이환경을 cron으로 전환
요.
. ~/.profile작업 앞 "cron" "cron" "cron" "cron" "cron" "cron" "cron" )에 표시됩니다.* * * * * . ~/.profile; your_command화면 사용
의 두 세션에 하고 X 에 액세스할 수 에서 여전히 합니다.
dbusetc.에서는 Ubuntu라고 .nmcli(Network Manager)의 2는 cron의 cron이다.* * * * * /usr/bin/screen -dm위의 행을 cron에 추가하고 한 번 실행한 후 다시 끕니다.화면 세션(화면 -r)에 연결합니다.(「」가 있는 경우)
ps대문자)로ps | grep SCREEN)이제 이븐
nmcli같은 것은 실패한다.
실행할 수 있습니다.
env - your_command arguments
빈 환경에서 your_command가 실행됩니다.
계정의 셸에 따라 다릅니다.
sudo su
env -i /bin/sh
또는
sudo su
env -i /bin/bash --noprofile --norc
http://matthew.mceachen.us/blog/howto-simulate-the-cron-environment-1018.html 에서
후 : 는 6개의 문제 중 됩니다.systemd replacement로 "를 지정합니다.CLI에서 systemd "service"를 실행하든 cron을 통해 실행하든 상관없이 동일한 환경을 수신하므로 환경 불일치 문제가 발생하지 않습니다.
때 작업이 인 기본 cron입니다.$PATHUbuntu 16.04의 cron.
"/usr/bin:/bin"
로는 " " " 입니다.$PATH에 set로 systemdUbuntu 16.04 경 :
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
따라서 systemd 타이머가 더 이상 번거로움 없이 바이너리를 찾을 가능성이 더 높습니다.
systemd 타이머의 단점은 셋업 시간이 조금 더 길다는 것입니다.먼저 실행 대상을 정의하는 "service" 파일과 실행할 일정을 정의하는 "timer" 파일을 만들고 마지막으로 타이머를 활성화하기 위한 "enable"을 만듭니다.
env를 실행하여 stdout을 파일로 리다이렉트하는 cron 작업을 만듭니다.cron 작업과 동일한 환경을 만들려면 "env -" 옆에 파일을 사용하십시오.
cron의 부모가 init이기 때문에 cron은 제어 터미널 없이 프로그램을 실행한다는 것을 잊지 마십시오.다음과 같은 도구를 사용하여 시뮬레이션을 수행할 수 있습니다.
" " " 입니다.cron, 을 실행합니다.sh본 셸일 도 있고, 실제 본 셸일 dash,ash,ksh ★★★★★★★★★★★★★★★★★」bash 것에 심볼릭이 되어 있다sh(POSIX가 있습니다).
가장 좋은 방법은 스크립트에 필요한 것이 있는지 확인하고 스크립트에 아무것도 제공되지 않았다고 가정하는 것입니다..$PATH네 자신.
승인된 답변은 cron이 사용하는 환경에서 스크립트를 실행할 수 있는 방법을 제공합니다.다른 사람들이 지적했듯이 cron 작업을 디버깅하기 위해 필요한 기준은 이것뿐만이 아닙니다.
실제로 cron은 입력이 연결되어 있지 않은 비인터랙티브 단말기도 사용합니다.
이것이 도움이 된다면 cron에 의해 실행되는 명령어/스크립트를 쉽게 실행할 수 있도록 스크립트를 작성했습니다.명령어/스크립트를 첫 번째 인수로 호출하면 됩니다.
이 스크립트는 Github에서도 호스트(및 업데이트 가능)됩니다.
#!/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 route the output in a file
# and do not provide any input (so that the command is executed without an attached terminal)
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"
또 하나의 간단한 방법(오류가 발생하기 쉬우므로 아직 테스트 중입니다)은 명령 전에 사용자의 프로파일파일을 소싱하는 것입니다.
/etc/cron.d/ 스크립트 편집:
* * * * * user1 comand-that-needs-env-vars
다음과 같은 것이 됩니다.
* * * * * user1 source ~/.bash_profile; source ~/.bashrc; comand-that-needs-env-vars
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★로그인을 시뮬레이트하는 방법이 있습니까?행할할 수는? ??? bash --login효과가 없었습니다.그그그그그그그그그것것것것것 것것것것요 。
편집: 이것은 확실한 솔루션인 것 같습니다.http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
* * * * * root su --session-command="comand-that-needs-env-vars" user1 -l
응답 https://stackoverflow.com/a/2546509/5593430은 cron 환경을 가져와 스크립트에 사용하는 방법을 보여 줍니다.그러나 사용하는 crontab 파일에 따라 환경이 다를 수 있습니다.3개의 다른 cron 엔트리를 생성하여 다음 방법으로 환경을 저장했습니다.env > logAmazon Linux 4.4.35-33.55.amzn1.x86_64 입니다.
1. 글로벌 /etc/crontab(root 사용자 포함)
MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PWD=/
LANG=en_US.UTF-8
SHLVL=1
HOME=/
LOGNAME=root
_=/bin/env
root의 (2.root crontab)crontab -e)
SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env
3. /etc/cron으로 스크립트를 작성합니다.매시간/
MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
_=/bin/env
PWD=/
LANG=en_US.UTF-8
SHLVL=3
HOME=/
LOGNAME=root
한 것은 장 most most most most mostPATH,PWD ★★★★★★★★★★★★★★★★★」HOME.할 수 있도록 설정해 주세요.안정적인 환경에 의존하도록 cron 스크립트에서 이러한 설정을 해야 합니다.
제 경우 cron은 sh를 사용하여 스크립트를 실행하고 있었습니다.배쉬하다 변수 env를 했습니다.SHELL:
#!/bin/bash
SHELL=/bin/bash
cron 작업을 테스트하려면 앞으로 1~2분 정도 실행되도록 설정한 후 기다리는 방법밖에 없습니다.
언급URL : https://stackoverflow.com/questions/2135478/how-to-simulate-the-environment-cron-executes-a-script-with
'programing' 카테고리의 다른 글
| Date Time(UTC) 저장과 Date Time Offset 저장 (0) | 2023.04.15 |
|---|---|
| WPF 체크박스바인딩 (0) | 2023.04.15 |
| iOS를 사용하여 클립보드에 텍스트 복사 (0) | 2023.04.15 |
| 방향 변화를 감지하는 방법 (0) | 2023.04.15 |
| Windows에서 npm을 업데이트하려면 어떻게 해야 하나요? (0) | 2023.04.15 |