5 votes

Pourquoi sudo bifurque-t-il avant d'exécuter le processus ?

Cette question peut sembler un peu idiote, mais comme dans les systèmes basés sur Unix, le remplacement de l'image d'un exécutable se fait en une seule étape, en remplaçant le processus en cours d'exécution, dans l'appel de fonction execve (et dérivés), la question est la suivante :

Pourquoi est-ce que sudo fork() par défaut avant execve le processus de remplacement ?

En bifurquant avant, des éléments supplémentaires du noyau doivent être initialisés, et bien que la bifurcation soit assez optimisée dans certaines Unices, il y a toujours des éléments inévitables qui doivent être initialisés. Si fork() ne se produisait pas par défaut, l'espace PID s'incrémenterait plus lentement.

Si vous êtes curieux, ce comportement par défaut peut être inspecté en lançant une commande telle que

sudo sleep 30

le code actuel [ 1 ] est plus compliquée à suivre, car de nombreuses fonctionnalités ont été ajoutées depuis ; mais dans la version hébergée par Apple [ 2 ] il est tout à fait clair ce qu'il fait.

#ifndef PROFILING
    if ((sudo_mode & MODE_BACKGROUND) && fork() > 0)
        exit(0);
    else
        EXEC(safe_cmnd, NewArgv);   /* run the command */
#else
/* Complicated code when profiling is enabled, but we don't care */

J'utilise actuellement la version 1.8.11p2 de sudo, et le sleep se déclenche dans les deux cas, avec ou sans l'attribut -b switch, il semble donc que le code actuel soit devenu plus compliqué.

Je cherche une réponse qui couvre également pourquoi est-ce le comportement par défaut, et quels avantages cela peut nous apporter.

3voto

DisgruntledGoat Points 21368

La raison de la bifurcation est documentée dans le document Process model section de la page de manuel. Le contenu pertinent est le suivant :

Ce processus supplémentaire permet, par exemple, de suspendre et de reprendre la commande. Sans lui, la commande se trouverait dans ce que POSIX appelle un "groupe de processus orphelins" et elle ne recevrait aucun signal de contrôle de travail. Comme cas spécial, si le plugin de politique ne définit pas de fonction de fermeture et qu'aucun pty n'est requis, sudo exécutera la commande directement au lieu d'appeler fork(2) en premier. Le plugin de politique sudoers ne définira une fonction close que si la journalisation des E/S est activée, si un pty est requis ou si les options pam_session ou pam_setcred sont activées. Notez que pam_session et pam_setcred sont activées par défaut sur les systèmes utilisant PAM.

3voto

James Mertz Points 390

L'espace PID sous Linux peut être porté à 2 22 avec un simple sysctl ; ce n'est vraiment pas un problème...

La plupart des distributions Linux utilisent aujourd'hui PAM, et sudo est généralement compilé avec le support de PAM également. Entre autres choses, il appelle pam_open_session() avant d'exécuter votre programme, il doit donc également appeler pam_close_session() à l'intérieur du même processus, puisque votre programme ne saura pas qu'il doit le faire (et ne sera probablement pas en mesure de le faire). autorisé pour le faire).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X