LINUX.ORG.RU

Усыпить linux по cron'у командой systemctl suspend

 , , ,


0

2

Наткнулся на очередную проблему с переходом на systemd: Хочу по крону усыплять компьютер.
Если просто в консоли пишу systemctl suspend — всё работает отлично, если вызвать скрипт с этой командой из крона — не засыпает.
journalctl пишет:

pam_unix(crond:session): session opened for user constantin by (uid=0)
(constantin) CMD ("/home/data/scripts/suspend.sh")
(constantin) CMDOUT (Failed to issue method call: Access denied)
[system] Rejected send message, 2 matched rules; type="method_call", sender=":1.26" (uid=1000 pid=873 comm="/usr/bin/systemctl suspend ") interface="org.freedesktop.systemd1.Manager" member="StartUnit" error name="(unset)" requested_reply="0" destination="org.freedesktop.systemd1" (uid=0 pid=1 comm="/bin/systemd ")
(constantin) CMDOUT (Failed to issue method call: Access denied)
pam_unix(crond:session): session closed for user constantin
dbus[381]: [system] Rejected send message, 2 matched rules; type="method_call", sender=":1.26" (uid=1000 pid=873 comm="/usr/bin/systemctl suspend ") interface="org.freedesktop.systemd1.Manager" member="StartUnit" error name="(unset)" requested_reply="0" destination="org.freedesktop.systemd1" (uid=0 pid=1 comm="/bin/systemd ")
Тоже самое с командой
dbus-send --system --print-reply --dest="org.freedesktop.UPower" /org/freedesktop/UPower org.freedesktop.UPower.Suspend
Просто из консоли — работает. Из крона:
pam_unix(crond:session): session opened for user constantin by (uid=0)
(constantin) CMD ("/home/data/scripts/suspend.sh")
(constantin) CMDOUT (Error org.freedesktop.UPower.GeneralError: not authorized)
pam_unix(crond:session): session closed for user constantin
Судя по (uid=1000 pid=873 comm=«/usr/bin/systemctl suspend ») — uid моего пользователя, от которого с консоли команда работает.
Как дать нужные права крону? Или как это можно побороть?

★★★★

Усыпить Поттеринга

nuf said.

beastie ★★★★★ ()

Из крона не работает, потому что для успешного вызова данного метода по D-Bus пользователь должен быть активным для polkit, а крон не открывает сессию через ConsoleKit или pam_systemd, а если и откроет, она не будет активной. Нужно либо настроить polkit, чтобы он не требовал для org.freedesktop.UPower.Suspend активности сессии пользователя, либо усыплять от рута командой pm-suspend.

gentoo_root ★★★★★ ()
Ответ на: Google is your friend! от beastie

Нет. По ссылке у человека вообще не работают команды усыпыть/перезагрузить/выключить — это частая ситуация и легко гуглиться. Сессию иксов я запускаю как надо через консолькиты и проч проч. В иксах, у меня например, забиндено на кнопку на клаве systemctl suspend — и всё работает — при нажатии на кнопку засыпает.
В терминал в иксах/без_иксов ввожу эту команду — тоже работает.
Из крона — всё равно не работает. :)

Bad_ptr ★★★★ ()
Ответ на: Google is your friend! от beastie

какого хрена systemd лезет в X11 мне не понятно

Конечно, не понятно, потому что он вообще туда не лезет. К тому же, у systemd есть systemd-logind, которым лучше заменить устаревший ConsoleKit. Systemd-logind работает через PAM и не требует ни запуска аналога команды ck-launch-session, ни иксов.

gentoo_root ★★★★★ ()
Ответ на: комментарий от Bad_ptr

Для старого polkit что-то типа этого:

[Permit suspend]
Identity=unix-user:username
Action=org.freedesktop.upower.suspend
ResultAny=yes

Для нового (с конфигами на javascript):

polkit.addRule(function(action, subject) {
 if (subject.user == "username") {
  if (action.id == "org.freedesktop.upower.suspend") {
   return "yes";
	 }
 }
}
gentoo_root ★★★★★ ()
Ответ на: комментарий от gentoo_root

Сделал так:

[UPowerSuspend]
Identity=unix-group:users
Action=org.freedesktop.UPower.Suspend
ResultAny=yes
ResultInactive=yes
ResultActive=yes

[SystemdSuspend]
Identity=unix-group:users
Action=org.freedesktop.login1.suspend
ResultAny=yes
ResultInactive=yes
ResultActive=yes

[SystemdSuspendMultiple]
Identity=unix-group:users
Action=org.freedesktop.login1.suspend-multiple-sessions
ResultAny=yes
ResultInactive=yes
ResultActive=yes
Заработало.
А можно для одной секции задавать несколько Action?

Bad_ptr ★★★★ ()
Ответ на: комментарий от Bad_ptr

да, если вдруг кому-то понадобится это всё нужно положить в файл /etc/polkit-1/localauthority/50-local.d/my-suspend-rules.pkla

Bad_ptr ★★★★ ()
Ответ на: комментарий от Bad_ptr

А можно для одной секции задавать несколько Action?

Можно, например, так:

Action=org.freedesktop.UPower.Suspend;org.freedesktop.login1.suspend;org.freedesktop.login1.suspend-multiple-sessions
gentoo_root ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.