Lệnh 'which' không trả về gì qua cron, nhưng hoạt động thông qua bảng điều khiển


1

Tôi đã viết một tiện ích nhỏ trong haXe + Neko cần thực thi một số lệnh GIT. Để tránh thể xác định rõ đường dẫn đến GIT thực thi Tôi muốn sử dụng lệnh để tìm ra nó ở đâu. Mọi thứ hoạt động như mong đợi khi chạy thủ công từ bảng điều khiển, nhưng không phải khi ứng dụng chạy trên công việc định kỳ.

Tôi biết về môi trường bị hạn chế ( ở đây hoặc ở đây ) khi bạn chạy tập lệnh bằng cron, nhưng vẫn ngạc nhiên khi điều này không hoạt động:

/usr/bin/which git >> /home/user/git.txt

Tệp văn bản được tạo nhưng nội dung trống. Một lần nữa, khi chạy từ bàn điều khiển, nó hoạt động như mong đợi.

Có ý kiến ​​gì không? Tôi đang chạy OS X Leopard, nếu điều đó có ích.

Cảm ơn : )

Juan

Câu trả lời:


3

Nếu 'which' có thể tìm thấy tệp thực thi, thì trình thông dịch shell đang chạy lệnh cron của bạn cũng vậy. Vì vậy, tôi không thấy lý do tại sao bạn muốn sử dụng 'cái đó' cho mục đích này. Nhưng có thể bạn có một số lý do không rõ ràng.

Lệnh 'which' sử dụng các thư mục được liệt kê trong $ PATH để tìm kiếm lần xuất hiện đầu tiên của lệnh. Rất có khả năng PATH không được đặt theo những gì bạn nghĩ. Hãy thử thêm '/ usr / bin / env >> /home/user/you/env.txt' vào crontab của bạn để chạy ngay hôm nay, một phút kể từ bây giờ. Sau đó tìm trong /home/user/you/env.txt để xem PATH được đặt thành gì. Nếu PATH đó không phù hợp với mục đích của bạn, bạn có thể phải đặt tất cả các lệnh của mình vào một tập lệnh shell nhỏ, nơi bạn có thể tự đặt PATH. Bạn cũng có thể xem tệp env.txt đó để biết các biến môi trường được xuất khác vì nó có thể có ích, tùy thuộc vào những gì bạn muốn làm thông qua crontab của bạn.


Đừng! Cảm ơn đã chỉ ra sai lầm ngớ ngẩn.
Juan Delgado

2

Git thực sự nằm ở đâu (tức là nếu bạn chạy /usr/bin/which gittừ bàn điều khiển, nó in cái gì)? Nếu nó không có trong một thư mục trong $ PATH (chỉ là / usr / bin và / bin trên máy Snow Leopard của tôi), /usr/bin/whichbạn sẽ không tìm thấy nó và bạn cần mã hóa cứng hoặc thêm một dòng như

PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin

vào tập tin crontab.


0

Điều này sẽ làm những mẹo?

/usr/bin/env  git

Lệnh env đảm nhiệm việc tìm kiếm lệnh và luôn luôn nằm trong / usr / bin (vì vậy tôi đã nói ...) Đây là một mẹo phổ biến trong các tập lệnh Python, cần thiết do phân phối khác nhau đặt python ở các vị trí khác nhau, nhưng không ai muốn khỉ xung quanh cố gắng tìm ở đâu.


Không. Vấn đề là cron ghi đè lên PATH của người dùng. env chỉ giúp nếu chương trình nằm trong PATH.
Mikel
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.