команда не працює в cron (systemctl призупинити)


12

У мене є цей набір кронових завдань:

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

І це не працює. Але я можу запустити його в оболонці, і це працює. Я не розумію, що може не працювати.

EDIT Перенаправлення помилки виводу для отримання /tmp/errorцього:

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

Моє запитання тоді: чи виконується cronjobs як спеціальний користувач ( cronнаприклад), який би пояснив, що мій користувач може виконувати команду, але не cronсам?

Додаткове пояснення:

  • Це мінімальний приклад, щоб показати проблему, яку я маю в сценарії (це має більше сенсу, ніж окрема команда, надана тут)

  • systemctlє частиною systemd. Я думаю, що перезавантаження, вимкнення, призупинення працюють з користувачем, який не працює в корені systemd. У будь-якому випадку, це працює в моїй системі.

  • Нарешті, я використовую Arch Linux і /bin, /usr/sbin, /sbinвсе символічні посилання на /usr/bin.


1
Що саме ви намагаєтеся зробити тут? Що робить команда, коли ви запускаєте її в оболонці?
terdon

Це призупиняє мій комп'ютер
Gradient

А ви хочете, щоб це відбувалося щохвилини? Ви systemctlє, /usr/binі це приймає suspendтак? Який * nix ви використовуєте?
terdon

1
Ні, це приклад. Це насправді за сценарієм, який призупиняється, коли енергія акумулятора низька. Але це та частина мого сценарію, яка не працює. Я намагався дати мінімальний приклад проблеми (навіть якщо це, здається, не має сенсу).
Градієнт

2
Гаразд, оскільки це питання набирає закритих голосів, відредагуйте його, щоб додати цю додаткову інформацію. Ваш дистрибутив є важливим ( systemctl suspendне працює на Debian або RedHat дистрибутивах) і тому пояснює, що ви насправді не хочете робити те, що показуєте :). Крім того, спробуйте додати 2> /tmp/errorабо щось, щоб зафіксувати будь-які помилки, які ви могли отримати. Нарешті, розкажіть, який користувач працює під цим кронтом.
terdon

Відповіді:


6

Я не можу реально відповісти як такий, але я думаю, що можу направити вас у правильному напрямку. Я знайшов це в Arch Wiki сторінки з systemd:

polkit необхідний для управління енергією. Якщо ви перебуваєте в локальному сеансі користувача systemd-logind, і жоден інший сеанс не активний, наступні команди працюватимуть без привілеїв root. Якщо ні (наприклад, через те, що інший користувач увійшов у tty), systemd автоматично попросить вас кореневий пароль.

[список різних команд systemctl]

systemctl призупинити

Це пропонує мені такі можливості:

  1. У вас увійшов інший користувач. Можливо, ви ввійшли через tty?

  2. cronзапускає свої команди, використовуючи /bin/sh. За замовчуванням в Arch це символьне посилання на /bin/bash. Це означатиме, що cronзапускається неінтерактивна оболонка bash, яка потім виявляє, що працює інший сеанс користувача (ваш), тому він не має права запускатись, systemctlнезважаючи на те, що працює як ваш користувач.

Отже, якщо ваша проблема полягає в тому cron, що не дозволяється запускатись, systemctlоскільки ви вже ввійшли в систему, ви можете це обійти, граючи з polkit, але я не маю там досвіду, тому я не можу допомогти.


Дякую! Перший варіант можна усунути, оскільки я в змозі виконати команду в оболонці. Але я проведу ще кілька досліджень щодо другого варіанту.
Градієнт

@Gradient Ви дізналися, як це виправити? Я борюся з тією ж проблемою.
AkiRoss

Не могли б ви пояснити другу можливість більш детально? Чи є спосіб підтвердити, що це справді проблема? Я виконував wі uptimeзі скриптів, керованих cron. Їх результати показували, що є лише користувач. Отже, чи означає це, що є якась інша проблема?
Anmol Singh Jaggi

3

Просте вирішення - використовувати crontab root замість власного. Відредагуйте його за допомогою:

$ sudo crontab -e

замість:

$ crontab -e

Він виконує команди як root, а не ваш користувач.
Фредерік Баєтенс

Це не повинно бути рекомендованою практикою ... змусити команду працювати для користувача.
плітка

1

Цитуючи звідси :

Інша відповідь чудова! Але для цього потрібен кореневий крон.

Якщо ви хочете перезимувати з не-sudo cron, є два варіанти:

1. Використання polkit

Створіть файл, що містить:

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

названий com.0.enable-hibernation-from-cron.pklaу довіднику /etc/polkit-1/localauthority/50-local.d/.

Пояснення дано тут .

2. Використання візудо

Цитуючи звідси :

Якщо користувачам слід дозволити використовувати лише команди відключення, але вони не мають інших привілеїв sudo, тоді, як корінь, додайте наступне до кінця /etc/sudoersвикористання visudoкоманди.

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

Замініть userсвоє ім'я користувача та hostnameім'я хоста машини.
Тепер ваш користувач може відключити sudo systemctl poweroffта перезавантажити sudo systemctl reboot. Користувачі, які бажають вимкнути систему, також можуть використовувати sudo systemctl halt.
Використовуйте тег NOPASSWD: лише в тому випадку, якщо ви не хочете, щоб вас запросили пароль.

У моєму випадку точний рядок:

anmol ALL=NOPASSWD: /bin/systemctl hibernate

(Зверніть увагу, що у systemctlвашій системі місце розташування може бути різним.)

Після цього ви можете написати sudo systemctl hibernateлобовий крон в сплячку.

Примітка: Безпосередньо зміна /etc/sudoersє поганим ; замість цього створіть спеціальний файл судорів за /etc/sudoers.d/допомогою команди - sudo visudo -f /etc/sudoers.d/custom.


0

Якщо ви використовуєте системний crontab, ви забудете поле користувача. Спробуйте:

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

Ви впевнені, що є поле користувача? Я ніколи раніше не бачив з цим кроні. У будь-якому випадку команда працює, коли я запускаю її як користувач в оболонці.
Градієнт

2
@Gradient є поле користувача, якщо ви користуєтесь /etc/crontab, це це кротобук, який ви створили cron -eяк звичайний користувач?
тердон

Це crontab, з яким я створив себе crontab -eяк звичайний користувач.
Градієнт

ваш звичайний обліковий запис користувача, ймовірно, не має дозволу на запуск systemctl suspendбез sudo.
cas

-1

Вам потрібно використовувати системний конфігураційний файл у /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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.