Попытка выполнить процесс с pkexec асинхронно и получить "Отказ в предоставлении обслуживания мертвым родителям"
Я пытаюсь выполнить процесс как пользователь root из моего приложения, которое работает с обычными привилегиями, используя pkexec
,
Когда я призываю pkexec
синхронно все хорошо, но когда я запускаю его асинхронно со следующим кодом:
private void execute_process_async () {
if (permission.allowed ) {
...
Pid child_pid;
var cli = "%s/my_exec".printf (Build.PKGDATADIR);
try {
Process.spawn_async (null,
{ "pkexec", cli,
settings.scrollbar_width.to_string (),
settings.scrollbar_button_radius.to_string (),
settings.active_tab_underline_color
},
Environ.get (),
SpawnFlags.SEARCH_PATH,
null,
out child_pid);
} catch (SpawnError e) {
report_error ("error while executing '%s'. Message: '%s'.".printf (cli, e.message)) ;
}
}
}
Я получаю довольно мрачное сообщение об ошибке:
Refusing to render service to dead parents.
Вы знаете, что происходит?
2 ответа
Запрещено бегать pkexec
в фоновом режиме с помощью fork и exec, а затем завершить родительский. Процесс становится сиротой и принадлежит init
(ppid == 1). См. https://lists.ubuntu.com/archives/foundations-bugs/2012-July/100103.html.
Вы предоставляете контроль над приложением другому пользователю (обычно root). Способ по умолчанию - запустить приложение с pkexec
как корень из сценария оболочки. Таким образом, родитель является оболочкой, а не init
,
Например GParted (/usr/bin/gparted-pkexec
) и GameConqueror (/usr/bin/gameconqueror
) сделать это так, как показано ниже:
Создайте сценарий оболочки как
/usr/local/bin/foo.sh
:#!/bin/sh pkexec "/usr/sbin/foo" "$@"
Дайте исполняемому разрешению вышеуказанный скрипт:
chmod +x /usr/local/bin/foo.sh
Если вы используете
.desktop
файл, изменитьExec
значение как:Exec=/usr/local/bin/foo.sh
Убедитесь, что ваш файл политики в
/usr/share/polkit-1/actions/
имеет следующую запись, чтобы разрешить графический интерфейс:<annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
Это оно!
Проверьте эту ссылку, она работала для меня.
- Он объясняет, как установить policykit-1, который предоставляет pkexec.
- объясняет использование для быстрого повышения привилегий gui su
Настройка псевдонима Bash для использования псевдонимов для запуска программ без необходимости ввода
pkexec application-name
Вместо этого он становится псевдонимом (application-name):
application-name