Làm thế nào để thiết lập biến crontab PATH


17

Tôi gặp vấn đề khi chạy tập lệnh từ crontab. Sau một số nghiên cứu, tôi hiểu vấn đề là do tham số PATH không bao gồm / sbin.

Tôi đã xem những gì nó bao gồm trong / etc / crontab:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Như một bài kiểm tra - công việc cron đơn giản để in biến PATH:

* * * * * echo $PATH &> /root/TMP.log

đầu ra là:

cat /root/TMP.log
/usr/bin:/bin

Tôi không hiểu hành vi này ... Làm cách nào để đặt biến PATH ..? Hoặc tốt hơn - làm thế nào để thêm đường dẫn đến nó?

Câu trả lời:


17

Mặc dù chúng giống nhau, một crontab của người dùng (được chỉnh sửa bằng crontab -e) khác với và giữ một đường dẫn riêng biệt từ crontab của hệ thống (được chỉnh sửa bằng cách chỉnh sửa / etc / crontab).

Hệ thống crontab có 7 trường, chèn tên người dùng trước lệnh. Mặt khác, người dùng crontab chỉ có 6 trường, đi thẳng vào lệnh ngay sau các trường thời gian.

Tương tự, PATH trong crontab của hệ thống thường bao gồm các thư mục / sbin, trong khi PATH trong crontab của người dùng thì không. Nếu bạn muốn đặt PATH cho người dùng crontab, bạn cần xác định biến PATH trong crontab của người dùng.


Một cách giải quyết đơn giản để thêm PATH thông thường của bạn vào các lệnh shell trong cron là để có nguồn cronjob hồ sơ của bạn bằng cách chạy bash trong shell đăng nhập. ví dụ thay vì

* * * * * some command

Thay vào đó bạn có thể chạy

* * * * * bash -lc some command

Theo cách đó, nếu hồ sơ của bạn đặt PATH hoặc các biến môi trường khác thành một thứ gì đó đặc biệt, nó cũng được đưa vào lệnh của bạn.


Cảm ơn, điều đó giải thích điều đó ... Nhưng theo cách này, tôi chỉ có thể đặt PATH chứ không thể chỉnh sửa, vì PATH = / sbin: $ PATH hoặc tương tự không hoạt động. Tôi đã thử ...
csny

Có, bạn sẽ cần xác định PATH từ đầu trong trường hợp như thế này, điều này đủ dễ, vì bạn biết tất cả các lệnh được chạy trong crontab của mình, vì vậy bạn chỉ cần xem xét chúng.
đậu

@madumlao bash -lckhông giúp được gì. Bây giờ tôi rất tốt với việc thiết lập PATH thủ công, nhưng nếu tôi cài đặt một số tập lệnh, tôi muốn chúng được nhận dạng trong cronjobs mà không chỉ định đường dẫn đầy đủ. Tôi chắc chắn rằng điều đó là có thể bằng cách nào đó, và bash -lcđang trên đường đến một giải pháp :)
csny

4
bash -lc bắt đầu một vỏ đăng nhập lấy nguồn hồ sơ người dùng của bạn. Điều này có nghĩa là nó sử dụng tập hợp PATH trong ~ / .bash_profile, ~ / .profile hoặc ~ / .bashrc ... bạn có đường dẫn được đặt ở đó không? Nếu vậy và nó hoạt động không cập nhật câu trả lời của tôi cho nó
madumlao

Tuyệt quá. Cảm ơn Madunlao. Sau khi tôi thêm thủ công thư mục tệp bin vào ~ / .bash_profile, cronjob của tôi hoạt động tốt.
张健健

7

Nếu bạn cần các PATH rộng hệ thống mặc định và các biến ENV khác (được xác định trong /etc/profile.d), chỉ cần đặt như sau:

* * * * * . /etc/profile; your cmd

3

Có thể đặt PATH (hoặc các tham số khác) trong dòng cronjob hoặc trên một dòng duy nhất. Nhưng bạn không thể sử dụng mở rộng shell như thế nào PATH=$PATH:/usr/local/bin. Nhưng dấu ngã được phép cho các phím tắt thư mục nhà.

Từ những cuốn sách:

Một dòng hoạt động trong crontab là cài đặt môi trường hoặc lệnh cron. Cài đặt môi trường có dạng: name = value trong đó các khoảng trắng xung quanh dấu bằng (=) là tùy chọn và mọi khoảng trắng không dẫn đầu tiếp theo trong giá trị là một phần của giá trị được gán cho tên. Chuỗi giá trị có thể được đặt trong dấu ngoặc kép (đơn hoặc đôi, nhưng khớp) để duy trì khoảng trắng ở đầu hoặc cuối.

Xem man 5 crontabđể biết thêm thông tin.

Vì vậy, điều này sẽ làm việc:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path

0

Tôi đã có cùng một vấn đề và tôi đã tìm ra cách khác để chạy tập lệnh của mình trong crontab. Tôi nghĩ cách dễ nhất để chạy chương trình của bạn là tạo một tập lệnh có thể cd vào thư mục của chương trình của bạn. Sau đó gọi chương trình của bạn trong kịch bản đó.

đây là một ví dụ về tập lệnh (tên script = launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

sau đó, làm cho tập lệnh của bạn có thể thực thi được:

chmod 755 launcher.sh

Và cuối cùng, thêm tập lệnh của bạn vào crontab

crontab -e

và thêm dòng này vào cuối:

@reboot sh /home/pi/test/launcher.sh

(Tôi đặt chương trình để chạy mỗi lần khởi động lại)

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.