{{tag>Bash Script Service}} # Script initV FIXME : Doublon avec [[script_init_wrapper]] Aujourd'hui au boulot : install d'un logiciel privateur sur une Debian. Cette solution install un script dans /etc/init.d/ Je vais l'appeler ici **MACHINAgent** J'ai donc mon beau script /etc/init.d/MACHINAgent Le pb c'est qu'il démarre le processus avec les privilèges root Une solution serait d'utiliser crontab sous un compte utilisateur. ~~~ @reboot /etc/init.d/MACHINAgent start ~~~ Je crée un utilisateur système. Mais la crontab, ce n'est pas une bonne idée : * Il ne ferme pas l'appli correctement * Logiquement tous les scripts /etc/init.d/ doivent pouvoir être lancer en root et lancer les process avec un compte dedié. Lancement du serveur MACHIN sous un compte utilisateur (non-root) sous Debian. ## 1) Création d’un nouvel utilisateur dédie au serveur MACHIN. Dans notre exemple il s’agit de « machin » ## 2) Création du script `/etc/init.d/MACHINWrapper` ~~~bash #! /bin/bash # chkconfig: 35 85 15 # description: Startup script for MACHIN Agent Wrapper ### BEGIN INIT INFO # Provides: MACHINWrapper # Required-Start: $network $local_fs $remote_fs $time $syslog # Required-Stop: $network $local_fs $remote_fs $time $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Wrapper pour lancer les scripts sysVinit avec un compte utilisateur (non root) # Description: Wrapper pour lancer les scripts sysVinit avec un compte utilisateur (non root) ### END INIT INFO MACHIN_USER=machin MACHIN_INITSCRIPT=/etc/init.d/MACHINAgent su - $MACHIN_USER -c "$MACHIN_INITSCRIPT $*" ~~~ ### Explications Les commentaires servent ! * Ligne 1 : c'est le [Shebang](https://fr.wikipedia.org/wiki/Shebang) * Ligne 2 : **chkconfig** sert pour Redhat/CentOS * Ligne 3 : **description** sert aussi pour chkconfig !? * Ligne 4 à 12 : C'est la même chose que chkconfig, mais pour la plupart des distros. C'est une norme [LSB](https://fr.wikipedia.org/wiki/Linux_Standard_Base) Voir * Ligne 13 à FIN : C'est le code. * Ligne 13 : Variable **MACHIN_USER** qui contient le nom du compte dédié au service. * Ligne 14 : Variable **MACHIN_INITSCRIPT** qui contient le chemin complet de l'ancien script que nous avons déplacé * Ligne 15 FIN: On utilise la commande **su** pour changer de compte. Puis $* représente tous les arguments. Dans le cas d'un script init : start, stop, status, restart et éventuellement d'autres. Voir http://www.vincentliefooghe.net/content/chkconfig-activer-les-services-au-d%C3%A9marrage-sous-redhat-centos Note : Les commentaires du scripts sont nécessaire. Voir https://wiki.debian.org/LSBInitScripts http://linux.die.net/man/8/chkconfig ## 3) Gestion des services Placer les droits d’exec : ~~~bash chmod +x /etc/init.d/MACHINWrapper ~~~ Désactivation du démarrage de l’ancien script. ~~~bash update-rc.d MACHINAgent remove ~~~ Activation du nouveau script ~~~bash update-rc.d MACHINWrapper defaults ~~~ On vérifie : ~~~bash find /etc/rc* -iname "*MACHIN*" ~~~ ## 4) Fin Arrêt process lancé en root ~~~bash /etc/init.d/MACHINAgent stop ~~~ Ici l’utilisateur **machin** devient le nouveau propriétaires des fichiers ~~~bash chown machin: /opt/machin/ -R ~~~ On démarre MACHINWrapper ~~~bash /etc/init.d/MACHINWrapper start ~~~ ## En cas de Pb : Refaire point 3 et 4. Idem si application patch. ## Notes NB : il convient dans la supervision de s’assurer que le process tourne sous le bon compte. Exemple : ~~~bash pgrep -u machin nomDuProcess && echo OK || echo NOK ~~~