Không tìm thấy lệnh nào khi chạy một đoạn script thông qua cron


29

Tôi muốn chạy tập lệnh của mình trong crontab, nhưng tôi gặp một số vấn đề ...

Trong kịch bản của tôi, tôi chạy lệnh này:

db2 connect to myDB2

Điều này hoạt động tốt khi tôi chạy nó với tư cách là người dùng db2inst1 , nhưng khi tôi chạy tập lệnh này trong db2inst1 crontab , tôi nhận được điều này:

db2: không tìm thấy lệnh.

Làm sao tôi có thể giải quyết việc này?

Câu trả lời:


43

Để tránh phải nhập đường dẫn tuyệt đối vào một lệnh, shell đã giới thiệu $PATHbiến môi trường, mỗi thư mục được phân tách bằng a :và các tìm kiếm được thực hiện từ trái sang phải. cronthường xóa toàn bộ môi trường, bao gồm cả $PATHbiến này . Do đó, tập lệnh có thể hành xử khác nhau trong cron của bạn so với hành vi trong trình bao.

Sử dụng đường dẫn tuyệt đối

Chạy which db2như db2inst1người dùng để có được đường dẫn đầy đủ cho db2chương trình. Nếu đầu ra là /usr/bin/db2, lệnh cron của bạn sẽ như sau:

/usr/bin/db2 connect to myDB2

Đặt biến PATH

Chạy echo "$PATH"với tư cách db2inst1người dùng để lấy $PATHbiến và đảm bảo biến này cũng có sẵn trong tập lệnh cron của bạn. Ví dụ: nếu đầu ra là /usr/local/bin:/usr/bin:/bin, bạn sẽ đặt dòng tiếp theo vào đầu tập lệnh shell của bạn:

export PATH="/usr/local/bin:/usr/bin:/bin"

8

Như đã trả lời trong https://askubfox.com/a/23438/227839 , bạn nên đặt PATHtrong tập lệnh shell của mình:

#!/bin/bash
PATH="/usr/local/bin:/usr/bin:/bin"

# rest of script follows

hoặc trong tệp crontab, sẽ áp dụng cho tất cả các công việc định kỳ:

PATH="/usr/local/bin:/usr/bin:/bin"
0 1 * * * db2 connect to myDB2

Cảm ơn bạn, nó rất hữu ích!
Yamashiro Rion

3

Bạn phải xác định db2myDB2 là gì, nếu không thì sử dụng vị trí tuyệt đối của ' tệp ' hoặc ' ứng dụng ' muốn chạy.

Thí dụ:

/bin/rm /home/ubuntu/a.txt
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.