![](/img/trans.png)
[英]how to open (create if not exists) a file while acquiring exclusive lock avoiding races
[英]How to set a polkit rule to lock shutdown if a file exists?
如果将Pendrive连接到系统,我正在编写一个应用程序来控制系统关闭。
连接pendrive时,它将其标识符写入文件中。 如果pendrive断开连接,它将删除其文件标识符,此后,如果文件为空,则删除文件。
然后,我想使用此文件设置一个polkit规则来控制关闭。 polkit规则检测关闭顺序并检查文件是否存在。 如果存在,则不允许关闭,否则允许它。
我尝试将其设置为以下形式:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.consolekit.system.stop") ||
action.id.indexOf("org.freedesktop.login1.power-off") == 0)
{
try{
polkit.spawn(["/usr/bin/detect_pendrive.sh", subject.user]);
return polkit.Result.YES;
}catch(error){
return polkit.Result.NO;
}
}
});
polkit规则使用一个帮助程序,该脚本带有一个检查文件是否存在的脚本
detect_pendrive.sh是这样的:
#!/bin/bash
if ! test -e "/tmp/usbdevinfo"
then
exit 0
else
exit 1
fi
我将规则复制到/usr/share/polkit-1/rules.d/中。 但是,当我尝试在连接笔式驱动器的情况下关闭时,系统只会关闭电源并忽略该规则。
我在Debian GNOME和Gentoo Cinnamon上测试过
问题出在哪里?
在我的OpenBSD 6.2 GENERIC.MP#134 amd64上您的polkit.rule正常
我不使用consolekit但使用org.xfce.session.policy
我的规则文件:
polkit.addRule (function (action, subject) {
if (action.id == "org.xfce.session.xfsm-shutdown-helper") {
try {
polkit.spawn(["/home/alain/polkitspawn.sh",subject.user]);
return polkit.Result.YES;
}
catch (error) {
return "no";
}
}
});
解:
正如@ferrybig先前所说,polkit规则不会在polkit <0.106中运行
然后,我通过双重政策解决了这个问题:
如果polkit <0.106,我创建了这个.pkla文件
[Shutdown]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.stop;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;org.xfce.session.xfsm-shutdown-helper
ResultAny=no
ResultInactive=yes
ResultActive=no
为了解决该问题,我使用链接到两个udev规则的相同脚本来添加和删除规则。 此脚本还用于创建和删除文件,在pendrive连接期间添加.pkla文件,并且在断开连接期间,如果文件为空,则还删除.pkla文件
在polkit> = 0.106中,我仅使用初始规则文件,添加一个新操作:
action.id == "org.freedesktop.login1.power-off-multiple-sessions"
规则文件将如下所示:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.consolekit.system.stop" ||
action.id == "org.freedesktop.login1.power-off" ||
action.id == "org.freedesktop.login1.power-off-multiple-sessions" ||
action.id == "org.xfce.session.xfsm-shutdown-helper")
{
try{
polkit.spawn(["/usr/bin/pendrive-reminder/check_pendrive.sh", subject.user]);
return polkit.Result.YES;
}catch(error){
polkit.spawn(["/usr/bin/pendrive-reminder/send_notify.sh", subject.user]);
return polkit.Result.NO;
}
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.