Я пытаюсь выполнить процесс как 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.
Знаете ли вы, что происходит?
Не позволяется работать pkexec
в фоновом режиме ветвлением и должностным лицом и затем завершением родителя. Процесс становится висячей строкой и принадлежит init
(ppid == 1). См. https://lists.ubuntu.com/archives/foundations-bugs/2012-July/100103.html.
Вы даете контроль приложения другому пользователю (обычно корень). Путь по умолчанию состоит в том, чтобы запустить приложение с 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/
имеет следующую запись для разрешения GUI:
<annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
Вот именно!
Проверьте эту ссылку, она работала на меня.
Псевдоним Bash устанавливает для использования псевдонимов для запущения программ с необходимостью ввести
pkexec application-name
Вместо этого это становится псевдонимом (имя приложения):
application-name