暂时阻止linux关闭

时间:2008-11-26 21:39:48

标签: linux shutdown dbus

我有一个备份脚本,每天在我的linux(Fedora 9)计算机上运行。如果在备份过程中计算机已关闭,则备份可能已损坏,因此我想编写一个小脚本,暂时禁用用户重启或关闭计算机的能力。

脚本没有必要是不可靠的,它只是让系统用户知道备份正在进行而且不应该关闭。我在DBus Free桌面电源管理规范上看到过Inhibit方法: http://people.freedesktop.org/~hughsient/temp/power-management-spec-0.3.html 但是,如果系统在用户请求中没有明确地处于空闲状态,那么这只会阻止关闭。

在C / Python / Perl或bash中有一种简单的方法吗?

更新:为了澄清上述问题,它是一台拥有多个用户的计算机,但是通过插入的键盘/鼠标顺序使用它。我不是在寻找能够阻止我以root身份“劈砍”它的系统。但是当我选择从Gnome / GDM菜单关闭时,一个会提醒我(或其他用户)备份仍在运行的脚本

6 个答案:

答案 0 :(得分:8)

另一个入门解决方案:在关机期间,系统运行/etc/init.d/中的脚本(或者实际上是/etc/rc.*/中的脚本,但你明白了。)你可以在该目录中创建一个检查备份状态的脚本,并且延迟关闭直到备份完成。或者更好的是,它会优雅地中断您的备份。

超级用户可以解决此脚本(例如,使用/ sbin / halt),但是如果超级用户的想法真的被设置为执行操作,则无法阻止超级用户执行任何操作。

答案 1 :(得分:4)

molly-guard可以防止意外关闭,重新启动等,直到满足所有要求的条件 - 条件可以自定义。

正如已经建议的那样,您也可以在关机过程中执行备份操作。请参阅示例this page

答案 2 :(得分:2)

如果用户要通过GNOME / KDE关闭,只需禁止这样做。

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

答案 3 :(得分:1)

除了完整的解决方案之外,你可以将关闭命令别名,然后使用像

这样的脚本
#!/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

保存在用户的路径中作为shutdown。我希望会有一些变化取决于你的用户如何调用shutdown(窗口管理器图标/命令行),也可能是针对不同的发行版。

答案 4 :(得分:0)

我情不自禁地觉得你不是在讨论Unix的比喻,而你所要求的是一个kludge。

如果用户以root用户身份运行,那么根本无法阻止root用户关闭系统!你可以做一些窗口修饰,比如模糊关闭UI,但这并没有真正完成任何事情。

我无法判断您是在多用户计算机的上下文中讨论这个问题,还是将一台机器用作“桌面PC”而单个用户坐在控制台上。如果是前者,那么您的用户实际上不应该使用可以关闭系统以进行日常活动的凭据来访问计算机。如果是后者,我建议教育用户(a)检查脚本是否正在运行,或者(b)使用您指定的特定关闭脚本检查脚本的进程并拒绝关闭直到它消失。

答案 5 :(得分:0)

  

但是当我选择从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会话,因此如果需要,您必须添加第二条规则以将其列入白名单。

请注意,此方法仅阻止从GUI发出的reboot / etc命令。要阻止命令行中的reboot / etc命令,可以使用molly-guard - 如https://askubuntu.com/questions/17187/disabling-shutdown-command-for-all-users-even-root-consequences/17255#17255

中所述