2013-03-21 40 views
21

Đây là công việc định kỳ của tôi:Cron công việc không nhận được các biến môi trường thiết lập trong .bashrc

[email protected]:~$ crontab -l 
* * * * * /bin/bash -l -c 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test' 

và bên ~/.bashrc tập tin, tôi đã export EDITOR=vim, nhưng trong /tmp/cronjob.test tập tin cuối cùng, nó vẫn còn trống rỗng?

Vậy làm thế nào tôi có thể nhận được các biến môi trường (đặt trong .bashrc tệp) và sử dụng nó trong công việc cron của tôi?

[email protected]:~$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 12.04 LTS 
Release:  12.04 
Codename:  precise 
[email protected]:~$ uname -a 
Linux dragon 3.2.0-26-generic-pae #41-Ubuntu SMP Thu Jun 14 16:45:14 UTC 2012 i686 i686 i386 GNU/Linux 

Nếu sử dụng này:

* * * * * /bin/bash -l -c -x 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test' 2> /tmp/cron.debug.res 

Trong /tmp/cron.debug.res:

... 
++ return 0 
+ source /home/plee/.bashrc 
++ '[' -z '' ']' 
++ return 
+ echo 

BTW, các tập tin .bashrc là một trong những mặc định đi kèm với Ubuntu 12.04, với ngoại lệ mà tôi đã thêm một dòng export EDITOR=vim.

Nếu tôi không sử dụng các công việc định kỳ, thay vào đó, chỉ trực tiếp làm điều này trên dòng lệnh:

source .bashrc; echo $EDITOR # Output: vim 
+0

điều gì xảy ra nếu bạn 'cat ~/.bashrc' vào tệp tạm thời? – Alex

+0

ý của bạn là gì bởi 'cat ~/.bashrc'? Nó có một dòng: 'export EDITOR = vim'. Tôi hỏi tại sao lệnh 'echo' KHÔNG nhận biến môi trường' $ EDITOR'. –

+0

Xin lỗi vì không rõ ràng, trong mục nhập cron, thay vì 'source'ing tệp, hãy sử dụng' cat' để xác nhận rằng nó có thể được đọc bởi 'cron'. – Alex

Trả lời

41

Lý do cho source ~/.bashrc không hoạt động là nội dung trên ~/.bashrc (mặc định từ Ubuntu 12.04). Nếu bạn nhìn vào nó, bạn sẽ thấy trên dòng 5 và 6 như sau:

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 

PS1 biến được đặt cho một cái vỏ tương tác, do đó, nó vắng mặt khi chạy qua cron, ngay cả khi bạn đang thực hiện nó như là một vỏ đăng nhập . Đây là khẳng định nội dung của file được tạo ra bởi /bin/bash -l -c -x 'source ~/.bashrc; echo $EDITOR > /tmp/cronjob.test':

+ source /home/plee/.bashrc 
++ '[' -z '' ']' 
++ return 

Để làm source ~/.bashrc làm việc, nhận xét ra dòng để kiểm tra sự hiện diện của biến PS1 trong ~/.bashrc:

#[ -z "$PS1" ] && return 

Điều này sẽ làm bash thực hiện toàn bộ nội dung của ~/.bashrc qua cron

+6

Hoặc đặt '$ PS1' thành giá trị tùy ý trước khi' nguồn'ing tệp '.bashrc'; bằng cách đó bạn không phải thay đổi '.bashrc'. –

+0

Điều đó có hiệu quả đối với tôi - tôi không biết tại sao nó lại được thiết lập theo cách đó, nhưng có vẻ như nó đã thực hiện thủ thuật sau hàng giờ thử những thứ khác! – Avishai

+0

điều này không có tác dụng đối với tôi vì lý do nào đó. Tôi vẫn không nhận được '~/.bashrc' trong cronjobs. – chovy

1

Tôi chỉ cố gắng một file .env_setup_rc tập tin chỉ với một dòng export EDITOR=vim, đáng ngạc nhiên nó hoạt động.

Vì vậy, tôi đoán có điều gì đó trong số .bashrc xung đột với lệnh bash job bash.

8

Câu trả lời được cung cấp bởi @alex là chính xác nhưng trong Ubuntu 13.10 mã đã được sửa đổi một chút. Không có biến $ PS1 nhưng trong dòng 6-9 có một mã số

case $- in 
    *i*) ;;  
    *) return;; 
esac 

Chỉ cần nhận xét dòng trả về công việc. tức là mã bên dưới hoạt động

case $- in 
    *i*) ;;  
# *) return;; 
esac 
Các vấn đề liên quan