команда не запущена в cron (systemctl suspend)

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

* * * * * /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 . Я думаю, что перезагрузка, shutdown, suspend работают с пользователем без systemd root с systemd . Во всяком случае, он работает над моей системой.

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

  • Сетевое соединение / var с systemd
  • systemd: остановить все процессы OpenVPN
  • Использование переменных в скрипте systemd init
  • Почему мой IP-адрес меняет каждый раз при запуске нового rootfs?
  • Перезапуск службы Systemd Unit при запуске или перезагрузке другого сервиса
  • Извлеките / замените системное требование с помощью вставки
  • Почему система останавливает сервис сразу после его запуска?
  • симуляция режима systemd
  • 5 Solutions collect form web for “команда не запущена в cron (systemctl suspend)”

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

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

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

    systemctl suspend

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

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

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

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

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

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

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

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

    Если вы хотите спящий режим из non-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 poweroff и перезагрузиться при перезагрузке sudo systemctl reboot . Пользователи, желающие отключить систему, также могут использовать sudo systemctl halt .
    Используйте тег NOPASSWD: только если вы не хотите получать запрос на ввод пароля.

    В моем случае точная строка:

     anmol ALL=NOPASSWD: /bin/systemctl hibernate 

    (Обратите внимание, что расположение systemctl может отличаться в вашей системе.)

    После этого вы можете написать sudo systemctl hibernate cron для спящего режима.

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

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

     $ sudo crontab -e 

    вместо:

     $ crontab -e 

    Вам нужно использовать файл конфигурации 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 
    Interesting Posts

    Как регистрировать все системные вызовы, сделанные программой, скажем, хром, используя аудит linux?

    Статистика «Memcache» сообщает о ненулевых «curr_connections», но lsof не показывает соединений сокетов

    RHEL установлен один раз, но отображается трижды в меню загрузчика GRUB

    Тест POSIX и -a

    Как явным образом и безопасно принудительно использовать встроенную команду в bash

    Настройте среду для кросс-компиляции на i386, armel, armhf, arm64 и mips без конфликтов libglib2

    Создать каталог с именем из времени изменения файла

    Несоответствие конфигурации звуковой карты между pi и root

    Debian не может подключиться к университету Wi-Fi через невольный портал

    Как SSH отображает сообщение «Невозможно установить подлинность хоста ..»?

    Диагональный вывод файла

    Сохранение видеоизображений движения на USB-накопителе

    Установите VM из командной строки с помощью virt-install

    Как эхо-строку с несколькими пробелами в bash «нетронутой»?

    как получить полный аргумент командной строки, переданный процессу в системах unix / linux?

    Linux и Unix - лучшая ОС в мире.