Временно запретить запуск Linux

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 4

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

#!/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

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

Ответ 5

Я не могу не чувствовать, что вы не собираете метафору Unix, и то, о чем вы просите, это kludge.

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

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

Ответ 6

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

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

Добавление следующих строк в качестве /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/info/17187/disabling-shutdown-command-for-all-users-even-root-consequences/17255#17255