lệnh không chạy trong cron (đình chỉ systemctl)


12

Tôi có bộ cronjob này:

* * * * * /usr/bin/systemctl suspend

Và nó không hoạt động. Nhưng tôi có thể chạy nó trong một cái vỏ và nó hoạt động. Tôi không hiểu những gì có thể không hoạt động.

EDIT Chuyển hướng đầu ra lỗi để /tmp/errorcung cấp cho điều này:

Failed to issue method call: Access denied
Failed to issue method call: Access denied

Câu hỏi của tôi là: Các cronjobs có chạy như một người dùng đặc biệt không ( cronví dụ), điều này sẽ giải thích rằng người dùng của tôi có thể chạy lệnh, nhưng không phải cronchính nó?

Giải thích thêm:

  • Đây là một ví dụ tối thiểu để hiển thị một vấn đề tôi gặp phải trong một tập lệnh (có ý nghĩa hơn so với lệnh đơn được cung cấp ở đây)

  • systemctllà một phần của systemd. Tôi nghĩ khởi động lại, tắt máy, tạm dừng đang làm việc với người dùng không root systemd. Dù sao, nó đang làm việc trên hệ thống của tôi.

  • Cuối cùng, tôi sử dụng Arch Linux và /bin, /usr/sbin, /sbintất cả đều liên kết tượng trưng đến /usr/bin.


1
Chính xác thì bạn đang cố gắng làm gì ở đây? Lệnh này làm gì khi bạn chạy nó trong shell?
terdon

Nó treo máy tính của tôi
Gradient

Và bạn có muốn điều đó xảy ra mỗi phút? Bạn systemctlđang ở /usr/binvà nó chấp nhận suspendnhư thế? Bạn đang sử dụng cái gì?
terdon

1
Không, đó là một ví dụ. Nó thực sự nằm trong một kịch bản tạm dừng khi pin yếu. Nhưng đây là phần trong kịch bản của tôi không hoạt động. Tôi đã cố gắng đưa ra một ví dụ tối thiểu về vấn đề (ngay cả khi điều này dường như không có ý nghĩa).
Gradient

2
OK, vì câu hỏi này đang thu thập phiếu bầu gần, vui lòng chỉnh sửa nó để thêm thông tin bổ sung này. Bản phân phối của bạn rất quan trọng ( systemctl suspendkhông hoạt động trên các bản phân phối Debian hoặc RedHat) và vì vậy giải thích rằng bạn không thực sự muốn làm những gì bạn đang hiển thị :). Ngoài ra, hãy thử thêm 2> /tmp/errorhoặc một cái gì đó để nắm bắt bất kỳ lỗi nào bạn có thể nhận được. Cuối cùng, cho chúng tôi biết người dùng nào đang chạy crontab này.
terdon

Câu trả lời:


6

Tôi thực sự không thể trả lời như vậy nhưng tôi nghĩ tôi có thể chỉ cho bạn đi đúng hướng. Tôi thấy điều này trong Arch Wiki trang của systemd:

Polkit là cần thiết để quản lý năng lượng. Nếu bạn đang ở trong phiên người dùng đăng nhập hệ thống cục bộ và không có phiên nào khác đang hoạt động, các lệnh sau sẽ hoạt động mà không có quyền root. Nếu không (ví dụ: vì một người dùng khác đã đăng nhập vào tty), systemd sẽ tự động hỏi bạn mật khẩu gốc.

[danh sách các lệnh systemctl khác nhau]

đình chỉ hệ thống

Điều này gợi ý cho tôi những khả năng sau:

  1. Bạn có một người dùng khác đã đăng nhập. Có lẽ bạn đã đăng nhập thông qua một tty?

  2. cronchạy các lệnh của nó bằng cách sử dụng /bin/sh. Theo mặc định , trên Arch đây là một liên kết tượng trưng đến /bin/bash. Điều này có nghĩa cronlà đang bắt đầu một bash shell không tương tác, sau đó phát hiện ra rằng có một phiên người dùng khác đang chạy (của bạn), vì vậy nó không có quyền chạy systemctlmặc dù chạy như người dùng của bạn.

Vì vậy, nếu vấn đề của bạn là do cronkhông được phép chạy systemctlvì bạn đã đăng nhập, bạn có thể khắc phục bằng cách chơi với polkit nhưng tôi không có kinh nghiệm ở đó nên tôi không thể giúp được.


Cảm ơn bạn! Tùy chọn đầu tiên có thể được loại bỏ vì tôi có thể thực thi lệnh trong shell. Nhưng tôi sẽ làm một số nghiên cứu thêm về tùy chọn thứ hai.
Gradient

@Gradient bạn đã khám phá ra cách khắc phục điều này chưa? Tôi đang vật lộn với cùng một vấn đề.
AkiRoss

Bạn có thể vui lòng giải thích khả năng thứ hai chi tiết hơn? Có cách nào để xác nhận rằng đây thực sự là vấn đề? Tôi thực hiện wuptimetừ các kịch bản chạy bởi cron. Đầu ra của họ chỉ ra rằng chỉ có người dùng. Vì vậy, điều này có nghĩa là có một số vấn đề khác?
Anmol Singh Jaggi

3

Một cách giải quyết dễ dàng là sử dụng crontab của root thay vì của riêng bạn. Chỉnh sửa nó bằng:

$ sudo crontab -e

thay vì:

$ crontab -e

Nó chạy các lệnh như root chứ không phải người dùng của bạn.
Frederik Baetens

Điều này không nên là một thực hành được khuyến nghị ... làm cho lệnh hoạt động cho người dùng.
plitter

1

Trích dẫn từ đây :

Câu trả lời khác là tuyệt vời! Nhưng nó đòi hỏi cron gốc.

Nếu bạn muốn ngủ đông từ cron không sudo, có 2 tùy chọn:

1. Sử dụng polkit

Tạo một tệp có chứa như sau:

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes 

có tên com.0.enable-hibernation-from-cron.pklatrong thư mục /etc/polkit-1/localauthority/50-local.d/.

Giải thích được đưa ra ở đây .

2. Sử dụng visudo

Trích dẫn từ đây :

Nếu người dùng chỉ được phép sử dụng các lệnh tắt máy, nhưng không có các đặc quyền sudo khác, thì, với quyền root, hãy thêm phần sau vào cuối /etc/sudoerssử dụng visudolệnh.

user hostname =NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot

Thay thế usercho tên người dùng của bạn và hostnamecho tên máy chủ của máy.
Bây giờ người dùng của bạn có thể tắt máy sudo systemctl poweroffvà khởi động lại với sudo systemctl reboot. Người dùng muốn tắt nguồn hệ thống cũng có thể sử dụng sudo systemctl halt.
Chỉ sử dụng thẻ NOPASSWD: nếu bạn không muốn được nhắc nhập mật khẩu.

Trong trường hợp của tôi, dòng chính xác là:

anmol ALL=NOPASSWD: /bin/systemctl hibernate

(Lưu ý rằng vị trí của systemctlcó thể khác trên hệ thống của bạn.)

Sau này, bạn có thể viết sudo systemctl hibernatefron cron để ngủ đông.

Lưu ý: Sửa đổi trực tiếp /etc/sudoersxấu ; thay vào đó hãy tạo một tệp sudoers tùy chỉnh /etc/sudoers.d/bằng cách sử dụng lệnh - sudo visudo -f /etc/sudoers.d/custom.


0

Nếu bạn đang sử dụng crontab hệ thống, thì bạn sẽ quên trường người dùng. Thử:

* * * * * root /usr/bin/systemctl suspend

Bạn có chắc chắn có một lĩnh vực người dùng? Tôi chưa bao giờ thấy một cronjob với nó trước đây. Dù sao, lệnh hoạt động khi tôi chạy nó như một người dùng trong shell.
Gradient

2
@Gradient có một trường người dùng nếu bạn đang sử dụng /etc/crontab, đây có phải là một crontab bạn đã tạo với cron -etư cách là người dùng bình thường của bạn không?
terdon

Nó là một crontab tôi tạo ra crontab -enhư một người dùng bình thường.
Gradient

tài khoản người dùng bình thường của bạn có thể không có quyền chạy systemctl suspendmà không có sudo.
cas

0

Bạn cần sử dụng tập tin cấu hình systemd trong /etc/systemd/system

[Unit]
Description=Pimcore Events Processor

[Service]
WorkingDirectory=/var/www/html
ExecStart=/usr/bin/php run something
Restart=always
WatchdogSec=300 #in seconds
User=www-data
Group=www-data

[Install]
WantedBy=multi-user.target
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.