Seeking a solid startup script for node.js/forever
    Jim Long 
    list at museum.rain.com
       
    Tue Mar 22 18:43:46 UTC 2016
    
    
  
Previously, Matthew Seaman wrote:
> 
> Message: 10
> Date: Fri, 18 Mar 2016 23:52:25 +0000
> From: Matthew Seaman <matthew at FreeBSD.org>
> To: freebsd-questions at freebsd.org
> Subject: Re: Seeking a solid startup script for node.js/forever
> Message-ID: <56EC94B9.3010003 at FreeBSD.org>
> Content-Type: text/plain; charset="windows-1252"
> 
> On 18/03/2016 21:54, Jim Long wrote:
> > Sigh.  I should test before I post.
> > 
> > The fix below is not sufficient.  It "mostly works" from inside the jail:
> > 
> 
> daemon(8) sounds like what you need.
> 
> 	Cheers,
> 
> 	Matthew
Matthew:
Thanks for your reply.  I'm afraid however, I may need more of a clue than that.
In my /usr/local/etc/rc.d/iws service script, I changed the start() function, but left
the others (status, stop, restart) as they were:
--snip--
start()
{
  NODE_ENV=production
#  su -m www -c "exec ${forever} start -a -l ${HOME}/forever.log -o ${HOME}/output.log -e ${HOME}/error.log -p /var/run/forever ${script}"
  daemon -p /var/run/iws.pid -u www \
            ${forever} start -a -l ${HOME}/forever.log -o ${HOME}/output.log -e ${HOME}/error.log -p /var/run/forever ${script}
}
status()
{
  su -m www -c "exec ${forever} list"
}
stop()
{
  su -m www -c "exec ${forever} stop ${script}"
}
restart()
{
  su -m www -c "exec ${forever} restart ${script}"
}
--snip--
That makes no change in the symptoms: the script works fine from inside the jail, but from
the host level, the script does not fork the forever/node process into the background, and
therefore, 'service jail start' on the host does not complete and return to a shell prompt.
Script started on Tue Mar 22 10:21:23 2016
# I'm running just one jail on this host:
my_host : 10:21:23 /root# jls
   JID  IP Address      Hostname       Path
     3  10.16.231.41    my_jail        /jail/my_jail
my_host : 10:21:29 /root# jexec my_jail bash -l
# Now I'm inside the jail.  iws is disabled by default; I'll enable it:
my_jail : 10:21:37 /# grep ^iws /etc/rc.conf
iws_enable="NO"
my_jail : 10:21:47 /# echo 'iws_enable="YES"' >> /etc/rc.conf
# here is the service script in full, with an eof marker at the end:
my_jail : 10:22:02 /# cat /usr/local/etc/rc.d/iws ; echo '# --eof--'
#!/bin/sh
# PROVIDE: forever
# REQUIRE: NETWORKING SERVERS DAEMON
# BEFORE:  LOGIN
# KEYWORD: shutdown
# Taken from http://habrahabr.ru/post/137857/
. /etc/rc.subr
name="forever"
forever="/usr/local/bin/node /usr/local/bin/forever"
workdir="/usr/local/IWS4"
#script="web.js"
#script="app.js"
script="${workdir}/app.js"
rcvar=iws_enable
extra_commands="status"
start_cmd="start"
status_cmd="status"
stop_cmd="stop"
restart_cmd="restart"
load_rc_config $name
eval "${rcvar}=\${${rcvar}:-'NO'}"
HOME=/usr/local/IWS4
start()
{
  NODE_ENV=production
#  su -m www -c "exec ${forever} start -a -l ${HOME}/forever.log -o ${HOME}/output.log -e ${HOME}/error.log -p /var/run/forever ${script}"
  daemon -p /var/run/iws.pid -u www \
            ${forever} start -a -l ${HOME}/forever.log -o ${HOME}/output.log -e ${HOME}/error.log -p /var/run/forever ${script}
}
status()
{
  su -m www -c "exec ${forever} list"
}
stop()
{
  su -m www -c "exec ${forever} stop ${script}"
}
restart()
{
  su -m www -c "exec ${forever} restart ${script}"
}
run_rc_command "$1"
# --eof--
# Inside the jail, the service starts okay:
my_jail : 10:22:29 /# service iws start
my_jail : 10:23:34 /# warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: /usr/local/IWS4/app.js
# and it stops okay:
service iws stop
info:    Forever stopped process:
data:        uid  command             script                 forever pid   logfile                     uptime      
[0] tdVb /usr/local/bin/node /usr/local/IWS4/app.js 13497   13498 /usr/local/IWS4/forever.log 0:0:0:8.400 
# a second stop throws the correct error:
my_jail : 10:23:43 /# service iws stop
error:   Forever cannot find process with index: /usr/local/IWS4/app.js
my_jail : 10:23:47 /# service iws start
my_jail : 10:23:48 /# warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: /usr/local/IWS4/app.js
# a second start also throws the correct error:
service iws start
daemon: process already running, pid: 13515
# status works:
my_jail : 10:23:50 /# service iws status
info:    Forever processes running
data:        uid  command             script                 forever pid   logfile                     uptime      
data:    [0] H2tR /usr/local/bin/node /usr/local/IWS4/app.js 13516   13517 /usr/local/IWS4/forever.log 0:0:0:4.967 
# restart works:
my_jail : 10:23:54 /# service iws restart
info:    Forever restarted process(es):
data:        uid  command             script                 forever pid   logfile                     uptime       
data:    [0] H2tR /usr/local/bin/node /usr/local/IWS4/app.js 13516   13517 /usr/local/IWS4/forever.log 0:0:0:12.382 
my_jail : 10:24:01 /# service iws status
info:    Forever processes running
data:        uid  command             script                 forever pid   logfile                     uptime    
data:    [0] H2tR /usr/local/bin/node /usr/local/IWS4/app.js 13516   13533 /usr/local/IWS4/forever.log 0:0:0:2.6 
# when I return to the host, 'service jail stop' works:
my_jail : 10:24:03 /# logout
my_host : 10:25:54 /root# service jail stop
Stopping jails: my_jail.
# but from the host, 'service jail start' does not terminate:
my_host : 10:26:02 /root# time service jail start
Starting jails:
load: 0.01  cmd: node 13914 [uwait] 123.25r 0.25u 0.02s 0% 33268k
^C
real    2m7.917s
user    0m0.007s
sys     0m0.015s
my_host : 10:28:17 /root# logout
Script done on Tue Mar 22 10:28:26 2016
Have I mis-applied the daemon utility?  Can you be more explicit about
how I could apply it to my use case?
I tried using the -f flag to daemon(8) with no improvement.  Also, forcing
daemon into the background using '&' made no difference:
  daemon -p /var/run/iws.pid -u www \
            ${forever} start -a -l ${HOME}/forever.log -o ${HOME}/output.log -e ${HOME}/error.log -p /var/run/forever ${script} &
Thank you very much!  Please CC: me on any replies sent to the list.
Jim
    
    
More information about the freebsd-questions
mailing list