2012-09-21 35 views
14

Tập lệnh python của tôi không chạy dưới crontab của tôi.Crontab không chạy tập lệnh python của tôi

tôi đã đặt này trong kịch bản python ở đầu trang:
#!/usr/bin/python

Tôi đã cố gắng làm điều này:
chmod a+x myscript.py

Thêm vào crontab -e tôi:


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

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

Tệp/var/log/cron của tôi cho biết:
Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py)

Nhưng tập lệnh của tôi không chạy vì khi tôi kiểm tra cơ sở dữ liệu sql của mình, không có gì thay đổi. Nếu tôi chạy nó trực tiếp vào thiết bị đầu cuối như vậy:

python /home/me/project/myscript.py

tôi nhận được kết quả chính xác.

Đây là 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() 

EDIT: mỗi ý kiến: Vâng, /usr/bin/python tồn tại. Tôi cũng có thể chạy tập lệnh python trực tiếp bằng cách sử dụng chỉ /home/me/project/myscript.py. /usr/bin/python /home/me/project/myscript.py hoạt động. Vì vậy, tôi không tin rằng đây là nguyên nhân?

+0

whats in the script? Nó có phụ thuộc vào môi trường nào không? – tMC

+0

Có, tôi nghĩ chúng ta cần xem bên trong myscript.py –

+2

Đặt biến MAILTO cho tên người dùng của bạn. Sau đó, bạn sẽ nhận được một số thông báo lỗi trong thư của bạn mà có thể cung cấp một đầu mối. – unutbu

Trả lời

11

gì xảy ra khi bạn gõ

/home/me/project/myscript.py vào vỏ?

Bạn có thể sử dụng rõ ràng /usr/bin/python trong lệnh crontbb của mình không?

Bạn có thể sử dụng đường dẫn tuyệt đối tới test.db hoặc cd vào đúng thư mục sau đó thực thi tập lệnh python của mình không?

Điều này hữu ích khi có các câu lệnh gỡ lỗi trong trăn và đăng nhập một số dữ liệu. Crontab có thể rất phức tạp để gỡ lỗi.

+0

Haha, bạn đã làm được! Tôi đã thay đổi test.db để sử dụng đường dẫn tuyệt đối '/ home/me/project/test.db' ... Và nó hoạt động! – user1636922

9

Có thể tập lệnh không bắt đầu vì không thể định vị trình thông dịch python. Môi trường Crontab có thể rất khác với môi trường vỏ mà bạn đang sử dụng. Các đường dẫn tìm kiếm có thể khác nhau đáng kể. Ngoài ra, bạn kiểm tra kịch bản của mình bằng cách khởi động trình thông dịch python một cách rõ ràng trong khi bạn mong đợi crontab chỉ bắt đầu tập lệnh. Tôi đặt dòng này ở đầu các tập lệnh python của tôi: #!/Bin/env python. Dòng này sẽ giúp định vị trình thông dịch bất kể thư mục nào được cài đặt miễn là nó nằm trong đường dẫn tìm kiếm.

+0

Tôi hiện đang ở trong bash, và tôi đã thêm đề xuất của bạn '#!/Bin/env python'. Nó không hoạt động. – user1636922

+0

Đầu tiên, xem bạn có/bin/env hay env nằm trong một thư mục khác hay không. – shargors

+23

Bắt đầu lệnh sau để có cùng môi trường như lệnh được sử dụng bởi crontab: env -i/bin/bash --noprofile --norc Sau đó, bắt đầu tập lệnh python của bạn và xem tại sao nó không thành công. Điều này sẽ cung cấp cho bạn một ý tưởng. – shargors

1

Cố gắng đưa vào crontab của bạn:

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

hơn

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

Cũng dòng công việc là #!/usr/bin/env python trong một số môi trường.env là một tệp thực thi và bạn phải biết nơi nó sống với "$ which env".

0
  • Người dùng cron (nơi tập lệnh không thành công) và người dùng thiết bị đầu cuối (khi kịch bản thành công) giống nhau không?
  • Bạn có thể chuyển hướng kết quả công việc đến một số tệp như được đề cập trong Cron Job Log - How to Log? hay không. Chúng tôi có thể xem liệu điều đó có giúp ích gì không.
0

Trong khi câu trả lời ở đây phân định rõ ràng vấn đề và giải pháp, tôi muốn thêm một câu trả lời khác đã giúp tôi.

Nếu tập lệnh python của bạn đang gọi cơ sở dữ liệu, hãy chắc chắn bạn có thể kết nối với db đúng trong cron env (để xác định cron env ->https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work). Tôi đã có một tập tin đó sẽ chạy từ vỏ, nhưng không phải là một crontab trừ khi tôi kết nối với cơ sở dữ liệu như là người chủ từ bên trong kịch bản python.

1

Thông thường, các vấn đề crontab như thế này là do biến môi trường PATH bị hạn chế/khác với môi trường PATH bình thường của người dùng của bạn. Vì shell của bạn sử dụng môi trường PATH để tìm tệp thực thi (ví dụ/usr/bin/python được tìm thấy trong/usr/bin khi bạn gõ "python" tại dấu nhắc trình bao), khi PATH thiếu các vị trí phổ biến, như/usr/bin hoặc/usr/sbin, công việc cron của bạn sẽ thất bại. Điều này đã cắn tôi nhiều lần. Việc sửa chữa đơn giản chỉ là để đặt PATH một cách rõ ràng ở gần đầu tệp crontab của bạn, trước bất kỳ lệnh nào cần nó. Vì vậy, chỉ cần chỉnh sửa crontab như bình thường và thêm một cái gì đó như thế này ở gần đầu (nếu bạn nhị phân không phải là một trong các đường dẫn dưới đây, bạn sẽ cần phải thêm nó sau dấu hai chấm):

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

tôi d có cùng một vấn đề. Mặc dù thực tế là các kịch bản thực hiện bằng tay đã được làm việc, trong crontab không có tùy chọn được đề cập ở trên đã làm việc ở tất cả. Tôi đã chuyển tập lệnh của mình từ/home/user/script_directory/sang/opt/scripts/và nó bắt đầu hoạt động. Nguyên nhân có thể có của sự cố phải là quyền truy cập (đọc) đối với thư mục con nằm trong thư mục chính.

0

Thỉnh thoảng tôi cũng gặp phải vấn đề tương tự. Dù tôi có cố gắng gì ở đây, tôi có thể không nhận được kết quả.

Vì vậy, tôi bắt đầu viết "cò" bash script như sau (chúng ta hãy đặt tên cho nó trigger.sh):

#!/bin/bash 

/full_path/python_script.py 

Và tôi gọi trigger.sh từ crontab và mọi thứ đều tốt.

EDIT: Tất nhiên, đừng quên để làm sau (cho thi công phải):

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

Cách dễ nhất để xử lý này là để thêm đường dẫn cài đặt python của bạn để PATH trong đầu của kịch bản shell. Cái gì như:

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

Như @Shargors nói rằng bạn có thể kiểm tra nó bằng

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

Có rất nhiều câu trả lời nửa trên internet vì vậy tôi nghĩ tôi sẽ chụp này để tiết kiệm người khác một thời gian .

Trước tiên, cronjob thực hiện công việc không tốt khi nói cho bạn biết điều này không thành công ở đâu.Tôi khuyên bạn nên gửi đầu ra stderr vào một tập tin log như thế này:

Crontab Command:

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

Vì đây là khả năng chạy lệnh như người dùng, kiểm tra thư mục home cho các file log. Lưu ý rằng tập lệnh này chạy mỗi phút rất tốt để gỡ lỗi.

Vấn đề tiếp theo là bạn có thể gặp sự cố đường dẫn ... vì tập lệnh có khả năng đang cố gắng thực thi từ thư mục chính của bạn. Tập lệnh này thiết lập thư mục hiện tại, lặp lại nó để gửi và sau đó chạy chương trình của bạn.

Hãy thử điều này:

Script tệp

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

Hope tiết kiệm này người khác một thời gian gỡ lỗi !!!

0

Hãy thử điều này

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

Có một số vấn đề đường dẫn với cron. Vì vậy, khi bạn di chuyển đến thư mục với tập tin python, cron hoạt động như quyến rũ!

Các vấn đề liên quan