2017-02-08 40 views
19

Tôi đã xem xét các câu hỏi tràn ngăn xếp khác nhưng không thể thực hiện bất kỳ thao tác nào. Tôi có một kịch bản python trong đó sử dụng các biến môi trường. Kịch bản này hoạt động chính xác như kế hoạch khi chạy trực tiếp tuy nhiên, tôi muốn chạy nó như một công việc cron mỗi phút trong thời gian này.Biến môi trường khi tập lệnh python chạy bởi cron

Hiện nay trong thư mục cron.d của tôi, tôi có một tập tin gọi là chọc chứa:

* * * * * root /usr/bin/python3.5 /code/scraper.py 

này chạy các script python nhưng kịch bản thất bại như trong kịch bản tôi sử dụng hai biến môi trường.

Tôi đã đọc tôi nên thêm SHELL =/bin/bash vào tệp cron vì vậy tôi đã làm nhưng điều này không giúp ích gì.

SHELL=/bin/bash 
* * * * * root /usr/bin/python3.5 /code/scraper.py 

Sau đó, tôi đọc

Trong crontab, trước khi bạn lệnh, thêm. $ HOME/.profile.

SHELL=/bin/bash 
* * * * * . $HOME/.profile; root /usr/bin/python3.5 /code/scraper.py 

nhưng điều này gây ra cron để ngừng chạy hoàn toàn. Cách tốt nhất để 'gửi' các biến env cho cron là gì?

+0

thử thêm 'source ~/.bashrc && command' hoặc tệp nơi các biến env của bạn được khai báo và xem nó có hoạt động hay không. – franklinsijo

+0

@franklinsijo Xin lỗi, tôi không chắc mình nên làm gì. Các biến env được khai báo trong tệp docker-compose khi thiết lập các thùng chứa. –

+0

và các biến đó là những biến được sử dụng bởi scraper.py? – franklinsijo

Trả lời

2

Bạn có thể thiết lập các biến env inline:

* * * * * root ENV_VAR=VALUE /usr/bin/python3.5 /code/scraper.py

Một cách khác là sử dụng honcho mà bạn có thể vượt qua một tập tin với các biến env.

honcho -e /path/to/.env run /code/scraper.py

+0

Có cách nào để có tất cả các giá trị env được truyền qua cron không? –

+0

Biến Env được kế thừa từ quy trình gốc. – fabiocerqueira

3

Thay vì thực hiện toàn bộ ~/.profile những gì tôi muốn làm là di chuyển các biến đó phải được chia sẻ giữa cron công việc của bạn và các tài khoản có hồ sơ cá nhân, sau đó tôi muốn tìm nguồn này cả trong ~/.profile và trong công việc cron.

Lần thử cuối cùng bạn hiển thị trong câu hỏi không được định dạng đúng. Id người dùng sẽ đến ngay sau thông tin lập lịch, nhưng bạn đã thêm nguồn cấp dữ liệu hồ sơ trước id người dùng, điều này chắc chắn không thể hoạt động.

Dưới đây là một thiết lập ví dụ mà tôi đã thử nghiệm ở đây:

*/1 * * * * someuser . /tmp/t10/setenv && /usr/bin/python /tmp/t10/test.py 

tôi đã thiết lập nó để thực hiện mỗi phút cho mục đích thử nghiệm. Thay thế someuser bằng thứ gì đó có ý nghĩa. Các kịch bản /tmp/t10/setenv Tôi đã từng có này:

export FOO=foovalue 
export BAR=barvalue 

File /tmp/t10/test.py thăm này:

import os 

print os.environ["FOO"], os.environ["BAR"] 

My email cron tôi đầu ra của kịch bản nó chạy.Tôi nhận được một email với sản lượng này:

foovalue barvalue 
+0

'setenv && test.py', tương đương với lời gọi hệ thống' test.py' trong 'setenv', nó sẽ và chắc chắn sẽ hoạt động, cách tiếp cận tốt hơn so với hàm của tôi để gọi hệ thống test.py trong một tệp. Tôi thích cách tiếp cận này. – Gang

+0

Cảm ơn, nó cũng làm việc hoàn hảo cho tôi. Bài đăng rất hữu ích. –

1

Bạn có thể chỉ định hai biến môi trường của bạn bằng cách này:

* * * * * root env A=1 B=2 /usr/bin/python3.5 /code/scraper.py 

env là một chương trình hệ thống chạy một chương trình cụ thể với các biến thêm:

$ env A=1 B=2 /bin/sh -c 'echo $A$B' # or just 'sh': would search in $PATH 
12 
+0

với 2 vars trong env, điều này sẽ làm việc. – Gang

0

Đây là một trong những cách tiếp cận tôi thích, viết kịch bản để đặt môi trường và thực thi tập lệnh với các thông số của nó làm tham số

set_env_to_process.sh

#!/usr/bin/env bash 
echo "TEST_VAR before export is: <$TEST_VAR>" 

export TEST_VAR=/opt/loca/netcdf 
echo "TEST_VAR after export is: <$TEST_VAR>" 
export PATH=$PATH:/usr/bin/python3.5 
export PYTHTONPATH=$PYTHONPATH:/my/installed/pythonpath 

# execute command and its parameters as input for this script 
if [ $# -eq 0 ]; then 
    echo "No command to execute" 
else 
    echo "Execute commands with its parameters: [email protected]" 
    eval [email protected] 
fi 

sử dụng

/usr/bin/python3.5 /code/scraper.py được lấy làm đầu vào cho set_env_to_process.sh set_env_to_process.sh thiết lập env chính xác cho kịch bản để chạy

Nó có thể được sử dụng như dòng lệnh, cron, sudo , ssh để thiết lập env

* * * * * root set_env_to_process.sh /usr/bin/python3.5 /code/scraper.py 
Các vấn đề liên quan