Попытка выполнить процесс с 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.

Знаете ли вы, что происходит?

1
задан 12 April 2015 в 19:14

2 ответа

Не позволяется работать 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) сделайте это как это как показано ниже:

  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/ имеет следующую запись для разрешения GUI:

    <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
    

Вот именно!

3
ответ дан 13 April 2015 в 05:14

Проверьте эту ссылку, она работала на меня.

  • Это объясняет, как установить policykit-1, который обеспечивает pkexec.
  • объясняет использование для gui su быструю эскалацию полномочия
  • Псевдоним Bash устанавливает для использования псевдонимов для запущения программ с необходимостью ввести

    pkexec application-name
    
  • Вместо этого это становится псевдонимом (имя приложения):

    application-name
    
0
ответ дан 7 December 2019 в 12:46

Другие вопросы по тегам:

Похожие вопросы: