2012-09-21 7 views
14

파이썬 스크립트가 내 crontab에서 실행되지 않습니다.Crontab이 내 파이썬 스크립트를 실행하지 않습니다.

나는 상단에있는 파이썬 스크립트에서이 놓여있다 :


    SHELL=/bin/bash 
    PATH=/sbin:/bin:/usr/sbin:/usr/bin 
    MAILTO=""

* * * * * /home/me/project/myscript.py 

: chmod a+x myscript.py


내의 crontab -e 추가 :이 일을 시도
#!/usr/bin/python

내/var/log/cron 파일의 내용 :
Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py)

그러나 내 SQL 데이터베이스를 검사 할 때 아무 것도 변경되지 않았기 때문에 스크립트가 실행되지 않습니다. 내가 지금처럼 터미널에서 직접 실행하는 경우 :

python /home/me/project/myscript.py

을 나는 올바른 결과를 얻을.

#!/usr/bin/python 

import sqlite3 

def main(): 
    con = sqlite3.connect("test.db") 

    with con: 

     cur = con.cursor() 

     cur.execute("CREATE TABLE IF NOT EXISTS testtable(Id INTEGER PRIMARY KEY, Name TEXT)") 

     cur.execute("INSERT INTO testtable(Name) VALUES ('BoB')") 

     cur.execute("SELECT * FROM testtable") 

     print cur.fetchall() 


if __name__ == "__main__": 
    main() 

편집 : 코멘트 당 : 예, /usr/bin/python가 존재

은 myscript.py입니다. 또한 /home/me/project/myscript.py을 사용하여 python 스크립트를 직접 실행할 수도 있습니다. /usr/bin/python /home/me/project/myscript.py가 작동합니다. 그래서 이것이 원인이라고 생각하지 않습니까?

+0

스크립트에는 무엇이 있습니까? 그것은 환경에 달려 있습니까? – tMC

+0

예, 내 생각에 myscript.py를보아야합니다. –

+2

MAILTO 변수를 사용자 이름으로 설정하십시오. 그렇다면 귀하의 메일에 단서를 제공 할 수있는 오류 메시지가 표시됩니다. – unutbu

답변

11

당신이 쉘에

/home/me/project/myscript.py를 입력 할 때 어떻게됩니까?

/usr/bin/python을 crontbb 명령에 명시 적으로 사용할 수 있습니까?

test.db 또는 cd의 절대 경로를 올바른 디렉토리에 사용할 수 있습니까? 그렇다면 Python 스크립트를 실행 하시겠습니까?

이것은 파이썬에서 디버그 문을 사용하고 일부 데이터를 기록하는 데 유용합니다. Crontab은 디버깅하기가 매우 까다 롭습니다.

+0

하하, 해냈어! test.db를 절대 경로'/ home/me/project/test.db'를 사용하도록 변경했습니다 ... 그리고 작동합니다! – user1636922

9

파이썬 인터프리터를 찾을 수 없어 스크립트가 시작되지 않을 수도 있습니다. Crontab 환경은 사용중인 쉘 환경과 매우 다를 수 있습니다. 검색 경로는 크게 다를 수 있습니다. 또한 crontab이 스크립트를 시작하기 만하면 Python 인터프리터를 명시 적으로 시작하여 스크립트를 테스트합니다. 이 파이썬 스크립트의 맨 위에이 줄을 넣습니다 : #!/bin/env python. 이 행은 검색 경로에있는 한 설치된 디렉토리와 관계없이 인터프리터를 찾는 데 도움이됩니다.

+0

나는 현재 bash에 있는데, 당신의 제안 인'#!/bin/env python'을 추가했습니다. 그것은 작동하지 않았다. – user1636922

+0

먼저/bin/env가 있는지 확인하거나 env가 다른 디렉토리에 있는지 확인하십시오. – shargors

+23

crontab에서 사용하는 것과 동일한 환경을 사용하려면 다음 명령을 시작하십시오. env -i/bin/bash --noprofile --norc 그런 다음 파이썬 스크립트를 시작하고 실패한 이유를 확인하십시오. 이것은 당신에게 아이디어를 줄 것입니다. – shargors

1

은 당신의 crontab에 넣어보십시오 :

* * * * * python /path/to/your/script.py 

오히려

* * * * * /path/to/your/script.py 

또한 오두막 라인이 어떤 환경에서 #!/usr/bin/env python입니다

보다. env은 실행 파일이며 " $ which env"이있는 위치를 알아야합니다.

0
  • cron 사용자 (스크립트가 실패한 경우)와 터미널 사용자 (스크립트가 성공한 경우)가 동일합니까?
  • Cron Job Log - How to Log?에서 설명한대로 작업 출력을 일부 파일로 리디렉션 할 수 있습니까? 그게 도움이되는지 알 수있었습니다.
0

여기에 나와있는 답변이 문제와 해결 방법을 명확히 설명하지만 나는 또 다른 대답을 추가하고 싶습니다.

파이썬 스크립트가 데이터베이스를 호출하는 경우 cron env에서 db에 제대로 연결할 수 있는지 확인하십시오 (cron env ->https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work을 식별하기 위해). 파이썬 스크립트 내에서 루트로 데이터베이스에 연결하지 않으면 쉘에서 실행할 파일이 있지만 crontab 파일이 아닙니다.

1

일반적으로 이와 같은 crontab 문제는 PATH 환경 변수가 일반 사용자의 PATH 환경보다 제한적이거나 다른 것으로 인해 발생합니다. 쉘은 PATH 환경을 사용하여 실행 파일을 찾습니다 (예 : 쉘 프롬프트에서 "python"을 입력하면/usr/bin/python이/usr/bin에 있음). PATH에/usr/bin 또는/usr/sbin을 사용하면 cron 작업이 실패합니다. 이것은 나에게 몇 번이나 비트가있다. 간단한 수정은 Crontab 파일을 필요로하는 명령 앞에 crontab 파일의 맨 위에 명시 적으로 PATH를 명시 적으로 설정하는 것입니다. 그래서 (당신은 콜론 뒤에 추가해야합니다, 당신 바이너리는 아래 경로 중 하나가 아닌 경우), 그냥 평소대로의 crontab을 편집하고 상단에 이런 식으로 뭔가를 추가 : 나는 '

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 
2

을 d도 같은 문제가 있습니다. 수동으로 실행 된 스크립트가 작동 했음에도 불구하고 crontab에서 위에서 언급 한 옵션은 전혀 작동하지 않았습니다. 나는/home/user/script_directory /에서/opt/scripts /로 스크립트를 옮겼으며 작동하기 시작했다. 문제의 가능한 원인은 홈 디렉토리에있는 하위 폴더에 대한 액세스 (읽기) 권한이어야합니다.

0

가끔 같은 문제에 직면하고 있습니다. 여기에 조언 된대로 어떤 것을 시도해도 결과를 얻지 못할 수도 있습니다.

#!/bin/bash 

/full_path/python_script.py 

을 그리고 난 crontab을에서 trigger.sh를 호출하고 모든 것이 괜찮 :

그래서 내가 쓰기 시작 "트리거"bash는 스크립트는 다음과 같다 (의이 trigger.sh 그 이름을 보자).

편집 : 물론, 다음을 수행하는 것을 잊지 (오른쪽 실행을 제공)하지 않습니다이 쉘 스크립트의 상단에 PATH에 파이썬 설치의 경로를 추가하는 것입니다 처리 할 수 ​​

$chmod +x python_script.py 
$chmod +x trigger.sh 
0

가장 쉬운 방법. 뭔가 같은 :

#!/usr/bin/env bash 
export PATH="{path to your python installation}:$PATH" 
python {python_file_name}.py 

으로 @Shargors는

env -i /bin/bash --noprofile --norc 
0

하여 테스트 할 수 있습니다 말했다가 인터넷을 통해 반 답변이 많이 그래서 나는 시간이 다른 사람을 저장하려면이를 캡처 할 생각입니다 .

먼저 cronjob은 이것이 어디에서 실패했는지 알려주지 못합니다.나는이 같은 로그 파일에 표준 에러 출력을 보내는 것이 좋습니다

crontab 명령 명령이로

# m h dom mon dow command 
* * * * * /path/to/your_file.sh >> out.txt 2>&1 

가능성이 로그 파일을 홈 디렉토리를 확인, 사용자로 명령을 실행한다. 이 스크립트는 디버깅에 좋은 매분마다 실행됩니다.

다음 문제는 아마 스크립트가 홈 디렉토리에서 실행하려고 시도 할 때 경로 문제가 발생했을 가능성이 있습니다. 이 스크립트는 현재 디렉토리를 설정하고 파일에 에코로 표시 한 다음 프로그램을 실행합니다.

이 시도 :

스크립트

#!/bin/sh 
cd "$(dirname "$0")"; 
CWD="$(pwd)" 
echo $CWD 
python your_python_file.py 

희망 파일이 디버깅 시간을 다른 사람이 저장!

0

어떤 경로 문제가 크론에있다이

* * * * * cd <directory_where_python_file_is> && bin/app etc/app_defaults.yaml 

을보십시오. 그래서 파이썬 파일로 디렉토리로 이동하면 cron은 매력처럼 작동합니다!

관련 문제