Làm cách nào để chạy crontab với tư cách là người dùng: www-data?


32

LAMP của tôi được thiết lập để hoạt động user:www-datavà tất cả các tệp và thư mục được tạo với quyền đó.

Tôi đã thiết lập cho crontab là người dùng @ ubfox.

Vì vậy, tôi làm crontab -evà sử dụng lệnh này:

*/5 * * * * php /var/www/public/voto_m/artisan top >/dev/null 2>&1

Về cơ bản lệnh đó chỉ tạo tệp bộ đệm ở vị trí đã chỉ định (không có vấn đề gì với điều đó), nhưng tệp bộ đệm đó được tạo với người dùng: quyền của người dùng không phải là user:www-dataquyền.

Làm thế nào tôi có thể làm cho nó theo mặc định tạo tập tin với user:www-dataquyền?
Tôi không thể đi và chownmỗi lần tập tin được tạo lại.

Cảm ơn.


Lưu ý rằng một số tập lệnh crontab chạy dưới dạng dữ liệu www (ví dụ: awstatshoặc php5sessionclean) được đặt trong các /etc/cron.*thư mục và do đó không hiển thị thông qua crontab -e(ngay cả khi chỉ định dữ liệu www của người dùng ).
Skippy le Grand Gourou

Câu trả lời:


40

Bạn có thể viết mục nhập của bạn vào crontab hệ thống /etc/crontab, trong đó có một đối số bổ sung chỉ định người dùng chạy dưới dạng (thường là root, nhưng có thể là dữ liệu www).

Dòng của bạn sẽ trở thành:

*/5 * * * * www-data php /var/www/public/voto_m/artisan top >/dev/null 2>&1

Hoặc bạn có thể chỉnh sửa crontab của dữ liệu www của người dùng bằng su:

sudo su -c "crontab -e" www-data

1
Trên thực tế, tùy chọn thứ hai không hoạt động trên hầu hết các phiên bản Ubuntu
user123

Tùy chọn thứ hai không hoạt động với tôi trên 12.04LTS. Có lẽ nó không có trên các phiên bản sau?
mivk

1
tùy chọn thứ hai không hoạt động vào ngày 14.04
dgoosens

Để dễ quản lý, dòng cũng có thể được đặt trong tập tin riêng của mình trong /etc/cron.dvới tên mô tả, ví dụ như , /etc/cron.d/artisan.
fkraiem

2
Đối với tùy chọn thứ hai, hãy thử điều này thay vào đósudo su -c "crontab -e" www-data -s /bin/bash
Lunfel

51

Bạn cũng có thể chạy crontab với -uđối số để chỉnh sửa crontab cho một người dùng cụ thể:

sudo crontab -u www-data -e

cái này hoạt động vào ngày 14.04
dgoosens

3

Để chạy crontab dưới dạng dữ liệu www của người dùng, bạn có thể sử dụng lệnh sau:

crontab -u www-data -e

Sau đó, bạn viết một dòng, ví dụ để chạy tệp php cứ sau 15 phút:

*/15  *  *  *  * php -f /path_to_cron/cron.php

Khi lưu nó, bạn sẽ được biên tập viên yêu cầu:

File Name to Write: /tmp/crontab.HMpG7V 

Lưu nó ở đó, không phải lo lắng. crontab -emở một tệp trong / tmp thay vì crontab thực tế để nó có thể kiểm tra lỗi crontab mới của bạn và ngăn bạn ghi đè lên crontab thực tế của bạn với những lỗi đó. Nếu không có lỗi, thì crontab thực tế của bạn sẽ được cập nhật. Nếu crontab -e chỉ viết thẳng vào crontab thực tế của bạn, thì bạn sẽ có nguy cơ thổi bay toàn bộ crontab của mình.

Để xác minh rằng cronjob của bạn chạy, bạn có thể kiểm tra nhật ký cron. thông thường trong /var/log/cron.log hoặc thực hiện lệnh sau:

crontab -u www-data -l

Cái này hoạt động với tôi trên Ubuntu
tristanbailey

Điều này trước đây đã được trả lời chính xác và chính xác hơn bởi người chỉ huy mã trên 4 năm trước. Bạn đã bỏ qua việc sử dụng "sudo". và ném vào thông tin không được yêu cầu về định dạng của dòng cron.
HörmannHH

@RichieHH, tại sao tôi nên thêm sudo? Ai nói người dùng chưa chạy root? Bất cứ ai sử dụng lệnh này đều có đủ kiến ​​thức để biết rằng nếu anh ta cần chạy lệnh với các đặc quyền sẽ phải chạy nó bằng sudo, nếu không thì tốt hơn đừng chạm vào .. và bạn nói chính xác hơn ...? người chỉ huy mã vừa gõ lệnh nhưng không cung cấp thêm thông tin nào
spacebiker

.. nếu bạn thông minh như vậy, tốt hơn hết bạn nên bắt đầu đưa ra câu trả lời thay vì chỉ trích công việc của người khác, có thể sau đó bạn bắt đầu nhận được danh tiếng
spacebiker

-1

Tôi muốn thêm một cách tiếp cận khác. Như những người khác đã đề cập, Ubuntu (16.04 tại đây) và crontab dữ liệu www dường như không đáng tin cậy (có thể đó là một điều bảo mật?).

Dù sao, trong công ty của chúng tôi, chúng tôi muốn có tất cả các cronjob trên máy chủ có thể truy cập dễ dàng, vì vậy bạn không bỏ lỡ bất cứ điều gì. Đồng thời chúng tôi không muốn chạy mọi thứ (thực sự là mọi thứ!) Như root.

Vì vậy, chúng tôi chạy

sudo crontab -e 

Như bạn thường làm, và sau đó chúng tôi chỉ định lệnh là

* * * * * /bin/su - www-data -s /bin/bash -c '/path/to/command'

Điều này sẽ thực thi / path / to / lệnh dưới dạng dữ liệu www trong khi vẫn giữ cronjob trong tệp cronjobs gốc (và điều đó sẽ luôn chạy chính xác). Nó có lợi ích tốt khi có thể viết các logfiles là root (để bảo mật tối đa) bằng cách sử dụng các đường ống.

Lưu ý rằng chúng ta đang chuyển lớp vỏ ưa thích của mình, đây cũng có thể là / bin / sh cho lớp vỏ đơn giản hơn (chúng ta giống như khả năng bash đầy đủ). Www-data không có shell được chỉ định nên bạn sẽ gặp lỗi nếu không có nó. Thông thường cron chỉ chạy các công việc với / bin / sh.

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.