2010-04-25 27 views
17

Tôi muốn lên lịch tác vụ trên linux bằng icrontab và tác vụ được viết bằng python và phải nhập mô-đun nhập khẩu cx_Oracle, vì vậy tôi xuất ORACLE_HOME và LD_LIBRARY_PATH trong .bash_profile, nhưng nó gây lỗi:libclntsh.so.11.1: không thể mở tệp đối tượng được chia sẻ

libclntsh.so.11.1: cannot open shared object file. 

Vì nó là ok để chạy các nhiệm vụ do vấn đề lệnh trong shell như

python a.py  # ok 

tôi thay đổi nhiệm vụ trong icrontab vào một kịch bản shell mà gọi python của tôi kịch bản, nhưng recu ngoại lệ rred?

# the shell script scheduled in icrontab 
#! bash 
python a.py  

Bạn có thể trợ giúp cách thực hiện không?

Trả lời

15

Có thể bạn muốn chỉ định PATH - và cũng ORACLE_HOMELD_LIBRARY_PATH - để cron(1) biết nơi tìm tệp nhị phân.
Đọc "5 môi trường Crontab" here.

+0

nhưng chúng tôi cập nhật tập lệnh shell như sau: #!/bin/bash echo $ ORACLE_HOME echo $ LD_LIBRARY_PATH và chuyển hướng đầu ra của crontab tới tệp nhật ký tại sao những đường dẫn này đã được tìm thấy và ghi lại để ghi nhật ký? –

+0

@zhangzhong Tôi cho rằng bạn muốn sử dụng 'xuất' không phải' echo'? E. g. 'xuất ORACLE_HOME =/usr/lib/oracle10/foo' và' xuất LD_LIBRARY_PATH =/usr/lib/bar' –

2

Cron không tải tiểu sử của người dùng khi chạy tác vụ và bạn phải bao gồm cấu hình trong kịch bản lệnh shell của mình một cách rõ ràng.

Example documentation

1

Tôi chạy vào vấn đề này cùng cuối tuần trước khi tôi cần thiết để sử dụng cx_Oracle. Sau khi dành nhiều thời gian cố gắng sửa đổi biến LD_LIBRARY_PATH để bao gồm chỉ thị $ ORACLE_HOME/lib, nơi libclntsh.so cư trú, tôi đã giải quyết vấn đề bằng cách tạo các liên kết tượng trưng từ tất cả các thư viện Oracle xlibx.so vào/lib/xlibx .vì thế. Điều này chắc chắn không phải là "sạch" giải pháp, nhưng nó có một cơ hội tốt để làm việc mà không gây ra quá nhiều rắc rối:

cd $ORACLE_HOME/lib 
for f in `ls ./*.so*`; do; 
    sudo ln -s $ORACLE_HOME/lib/$f /lib/$f 
done 

Sau khi tôi đã làm điều đó, cx_Oracle làm việc như một nét duyên dáng.

+0

Tôi đã giải quyết nó sau khi bao gồm trong tập lệnh:. ~/.bash_profile –

+0

Bạn đã bao gồm tập lệnh từ đâu? –

+0

Về mặt kỹ thuật, điều này sẽ hoạt động, nhưng đó là câu trả lời sai, vì lần sau khi bạn cập nhật trình khách Oracle, điều này có thể bị hỏng (và sẽ cần phải chạy lại). Câu trả lời tốt hơn là sửa chữa kịch bản lệnh cần Python/Oracle và thiết lập các giá trị môi trường một cách chính xác. –

6

Các libs được đặt tại /u01/app/oracle/product/11.2.0/xe/lib (Đối với Oracle XE) hoặc tương tự.

Bạn nên thêm con đường này để /etc/ld.so.conf hoặc nếu tập tin này chỉ hiển thị một bao gồm vị trí, như trong một tập tin riêng biệt trong /etc/ld.so.conf.d thư mục

Tôi đã oracle.conf trong /etc/ld.so.conf.d, chỉ là một tập tin với con đường. Không có gì khác.

Tất nhiên đừng quên chạy ldconfig làm bước cuối cùng.

+0

nội dung nào nên "oracle.conf" ghi? – Gank

1

Bài đăng này đã giúp tôi giải quyết vấn đề tương tự với liên kết cơ sở dữ liệu PostgreSQL với Oracle bằng cách sử dụng oracle_fdw.

Tôi đã cài đặt oracle_fdw nhưng khi tôi đã cố gắng CREATE EXTENSION oracle_fdw; tôi đã error could not load library libclntsh.so.11.1: cannot open shared object file: No such file or directory.

Tôi đã kiểm tra $ORACLE_HOME, $PATH$LD_LIBRARY_PATH.

Nó chỉ làm việc sau khi tôi đưa Thư viện Oracle chia sẻ trên Linux Thư viện chia sẻ

echo /opt/instantclient_11_2 > oracle.conf 
ldconfig 
+0

bạn đã xuất oracle.conf ở đâu? –

+0

Tôi cho rằng nó phải là 'echo/opt/instantclient_11_2>/etc/ld.so.conf.d/oracle.conf'. – danielp

0

Chỉ cần vượt qua biến đường dẫn Oracle của bạn trước khi bạn chạy bất kỳ kịch bản:
Giống như cho perl bạn có thể làm thêm dưới đây trong đầu của bạn kịch bản:

BEGIN { 
    my $ORACLE_HOME  = "/usr/lib/oracle/11.2/client64"; 
    my $LD_LIBRARY_PATH = "$ORACLE_HOME/lib"; 
    if ($ENV{ORACLE_HOME} ne $ORACLE_HOME 
    || $ENV{LD_LIBRARY_PATH} ne $LD_LIBRARY_PATH 
    ) { 
     $ENV{ORACLE_HOME}  = "/usr/lib/oracle/11.2/client64"; 
     $ENV{LD_LIBRARY_PATH} = "$ORACLE_HOME/lib"; 
     exec { $^X } $^X, $0, @ARGV; 
    } 
} 
1

Nếu bạn có vấn đề với libclntsh.so, cần tạo liên kết tượng trưng cho libclntsh.so /usr/lib/oracle/11.2/client64/lib-/usr/lib

0

Tôi luôn luôn có vấn đề này, tôi có thể giải quyết bằng cách chạy vào mã bên dưới: xuất khẩu LD_LIBRARY_PATH =/opt/oracle/instantclient: $ LD_LIBRARY_PATH

enter image description here

OBS: Mã này tôi lưu trong tập tin cấu hình vì Tôi luôn sử dụng nó. chúc may mắn.

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