Quel environnement et identifiant sont utilisés par les process de démarrage, d'arrière-plan et de service

  • Scripts de démarrage (au démarrage)
  • Processus en cours d'exécution (ou envoyés à) l'arrière-plan (lors de l'utilisation de SSH -fN par exemple)
  • Prestations de service
  • etc.

Quelle est la variable $ path qu'ils vont utiliser? Quels pouvoirs? Quelque chose d'autre que je devrais savoir?

Essayé googling, et trouvé beaucoup d'informations fragmentées dans les forums, mais rien donnant une image claire / complète de ce qui se passe.

FYI Je cours Raspbian qui est à peu près le même que Debian.

Selon la phase dans laquelle les process ont été démarrés, ils pourraient ne pas avoir de variables d'environnement, héritées du process parent ou utilisant des variables qui étaient dans le script de démarrage (init.d).

Vous pouvez find les variables d'environnement du process en examinant /proc/$PID_OF_PROCESS/environ :

 root@frisbee:~# xargs -n 1 -0 < /proc/1243/environ UPSTART_INSTANCE= UPSTART_JOB=rsyslog TERM=linux PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin UPSTART_EVENTS=filesystem PWD=/ 

Vous pouvez find beaucoup d'informations sur un process en examinant le /proc/ . Par exemple:

  • Le directory de travail actuel du process est lié par /proc/$PID/cwd :

     root@frisbee:~# ls -l /proc/1243/cwd lrwxrwxrwx 1 root root 0 apr 30 11:20 /proc/1243/cwd -> / 
  • Le binary à partir duquel le process était exec() 'ed est lié par /proc/$PID/exe :

     root@frisbee:~# ls -l /proc/1243/exe lrwxrwxrwx 1 root root 0 apr 30 11:19 /proc/1243/exe -> /usr/sbin/rsyslogd 
  • Les descripteurs de files (files + connections réseau + sockets de communication interprocess) se trouvent dans /proc/$PID/fd/ :

     root@frisbee:/proc/1243/fd# ls -l total 0 lrwx------ 1 root root 64 apr 30 11:20 0 -> socket:[12362] l-wx------ 1 root root 64 apr 30 11:20 1 -> /var/log/syslog l-wx------ 1 root root 64 apr 30 11:20 2 -> /var/log/kern.log lr-x------ 1 root root 64 apr 30 11:20 3 -> /proc/kmsg l-wx------ 1 root root 64 apr 30 11:20 4 -> /var/log/auth.log l-wx------ 1 root root 64 apr 30 11:39 5 -> /var/log/ufw.log 

Vous pouvez find quel user exécute le process en examinant la sortie ps :

 root@frisbee:/proc/1243# ps -fp 1243 UID PID PPID C STIME TTY TIME CMD syslog 1243 1 0 11:19 ? 00:00:01 rsyslogd -c5 

Quelque chose d'autre que je devrais savoir?

Beaucoup, mais vous devez définir ces choses vous-même et les find ou poser une autre question à ce sujet.

Scripts de démarrage (au démarrage)

Les process démarrés par init ont généralement peu ou pas d'environnement préexistant , même si cela dépend de la façon dont ils sont invoqués.

S'ils sont invoqués directement, ie forkés et exécutés par le démon init, $PATH ne sera pas défini. Si elles sont invoquées via le shell, $PATH peut être défini en fonction du shell et de la façon dont il est configuré, mais il ne sera généralement pas défini. C'est pourquoi les scripts d'initialisation contiennent généralement des paths complets.

Les variables d'environnement telles que $PATH sont généralement définies dans des scripts shell qui peuvent être automatiquement générés lorsque le shell démarre; pour une explication de la façon dont bash, par exemple, fait ceci, voir INVOCATION in man bash . Pour les shells invoqués de manière non interactive comme sh (ie, la plupart des scripts init), il n'y a pas de files fournis automatiquement.

Les variables d'environnement sont également héritées, mais à less que init (le premier process du système) en définisse un, ses enfants (comme les scripts d'initialisation exécutés) n'hériteront de rien.

Si un service de démarrage spécifique a besoin de l'environnement défini d'une certaine façon, il est de la responsabilité de ce service de créer un tel environnement pour lui-même. Traditionnellement, cela est fait en initialisant des variables dans un script d'initialisation.

Processus en cours d'exécution (ou envoyés à) l'arrière-plan

Les process héritent de leur environnement de leur parent (le process qui les a démarrés). Les envoyer à l'arrière-plan ne change pas cela.