Временно предотвратить выключение Linux - PullRequest
11 голосов
/ 27 ноября 2008

У меня есть скрипт резервного копирования, который ежедневно запускается в фоновом режиме на моем компьютере с Linux (Fedora 9). Если компьютер выключен во время резервного копирования, резервная копия может быть повреждена, поэтому я хотел бы написать небольшой сценарий, который временно отключает возможность перезагрузки или выключения компьютера пользователем.

Нет необходимости в том, чтобы сценарий был необновляемым, достаточно просто сообщить пользователям системы, что выполняется резервное копирование, и они не должны закрываться. Я видел метод Inhibit в спецификации управления питанием рабочего стола DBus Free: http://people.freedesktop.org/~hughsient/temp/power-management-spec-0.3.html но это предотвращает только выключения, если система простаивает не явно по запросу пользователя.

Есть ли простой способ сделать это в C / Python / Perl или bash?

Обновление: Чтобы прояснить вопрос выше, это машина с несколькими пользователями, но которые используют ее последовательно через подключенную клавиатуру / мышь. Я не ищу систему, которая бы помешала мне "взломать" ее как root. Но сценарий, который напомнил бы мне (или другому пользователю), что резервное копирование все еще выполняется, когда я выбираю выключение из меню Gnome / GDM

Ответы [ 6 ]

8 голосов
/ 27 ноября 2008

Другое решение для начала работы: во время выключения система запускает сценарии в /etc/init.d/ (или, на самом деле, сценарий в /etc/rc.*/, но вы поняли идею.) Вы может создать сценарий в этом каталоге, который проверяет состояние вашей резервной копии и задерживает ее до завершения резервного копирования. Или еще лучше, он изящно прерывает вашу резервную копию.

Суперпользователь может обойти этот сценарий (например, с помощью / sbin / halt), но вы не можете запретить суперпользователю что-либо делать, если его разум действительно настроен на это.

4 голосов
/ 19 мая 2013

Существует molly-guard для предотвращения случайных выключений, перезагрузок и т. Д. До тех пор, пока не будут выполнены все необходимые условия - условия могут быть определены самостоятельно.

Как уже предлагалось, вы также можете выполнять операции резервного копирования как часть процесса выключения. См. Например эту страницу .

2 голосов
/ 13 марта 2009

Если пользователи собираются завершить работу через GNOME / KDE, просто запретите им сделать это.

http://live.gnome.org/GnomePowerManager/FAQ#head-1cf52551bcec3107d7bae8c332fd292ec2261760

1 голос
/ 27 ноября 2008

Больше, чем начало работы, чем полное решение, вы можете использовать псевдоним команды выключения, а затем использовать скрипт типа

#!/bin/sh
ps -ef|grep backupprocess|grep -v grep > /dev/null
if [ "$?" -eq 0 ]; then
 echo Backup in progress: aborted shutdown
 exit 0
else
 echo Backup not in progress: shutting down
 shutdown-alias -h now
fi

сохранено в пути пользователя как завершение работы. Я ожидаю, что будут некоторые вариации, зависящие от того, как ваши пользователи вызывают завершение работы (значки оконного менеджера / командная строка) и, возможно, также для разных дистрибутивов.

0 голосов
/ 16 апреля 2016

Но скрипт, который напомнил бы мне (или другому пользователю), что резервное копирование все еще выполняется, когда я выбираю завершение работы из меню Gnome / GDM

Можно использовать polkit, чтобы полностью заблокировать выключение / перезапуск, но мне не удалось найти метод, который бы дал четкий ответ, почему он заблокирован.

Добавление следующих строк как /etc/polkit-1/localauthority/50-local.d/restrict-login-powermgmt.pkla работает:

[Disable lightdm PowerMgmt]
Identity=unix-user:*
Action=org.freedesktop.login1.reboot;org.freedesktop.login1.reboot-multiple-sessions;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;org.freedesktop.login1.suspend;org.freedesktop.login1.suspend-multiple-sessions;org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=no
ResultInactive=no
ResultActive=no

Вы по-прежнему видите диалоговое окно подтверждения, но нет кнопок для подтверждения. Выглядит некрасиво, но работает;)

К сожалению, это относится ко всем пользователям, а не только к сеансу lightdm, поэтому при желании вы должны добавить второе правило в белый список.

Обратите внимание, что этот метод блокирует только команды перезагрузки / etc, выполненные из графического интерфейса. Для блокировки команд перезагрузки / etc из командной строки можно использовать molly-guard - как описано в https://askubuntu.com/questions/17187/disabling-shutdown-command-for-all-users-even-root-consequences/17255#17255

0 голосов
/ 27 ноября 2008

Не могу не почувствовать, что вы не впадаете в метафору Unix, а то, что вы просите, - это помеха.

Если пользователь, работающий с правами root, root не сможет ничего сделать, чтобы остановить завершение работы root! Вы можете заниматься оформлением витрин, например скрывать интерфейс выключения, но на самом деле это ничего не дает.

Я не могу сказать, говорите ли вы об этом в контексте многопользовательской машины или машины, используемой в качестве «настольного ПК» с одним пользователем, сидящим за консолью. Если это первое, ваши пользователи на самом деле не должны получать доступ к компьютеру с учетными данными, которые могут отключить систему для повседневной деятельности. Если это последнее, я бы рекомендовал обучить пользователей либо (а) проверять, запущен ли сценарий, либо (б) использовать определенный сценарий выключения, который вы определяете, который проверяет процесс сценария и отказывается завершать работу, пока он не исчезнет.

...