Làm cách nào để chỉ định trong crontab bởi người dùng nào để chạy tập lệnh? [đóng cửa]


176

Tôi có một vài công việc crontab chạy dưới root, nhưng điều đó mang lại cho tôi một số vấn đề. Ví dụ, tất cả các thư mục được tạo trong quá trình của công việc định kỳ đó đều nằm dưới gốc người dùng và nhóm gốc. Làm cách nào tôi có thể làm cho nó chạy dưới dữ liệu www của người dùng và nhóm dữ liệu www để khi tôi chạy các tập lệnh từ trang web của mình, tôi có thể thao tác các thư mục và tệp đó không?

Máy chủ của tôi chạy trên Ubuntu.
Công việc hiện tại của crontab là:

*/1 * * * * php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

Câu trả lời:


335

Thay vì tạo một crontab để chạy như người dùng root, hãy tạo một crontab cho người dùng mà bạn muốn chạy tập lệnh. Trong trường hợp của bạn, crontab -u www-data -esẽ chỉnh sửa crontab cho người dùng dữ liệu www. Chỉ cần đặt lệnh đầy đủ của bạn vào đó và xóa nó khỏi crontab của người dùng root.


54
Nó hoạt động theo cùng một cách khi bạn sử dụng crontab -enhư một người dùng cụ thể.
kulak

7
Nhưng crontab này sẽ được kiểm tra khi khởi động hệ thống hay chỉ khi người dùng đăng nhập?
Bruno Finger

11
crontrên các hệ thống * nix không yêu cầu người dùng đăng nhập để chạy các công việc được chỉ định trong crontab của người dùng cụ thể.
Mike

2
Điều này cũng sẽ đặt id nhóm như OP yêu cầu? Điều gì xảy ra nếu nhóm một người muốn khác với nhóm chính của người dùng?
Askyle

49

EDIT: Lưu ý rằng phương pháp này sẽ không hoạt động với crontab -e, nhưng chỉ hoạt động nếu bạn chỉnh sửa / etc / crontab trực tiếp. Nếu không, bạn có thể gặp lỗi như/bin/sh: www-data: command not found

Ngay trước tên chương trình:

*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

Điều đó sẽ làm cho nó chạy như phù thủy người dùng apache là dữ liệu www phải không?
arma

19
Lưu ý rằng phương pháp này sẽ không hoạt động crontab -e, nhưng chỉ hoạt động nếu bạn chỉnh sửa /etc/crontabtrực tiếp. Đọc bình luận ở đầu tập tin này để biết thêm thông tin.
imgx64

5
Người dùng chỉ có thể được chỉ định trong crontab của hệ thống
James Roth

Tôi có một vài công việc đúng tiến độ trên hệ thống crontab. Khi tôi làm sudo crontab -e, tôi thấy các công việc. Nhưng tôi mở tập tin /etc/crontabkhông có việc làm. Điều này có lạ không? Ngoài ra nếu tôi sudo crontab -evà thêm một công việc với người dùng chỉ định, nó sẽ hoạt động chứ?
eNeMetcH

14

Vì bạn đang chạy Ubuntu, crontab hệ thống của bạn được đặt tại /etc/crontab.

Là người dùng root (hoặc sử dụng sudo), bạn chỉ cần chỉnh sửa tệp này và chỉ định người dùng sẽ chạy lệnh này. Đây là định dạng của các mục trong crontab hệ thống và cách bạn nên nhập lệnh của mình:

# m h dom mon dow user  command
*/1 * * * * www-data php5 /var/www/web/includes/crontab/queue_process.php >> /var/www/web/includes/crontab/queue.log 2>&1

Tất nhiên, các quyền cho tập lệnh php và tệp nhật ký của bạn phải được đặt để www-datangười dùng có quyền truy cập vào chúng.


Tôi nghĩ rằng điều này nên tương đương với crontab -emặc dù; nhưng không.
zinking

5
Các tài liệu Ubuntu đã khuyến nghị không chỉnh sửa / etc / crontab vì nó có thể bị ghi đè bởi các bản cập nhật. crontab -e sẽ tạo một tệp cron dành riêng cho người dùng trong / var / spool / cron / crontabs.
Hemm

9

Bạn cũng có thể thử sử dụng runuser(với quyền root) để chạy lệnh với tư cách người dùng khác

*/1 * * * * runuser php5 \
            --command="/var/www/web/includes/crontab/queue_process.php \
                       >> /var/www/web/includes/crontab/queue.log 2>&1"

Xem thêm: man runuser


runuserkhông được bao gồm trong Ubuntu.
Raptor

1
Runuser là phiên bản mới nhất của Ubuntu. Ngoài ra còn có các lựa chọn thay thế cho runuser như được thảo luận trong câu trả lời này unix.stackexchange.com/questions/169441/ubfox-runuser-command , ví dụ su và sudo.
Russell E Glaue

8

Lời đề nghị của Mike nghe có vẻ như "đúng cách". Tôi đã bắt gặp chủ đề này muốn chỉ định người dùng chạy vncservertheo khởi động lại và muốn giữ tất cả các công việc định kỳ của tôi ở một nơi.

Tôi đã nhận được lỗi sau cho cron VNC:

vncserver: The USER environment variable is not set. E.g.:

Trong trường hợp của tôi, tôi đã có thể sử dụng sudođể chỉ định ai sẽ thực hiện nhiệm vụ như.

@reboot sudo -u [someone] vncserver ...

1
Tôi nhận được tin nhắn này trên nhật ký:sudo: sorry, you must have a tty to run sudo
Renato Gama

@renatoargh Có lẽ bạn đang chạy trên RedHat. Hãy xem câu trả lời này trên Unix.SE.
kaiser
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.