Làm cách nào để đặt cron PATH trên toàn cầu (nghĩa là cho tất cả người dùng) vĩnh viễn?


10

Chúng tôi cần phải có / usr / local / bin trong đường dẫn của cron cho tất cả người dùng. Có cách nào để thiết lập toàn hệ thống mà không cần chỉnh sửa từng crontab của từng người dùng không?

Chúng tôi đã thử thêm PATH vào / etc / crontab:

# grep PATH /etc/crontab
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

Nhưng khi người dùng có cái này trong crontab của họ:

$ crontab -l | grep PATH
* * * * * echo $PATH > /tmp/current_cron_path

... nó tiết lộ rằng đường dẫn của họ vẫn được đặt thành mặc định:

$ cat /tmp/current_cron_path
/usr/bin:/bin

2
Gợi ý chung: Viết "nó không hoạt động" thường sẽ không giúp bạn có câu trả lời hữu ích. Luôn mô tả chính xác nó không hoạt động như thế nào , nghĩa là chính xác bạn đã làm gì và chính xác kết quả là gì.
sleske

Câu trả lời:


4

Bạn có thể định cấu hình PATH của mình trong tệp cấu hình crontab như được hiển thị trong mã đầu tiên trừ khi có . Đầu tiên chỉ định các biến env, sau đó chỉ định công việc.

CẬP NHẬT: Do thực tế là liên kết bị hỏng, đây là một đoạn trích:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

1
không hoạt động trên Ubuntu, ngay cả sau khi khởi động lại cron
doanh nhân

1
@grosser: Vâng, nó nên. Vui lòng gửi crontab hoàn chỉnh của bạn (chỉnh sửa câu trả lời của bạn), cùng với đầu ra mà nó tạo ra và lý do tại sao bạn tin rằng nó không hoạt động. Rồi chúng ta sẽ thấy ...
sleske

Cũng lưu ý rằng định dạng của các dòng VARIABLE = value bị hạn chế hơn một chút so với tập lệnh shell: Mỗi phép gán phải nằm trên một dòng của riêng nó và bạn không được sử dụng các biến ở phía bên tay phải (ví dụ: PATH = $ PATH: / bla sẽ không hoạt động).
sleske

tôi cập nhật các câu hỏi, thiết lập PATH trong một crontab cá nhân đã làm việc, chỉ là thay đổi toàn cầu đã không làm việc
Grosser

Hãy thử chỉ định các biến PATH trong mỗi crontab nơi bạn cần. Có lẽ nó được thực hiện do vấn đề bảo mật. BTW, trong ubfox (tôi đã kiểm tra) PATH được định nghĩa trong / etc / crontab và /etc/cron.d/anacron trong ubfox. Vì vậy, có vẻ như nó không được kế thừa từ / etc / crontab. Chỉ cần thử xác định nó trong root crontab ( sudo crontab -e)
igorp1024


1

Tôi cũng không thể tìm ra giải pháp cho việc này. Cách gần nhất mà tôi có được cho một giải pháp hợp lý là như sau (lấy từ https://raymii.org/s/tutorials/Better_cron_env_and_shell_control_with_the_SHELL_variale.html ).

  • Thay đổi shell cho công việc định kỳ của bạn và trỏ nó vào một tập lệnh bash. Tức là, ở đầu cronjob, thêm: SHELL=/path/to/setup/cron.bash
  • Trong kịch bản shell này, tải các biến môi trường và chỉ định các vars khác. Đảm bảo bao gồm 4 dòng sau ở trên cùng. Nó đặt lại biến SHELL thành bash và thực thi shell bash để chạy cronjobs.

Ví dụ:

#!/bin/bash
set -e

source /etc/environment
source /etc/profile
# restore SHELL env var for cron
SHELL=/bin/bash

# execute the cron command in an actual shell
exec /bin/bash --norc "$@"

Nhược điểm: điều này đòi hỏi bạn phải chỉ định SHELL=...ở đầu mỗi cronjob. Ưu điểm: bạn sẽ sử dụng các biến môi trường thông thường và bạn sẽ không phải lo lắng về việc giữ các biến nhất quán giữa cron và các biến khác


0

Nếu bạn có thể root, bạn có thể thử chỉnh sửa /etc/init.d/cronvà thay đổi PATH ở đó không? Tôi đã không kiểm tra điều này, nhưng sẽ rất thú vị để kiểm tra.


dường như không hoạt động, tôi chỉ thêm PATH = xxx vào /etc/init.d/cron nhưng đầu ra * * * * * echo $ PATH là như nhau
doanh thu
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.