Correction d'un bug sous Ubuntu 16.04 après l’installation de NEO4J

88 views
Skip to first unread message

Franc SERRES

unread,
Aug 16, 2016, 11:55:18 AM8/16/16
to Neo4jFr
user@hostname:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.1 LTS
Release:        16.04
Codename:       xenial


Après l'installation de NEO4J, je n'arrivais pas à lancer le service systemctl start neo4j.service
Un journalctl -xe m'a permis de comprendre pour quelle raison
Je ne sais pas pourquoi mais les répertoires /var/run/neo4j et /var/log/neo4j n'ont pas été créer.

Donc un sudo mkdir /var/run/neo4jsudo mkdir /var/log/neo4j et sudo chown -R neo4j:adm /var/run/neo4j, sudo chown -R neo4j:adm /var/log/neo4j
user@hostname:~$ systemctl status neo4j.service
neo4j.service - Neo4j Management Service
  Loaded: loaded (/etc/systemd/system/neo4j.service; enabled; vendor preset: enabled)
  Active: failed (Result: exit-code) since mar. 2016-08-16 17:33:00 CEST; 2s ago
 Process: 25319 ExecStop=/usr/bin/neo4j stop (code=exited, status=0/SUCCESS)
 Process: 21791 ExecStart=/usr/bin/neo4j start (code=exited, status=0/SUCCESS)
Main PID: 21849 (code=exited, status=143)

août 16 15:59:24 hostname neo4j[21791]: Started neo4j (pid 21849). By default, it is available at http://localhost:7474/
août 16 15:59:24 
hostname neo4j[21791]: There may be a short delay until the server is ready.
août 16 15:59:24 
hostname neo4j[21791]: See /var/log/neo4j/neo4j.log for current status.
août 16 15:59:24 
hostname systemd[1]: Started Neo4j Management Service.
août 16 17:32:59 
hostname systemd[1]: Stopping Neo4j Management Service...
août 16 17:32:59 
hostname systemd[1]: neo4j.service: Main process exited, code=exited, status=143/n/a
août 16 17:33:00 
hostname neo4j[25319]: Stopping Neo4j.. stopped
août 16 17:33:00 
hostname systemd[1]: Stopped Neo4j Management Service.
août 16 17:33:00 
hostname systemd[1]: neo4j.service: Unit entered failed state.
août 16 17:33:00 
hostname systemd[1]: neo4j.service: Failed with result 'exit-code'.
user@hostname:~$ systemctl start neo4j.service
user@hostname:~$ systemctl status neo4j.service    
neo4j.service - Neo4j Management Service
  Loaded: loaded (/etc/systemd/system/neo4j.service; enabled; vendor preset: enabled)
  Active: active (running) since mar. 2016-08-16 17:33:36 CEST; 46s ago
 Process: 25319 ExecStop=/usr/bin/neo4j stop (code=exited, status=0/SUCCESS)
 Process: 25406 ExecStart=/usr/bin/neo4j start (code=exited, status=0/SUCCESS)
Main PID: 25462 (java)
  CGroup: /system.slice/neo4j.service
          └─25462 /usr/bin/java -cp /var/lib/neo4j/plugins:/etc/neo4j:/usr/share/neo4j/lib/*:/var/lib/neo4j/plugins/* -server -XX:+UseG1GC -XX:-OmitStackTraceInFastThrow -XX:hashCode=

août 16 17:33:36 
hostname systemd[1]: Starting Neo4j Management Service...
août 16 17:33:36 
hostname neo4j[25406]: Starting Neo4j.
août 16 17:33:36 
hostname neo4j[25406]: Started neo4j (pid 25462). By default, it is available at http://localhost:7474/
août 16 17:33:36 
hostname neo4j[25406]: There may be a short delay until the server is ready.
août 16 17:33:36 
hostname neo4j[25406]: See /var/log/neo4j/neo4j.log for current status.
août 16 17:33:36 
hostname systemd[1]: Started Neo4j Management Service.


Lors du redémarrage d'Ubuntu rebelote plus de /var/run/neo4j.
J'ai donc modifier le script /usr/share/neo4j/bin/neo4j

check_status() {
  if [ -e "${NEO4J_PIDFILE}" ] ; then
    NEO4J_PID=$(cat "${NEO4J_PIDFILE}")
    kill -0 "${NEO4J_PID}" 2>/dev/null || unset NEO4J_PID
  fi
}

en

check_status() {
  if [ -e "${NEO4J_PIDFILE}" ] ; then
    NEO4J_PID=$(cat "${NEO4J_PIDFILE}")
    kill -0 "${NEO4J_PID}" 2>/dev/null || unset NEO4J_PID
  else
    RUNDIR=`dirname ${NEO4J_PIDFILE}`
    if [[ ! -d ${RUNDIR} ]] ; then
      echo "The executive directory of PID ${RUNDIR} doesn't exist !"
      if [[ -w `dirname ${RUNDIR}` ]] ; then
        echo "Create directory of PID ${RUNDIR}"
        mkdir $RUNDIR
      fi
    fi
  fi
}



Cédric Fauvet

unread,
Sep 29, 2016, 6:12:04 AM9/29/16
to Neo4jFr
Merci pour le partage d'info !

Franc SERRES

unread,
Jan 27, 2017, 6:20:28 AM1/27/17
to Neo4jFr
Bonjour à tous :-)
La suite de mon problème.
Après une migration de mon système :
user@hostname:~$ lsb_release -a
No LSB modules are available.   
Distributor ID: Ubuntu          
Description:    Ubuntu 16.10    
Release:        16.10           
Codename:       yakkety         


Je me suis penché plus en détail sur le problème. Je me suis donc investi sur systemd.

La problématique du fonctionnement du service sous Ubuntu vient de systemd et du script installé.

En effet il faut éditer /etc/systemd/system/neo4j.service et modifier :

...
[Service]                         
Type=forking                      
User=neo4j                        
ExecStart=/usr/bin/neo4j start    
ExecStop=/usr/bin/neo4j stop      
ExecReload=/usr/bin/neo4j restart
RemainAfterExit=no                
Restart=on-failure                
PIDFile=/var/run/neo4j/neo4j.pid  
LimitNOFILE=60000                 
TimeoutSec=600                    
...

en

...
[Service]                         
Type=forking                      
User=neo4j                        
Ajout
RuntimeDirectory=neo4j            
RuntimeDirectoryMode=770          

ExecStart=/usr/bin/neo4j start    
ExecStop=/usr/bin/neo4j stop      
ExecReload=/usr/bin/neo4j restart 
RemainAfterExit=no                
Restart=on-failure                
PIDFile=/var/run/neo4j/neo4j.pid  
LimitNOFILE=60000                 
TimeoutSec=600                    
...

En effet c'est systemd qui s'exécute avec l'utilisateur neo4j.
Systemd a modifié le processus init et stocke le répertoire /var/run (qui est maintenant un alias vers /run) dans un système de fichiers temporaire tmpfs.

user@hostname:~$  mount                                                    
...                                                                        
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=808128k,mode=755) 
...                                                                        


Ce système de fichiers se recréé à chaque démarrage du système.
Il perd alors toutes ses autorisations, et les autorisations par défaut sont celles de root.

Lorsque l'on lance le service neo4j.service avec systemctl celui-ci s'exécute avec les permissions de l'utilisateur neo4j.

La directive RuntimeDirectory=neo4j créé le répertoire neo4j dans /run avec comme utilisateur le nom de User= et le groupe le nom de Group= s'il est précisé.
Et la directive RuntimeDirectoryMode=770 attribue au répertoire /run/neo4j les droits de lecture/écriture/exécution pour l'utilisateur et pour le groupe du répertoire.

Reply all
Reply to author
Forward
0 new messages