команда не работает в cron (systemctl suspend)

12

У меня есть этот набор cronjob:

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

И это не работает. Но я могу запустить его в оболочке, и он работает. Я не понимаю, что может не работать.

РЕДАКТИРОВАТЬ Перенаправление вывода ошибок, чтобы получить /tmp/errorэто:

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

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

Дополнительное объяснение:

  • Это минимальный пример, показывающий проблему, с которой я сталкиваюсь в сценарии (это имеет больше смысла, чем приведенная здесь одна команда)

  • systemctlявляется частью systemd. Я думаю, перезагрузка, завершение работы, приостановка работы с пользователем без полномочий root systemd. Во всяком случае, это работает на моей системе.

  • Наконец, я использую Arch Linux и /bin, /usr/sbin, /sbinвсе символические ссылки на /usr/bin.

градиент
источник
1
Что именно вы пытаетесь сделать здесь? Что делает команда, когда вы запускаете ее в оболочке?
Terdon
Это приостанавливает мой компьютер
Градиент
И вы хотите, чтобы это происходило каждую минуту? Ваш systemctlесть, /usr/binи он так принимает suspend? Какой * nix вы используете?
Тердон
1
Нет, это пример. Это на самом деле в сценарии, который приостанавливается, когда батарея разряжена. Но это часть моего сценария, которая не работает. Я попытался привести минимальный пример проблемы (даже если это кажется бессмысленным).
Градиент
2
Хорошо, так как этот вопрос собирает закрытые голоса, отредактируйте его, чтобы добавить эту дополнительную информацию. Ваш дистрибутив важен ( systemctl suspendне работает на дистрибутивах Debian или RedHat) и поэтому объясняет, что вы на самом деле не хотите делать то, что вы показываете :). Кроме того, попробуйте добавить 2> /tmp/errorили что-нибудь, чтобы зафиксировать любые ошибки, которые вы можете получить. Наконец, сообщите нам, какой пользователь запускает этот crontab.
Тердон

Ответы:

6

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

Полкит необходим для управления питанием. Если вы находитесь в локальном сеансе пользователя systemd-logind и никакой другой сеанс не активен, следующие команды будут работать без прав root. Если нет (например, потому что другой пользователь вошел в tty), systemd автоматически запросит у вас пароль root.

[список различных команд systemctl]

systemctl приостановить

Это предлагает мне следующие возможности:

  1. Вы вошли в систему другого пользователя. Возможно, вы вошли через tty?

  2. cronзапускает свои команды, используя /bin/sh. По умолчанию в Arch это символическая ссылка на /bin/bash. Это будет означать, что cronзапускается неинтерактивная оболочка bash, которая затем обнаруживает, что запущен другой пользовательский сеанс (ваш), поэтому он не имеет права на запуск, systemctlнесмотря на то, что он работает как ваш пользователь.

Итак, если ваша проблема в том, что вам cronне разрешено работать, systemctlпотому что вы уже вошли в систему, вы можете обойти это, играя с polkit, но у меня нет опыта, поэтому я не могу помочь.

Тердон
источник
Спасибо! Первый вариант может быть исключен, поскольку я могу выполнить команду в оболочке. Но я сделаю еще несколько исследований о втором варианте.
Градиент
@ Градиент, ты узнал, как это исправить? Я борюсь с той же проблемой.
AkiRoss
Не могли бы вы объяснить вторую возможность более подробно? Есть ли способ подтвердить, что это действительно проблема? Я выполнил wи uptimeиз скриптов, запускаемых cron. Их выводы указывают на то, что был только пользователь. Значит ли это, что есть другая проблема?
Анмол Сингх Джагги
3

Простой обходной путь - использовать crontab root вместо вашего собственного. Отредактируйте его с помощью:

$ sudo crontab -e

вместо того:

$ crontab -e
Фредерик Бетенс
источник
Он запускает команды как пользователь root, а не как пользователь.
Фредерик
Это не должно быть рекомендуемой практикой ... заставить команду работать для пользователя.
Плиттер
1

Цитирую отсюда :

Другой ответ великолепен! Но для этого нужен root cron.

Если вы хотите перейти в спящий режим от не-sudo cron, есть 2 варианта:

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. Использование visudo

Цитирую отсюда :

Если пользователям разрешено использовать только команды выключения, но нет других привилегий sudo, то в качестве пользователя root добавьте следующее в конец /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 hibernatefron cron в спящий режим.

Примечание: Непосредственно изменение /etc/sudoersявляется плохим ; вместо этого создайте собственный файл sudoers /etc/sudoers.d/с помощью команды - sudo visudo -f /etc/sudoers.d/custom.

Анмол Сингх Джагги
источник
0

Если вы используете системный crontab, то вы забыли поле пользователя. Пытаться:

* * * * * root /usr/bin/systemctl suspend
Мартин фон Виттих
источник
Вы уверены, что есть поле пользователя? Я никогда не видел cronjob с этим прежде. В любом случае, команда работает, когда я запускаю ее как пользователь в оболочке.
Градиент
2
@Gradient есть пользовательское поле, если вы используете /etc/crontab, это crontab, который вы создали cron -eкак обычный пользователь?
Тердон
Это crontab, который я создал crontab -eкак обычный пользователь.
Градиент
Ваша обычная учетная запись пользователя, вероятно, не имеет разрешения на запуск systemctl suspendбез sudo.
Cas
0

Вам нужно использовать конфигурационный файл systemd в /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
Джеймс М
источник