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