![](/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.