Upstart script for node.js app

前端 未结 2 1597
闹比i
闹比i 2021-02-05 21:19

I\'m having trouble starting an Upstart script.

Here\'s the script (app.conf in /etc/init/)

description \"node.js server\"
author      \"kvz\"

start on          


        
2条回答
  •  北恋
    北恋 (楼主)
    2021-02-05 21:58

    After a few attempts I implemented working .conf file for upstart which works as a service with automatic start after reboot and restart (respawn) in case of crash. Also it can start my app with unprivileged user permissions. The name of the file is /etc/init/my-app.conf.

    To start / stop service please use

    sudo start my-app / sudo stop my-app
    

    If you have an error like

    start: Unknown job: my-app
    

    exec the following command

    sudo initctl reload-configuration
    

    My /etc/init/my-app.conf file:

    #my-app                                                                           
    description "node.js my-app website"                                                  
    env FULL_PATH="/home/myuser/app.prod/app"                                              
    env NODE_PATH="/usr/bin/node"                                                     
    
    
    start on filesystem or runlevel [2345]                                            
    stop on [!2345]                                                                   
    
    script                                                                            
        export HOME="/root"                                                           
        export NODE_ENV=production                                                    
        echo $$ > /var/run/my-app.pid                                                 
        cd $FULL_PATH        
        #Use exec below if you want to launch it under myuser, 
        #don't forget to create /var/log/my-app.sys.log with appropriate permissions
        #exec sudo -u myuser sh -c "$NODE_PATH server.js >> /var/log/my-app.sys.log 2>&1" 
        exec $NODE_PATH server.js >> /var/log/my-app.sys.log 2>&1                     
    end script                                                                        
    
    pre-start script                                                                  
        echo "[`date`] (sys) Starting" >> /var/log/my-app.sys.log                     
    end script                                                                        
    
    pre-stop script                                                                   
        rm /var/run/my-app.pid                                                        
        echo "[`date`] (sys) Stopping" >> /var/log/my-app.sys.log                     
    end script                                                                        
    
    #uncomment respawn if you want to restart your service in case of crash
    #respawn                                                                          
    #respawn limit 50 30   
    

    I do recommend to uncomment respawn after you will make sure that everything works ok.

    UPDATE

    I improved my script (please keep in mind that it works not under root but under regular user zn ):

    #znapi.conf                                                                    
    description "node.js zn api"                                        
    
    env FULL_PATH="/home/zn/app.prod"                          
    env NODE_PATH="/usr/bin/node"                                  
    env LOG="/var/log/znapi.log"
    env PIDFILE="/var/run/znapi.pid"
    
    # Start up when the system hits any normal runlevel, and 
    #start on filesystem or runlevel [2345]     
    #start when mongod started
    start on started mongod
    
    # shuts down when the system goes to shutdown or reboot.
    stop on runlevel [06]                                                              
    
    respawn
    respawn limit 50 5
    
    pre-start script                                                    
        # check that log file exist or create it
        test -f $LOG || { touch $LOG; chown zn:zn $LOG; }
    
        # Date format same as (new Date()).toISOString() for consistency
        echo "[`date`] (sys) Starting" >> $LOG            
    end script                                                          
    
    script                                                                       
        export NODE_ENV=production
        exec start-stop-daemon --start -m -p $PIDFILE -c zn -d $FULL_PATH -x server.js >> $LOG 2>&1
    end script                                                                   
    
    pre-stop script                                                              
        rm $PIDFILE                                                   
        echo "[`date`] (sys) Stopping" >> $LOG                    
    end script 
    

提交回复
热议问题