thực thi crontab không có các biến môi trường giống như thực thi người dùng


20

Tôi đã chạy công việc crontab của mình 0 2 */1 * * /aScript >aLog.log 2>&1với tư cách là người dùng 'root' và tuy nhiên tôi thấy env khác với env của người dùng 'root' và do đó trải qua một hành vi thời gian chạy khác nhau của các tập lệnh của tôi.

Một bản sửa lỗi đã đặt các lệnh xuất trong các tệp RC.d, nhưng nó vẫn không hiển thị! Tôi cuối cùng đã đặt các lệnh xuất trong chính aScript .

Câu hỏi của tôi là có cách nào tốt hơn để tiếp cận vấn đề này? và tại sao env bị thiếu ngay cả khi nó là từ cùng một 'root'? (Tôi sửa đổi crontab bằng cách chạy 'crontab -e' từ thư mục gốc)


8
Cron luôn chạy với môi trường hầu hết trống rỗng. HOME, LOGNAME và SHELL được đặt; và một PATH rất hạn chế. Nếu bạn không muốn tự mình thiết lập tất cả các biến, bạn có thể vào sourcehồ sơ (bash) của mình.
cyberx86

2
@ cyberx86: Tại sao không viết nó lên như một câu trả lời và nhận đại diện?
user9517 hỗ trợ GoFundMonica

2
@Iain: đại diện luôn được chào đón - nhưng đôi khi cảm giác như câu trả lời một dòng không thực sự kiếm được đại diện. Tôi hoàn toàn chấp nhận rằng một câu trả lời ngắn gọn có chỗ của nó, nhưng tôi đã (có lẽ không chính xác) sử dụng các bình luận như một 'lối thoát dễ dàng' khi tôi muốn cung cấp một số trợ giúp, nhưng không viết ra một lời giải thích đầy đủ, chi tiết (lúc đó là 1 giờ sáng. ..). Tuy nhiên tôi sẽ lấy lời khuyên của bạn và mở rộng về điều này một chút và thêm nó như một câu trả lời.
cyberx86

@ cyberx86: Tốt hơn để có một lớp lót chính xác hơn là không chính xác hoặc không có gì.
user9517 hỗ trợ GoFundMonica

Câu trả lời:


31

Cron luôn chạy với môi trường hầu hết trống rỗng. HOME, LOGNAME và SHELL được đặt; và một PATH rất hạn chế. Do đó, nên sử dụng các đường dẫn đầy đủ để thực thi và xuất bất kỳ biến nào bạn cần trong tập lệnh của mình khi sử dụng cron.

Có một số cách tiếp cận bạn có thể sử dụng để đặt các biến môi trường của mình theo cron, nhưng tất cả chúng đều có giá trị để đặt nó trong tập lệnh của bạn.

Cách tiếp cận 1:

Đặt từng biến bạn cần theo cách thủ công trong tập lệnh của mình.

Cách tiếp cận 2:

Nguồn hồ sơ của bạn:

. $HOME/.bash_profile(hoặc . $HOME/.profile)

.

Cách tiếp cận 3:

Lưu các biến môi trường của bạn vào một tệp (chạy như người dùng mong muốn):

env > /path/to/my_env.sh

Sau đó nhập qua tập lệnh cron của bạn:

env - `cat /path/to/my_env.sh` /bin/sh

Cách tiếp cận 4:

Trong một số trường hợp, bạn có thể đặt các biến cron toàn cầu trong /etc/default/cron. Tuy nhiên, có một yếu tố rủi ro cho việc này, vì những điều này sẽ được đặt cho tất cả các công việc định kỳ.


Cách tiếp cận 2 là tốt nhất cho các máy chủ nơi bạn có những thứ nhạy cảm không nên đánh vào đĩa trong env vars - mật khẩu, khóa api, v.v. Làm việc kỳ diệu cho tôi, vì vậy cảm ơn.
ap

Cách tiếp cận 4 làm việc cho tôi trong môi trường docker nơi động cơ docker đặt env vars. Để làm việc này, tôi phải lưu env của mình vào điểm nhập của docker. Giải pháp hoàn chỉnh có tại đây: github.com/rayyanqcri/swarm-scheduler
hammady

Bạn có thể giải thích về cách tiếp cận 3 cho tôi? Khi tôi cố gắng nhập nó, tôi nhận đượcbash: SHELL=/bin/bash: No such file
KuboMD

1

Cron tạo vỏ OWN của nó với việc sử dụng được chỉ định thông qua đó nó sẽ chạy.

Vì vậy, nếu bạn muốn giữ cùng một biến của người dùng của mình, thì hãy thử chạy nó với người dùng của riêng bạn, thay vì root hoặc bất kỳ người dùng nào khác.

Hoặc là

Cách tốt nhất là xuất các biến đó trong tập lệnh của riêng bạn.


1

Trong RedHat CentOS, bạn có thể đặt /etc/rc.d/init.d/fifts PATH mặc định thành cài đặt vĩnh viễn. /etc/rc.d/crond gọi các hàm khi bắt đầu.


0

Tôi đã có một vấn đề tương tự trên AWS của tôi. Tìm ra nó như thế

which python3

cho tôi /usr/bin/local/python3địa điểm

và sau đó

. $HOME/.profile; /usr/local/bin/python3 /home/ubuntu/your_script.py
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.