perintah tidak berjalan di cron (systemctl menangguhkan)

12

Saya memiliki set cronjob ini:

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

Dan itu tidak berfungsi. Tapi saya bisa menjalankannya di shell dan berfungsi. Saya tidak mengerti apa yang mungkin tidak berhasil.

EDIT Mengarahkan output kesalahan untuk /tmp/errormemberikan ini:

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

Pertanyaan saya adalah: Apakah cronjobs dijalankan sebagai pengguna khusus ( cronmisalnya), yang akan menjelaskan bahwa pengguna saya dapat menjalankan perintah, tetapi tidak dengan cronsendirinya?

Penjelasan tambahan:

  • Ini adalah contoh minimal untuk menunjukkan masalah yang saya miliki dalam skrip (yang lebih masuk akal daripada perintah tunggal yang disediakan di sini)

  • systemctladalah bagian dari systemd. Saya pikir reboot, shutdown, suspend bekerja dengan pengguna non-root systemd. Bagaimanapun, ini bekerja pada sistem saya.

  • Akhirnya, saya menggunakan Arch Linux dan /bin, /usr/sbin, /sbinsemua symlink untuk /usr/bin.

Gradien
sumber
1
Apa yang sebenarnya ingin Anda lakukan di sini? Apa yang dilakukan perintah ketika Anda menjalankannya di shell?
terdon
Itu menangguhkan komputer saya
Gradient
Dan apakah Anda ingin itu terjadi setiap menit? Anda systemctlmasuk /usr/bindan menerima suspendseperti itu? Apa * nix yang Anda gunakan?
terdon
1
Tidak, ini sebuah contoh. Ini sebenarnya dalam skrip yang ditunda ketika daya baterai rendah. Tetapi ini adalah bagian dalam skrip saya yang tidak berfungsi. Saya mencoba memberikan contoh minimal masalah (bahkan jika ini tampaknya tidak masuk akal).
Gradient
2
OK, karena pertanyaan ini mengumpulkan suara dekat, harap edit untuk menambahkan info tambahan ini. Distro Anda penting ( systemctl suspendtidak berfungsi pada distro Debian atau RedHat) dan begitu juga menjelaskan bahwa Anda sebenarnya tidak ingin melakukan apa yang Anda tunjukkan :). Juga, coba tambahkan 2> /tmp/erroratau sesuatu untuk menangkap kesalahan yang mungkin Anda dapatkan. Akhirnya, beri tahu kami pengguna mana yang menjalankan crontab ini.
terdon

Jawaban:

6

Saya tidak bisa menjawab, tetapi saya pikir saya bisa mengarahkan Anda ke arah yang benar. Saya menemukan ini di Arch Wiki halaman dari systemd:

polkit diperlukan untuk manajemen daya. Jika Anda berada di sesi pengguna systemd-logind lokal dan tidak ada sesi lain yang aktif, perintah berikut ini akan bekerja tanpa hak root. Jika tidak (misalnya, karena pengguna lain masuk ke tty), systemd akan secara otomatis menanyakan kata sandi root Anda.

[daftar berbagai perintah systemctl]

systemctl menangguhkan

Ini menunjukkan kepada saya kemungkinan berikut:

  1. Anda memiliki pengguna lain yang masuk. Mungkin Anda telah masuk melalui tty?

  2. cronmenjalankan perintahnya menggunakan /bin/sh. Secara default , pada Arch ini adalah symlink ke /bin/bash. Ini berarti cronmemulai bash shell non-interaktif yang kemudian mendeteksi bahwa ada sesi pengguna lain yang sedang berjalan (milik Anda), sehingga tidak memiliki hak untuk berjalan systemctlmeskipun berjalan sebagai pengguna Anda.

Jadi, jika masalah Anda adalah karena crontidak diizinkan berjalan systemctlkarena Anda sudah masuk, Anda mungkin dapat mengatasinya dengan bermain dengan polkit tetapi saya tidak memiliki pengalaman di sana sehingga saya tidak dapat membantu.

terdon
sumber
Terima kasih! Opsi pertama dapat dihilangkan karena saya dapat menjalankan perintah di shell. Tapi saya akan melakukan penelitian lebih lanjut tentang opsi kedua.
Gradient
@ Gradient, apakah Anda menemukan cara untuk memperbaikinya? Saya berjuang dengan masalah yang sama.
AkiRoss
Bisakah Anda jelaskan kemungkinan kedua secara lebih rinci? Apakah ada cara untuk mengkonfirmasi bahwa ini memang masalahnya? Saya dieksekusi wdan uptimedari skrip dijalankan oleh cron. Keluaran mereka menunjukkan bahwa hanya ada pengguna. Jadi, apakah ini berarti ada masalah lain?
Anmol Singh Jaggi
3

Solusi yang mudah adalah dengan menggunakan crontab root bukan milik Anda. Edit dengan:

$ sudo crontab -e

dari pada:

$ crontab -e
Frederik Baetens
sumber
Ini menjalankan perintah sebagai root daripada pengguna Anda.
Frederik Baetens
Ini seharusnya bukan praktik yang disarankan ... buat perintah berfungsi untuk pengguna.
pemoles
1

Mengutip dari sini :

Jawaban lainnya bagus! Tetapi membutuhkan root cron.

Jika Anda ingin hibernasi dari cron non-sudo, ada 2 opsi:

1. Menggunakan polkit

Buat file yang berisi berikut ini:

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

disebutkan com.0.enable-hibernation-from-cron.pkladalam direktori /etc/polkit-1/localauthority/50-local.d/.

Penjelasan diberikan di sini .

2. Menggunakan visudo

Mengutip dari sini :

Jika pengguna hanya diizinkan menggunakan perintah shutdown, tetapi tidak memiliki hak sudo lain, maka, sebagai root, tambahkan berikut ini di akhir /etc/sudoersmenggunakan visudoperintah.

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

Pengganti useruntuk nama pengguna Anda dan hostnameuntuk nama host mesin.
Sekarang pengguna Anda dapat mematikan dengan sudo systemctl poweroff, dan reboot dengan sudo systemctl reboot. Pengguna yang ingin mematikan sistem juga dapat menggunakan sudo systemctl halt.
Gunakan tag NOPASSWD: hanya jika Anda tidak ingin dimintai kata sandi.

Dalam kasus saya, baris yang tepat adalah:

anmol ALL=NOPASSWD: /bin/systemctl hibernate

(Perhatikan bahwa lokasi systemctlmungkin berbeda pada sistem Anda.)

Setelah ini, Anda dapat menulis sudo systemctl hibernatefron cron untuk hibernasi.

Catatan: Memodifikasi secara langsung /etc/sudoersadalah buruk ; alih-alih buat file sudoers khusus dengan /etc/sudoers.d/menggunakan perintah - sudo visudo -f /etc/sudoers.d/custom.

Anmol Singh Jaggi
sumber
0

Jika Anda menggunakan sistem crontab, maka Anda lupa bidang pengguna. Mencoba:

* * * * * root /usr/bin/systemctl suspend
Martin von Wittich
sumber
Apakah Anda yakin ada bidang pengguna? Saya belum pernah melihat cronjob dengannya. Lagi pula, perintah itu berfungsi ketika saya menjalankannya sebagai pengguna di shell.
Gradient
2
@ Gradient ada bidang pengguna jika Anda menggunakan /etc/crontab, apakah ini crontab yang Anda buat cron -esebagai pengguna normal?
terdon
Ini adalah crontab yang saya buat dengan crontab -esebagai pengguna normal.
Gradient
akun pengguna normal Anda mungkin tidak memiliki izin untuk berjalan systemctl suspendtanpa sudo.
cas
0

Anda perlu menggunakan file konfigurasi systemd di /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
James M
sumber