Попытка выполнить процесс с 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) сделать это так, как показано ниже:

  1. Создайте сценарий оболочки как /usr/local/bin/foo.sh:

    #!/bin/sh
    pkexec "/usr/sbin/foo" "$@"
    
  2. Дайте исполняемому разрешению вышеуказанный скрипт:

    chmod +x /usr/local/bin/foo.sh
    
  3. Если вы используете .desktop файл, изменить Exec значение как:

    Exec=/usr/local/bin/foo.sh
    
  4. Убедитесь, что ваш файл политики в /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
    
Другие вопросы по тегам