zhqiyi / webrtc2sip

Automatically exported from code.google.com/p/webrtc2sip
0 stars 0 forks source link

Feature request: run webrtc2sip as a daemon #80

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
I'd like to run webrtc2sip as a real daemon in the background. Unfortunately 
webrtc2sip does not support this. And you can't run webrtc2sip in the 
background with start-stop-daemon, &, nohup or disown because then it will 
start consuming all CPU.
So the only way to run webrtc2sip in the background seems to be screen, tmux or 
byobu. I'm fine with this but it would be nice if I could run webrtc2sip as a 
daemon directly. Or maybe someone could take a look at why webrtc2sip starts 
consuming all CPU when put into the background.

Thanks in advance,

Jeremy

Original issue reported on code.google.com by autosta...@gmail.com on 15 Apr 2013 at 1:56

GoogleCodeExporter commented 9 years ago
When I use a system cron scheduled job with @reboot to launch the webrtc2sip, 
and reboot the server with out logging in, the system seems to work fine.

I attempted the following init script, but it did not work for me.
====================================

Original comment by sdellu...@gmail.com on 22 Apr 2013 at 1:22

Attachments:

GoogleCodeExporter commented 9 years ago
Here's my attempt to create an init script. It assumes a webrtc2sip system user 
which can be created with:
adduser --quiet --system --group --disabled-password --shell /bin/false --gecos 
"webrtc2sip" --home /var/run/webrtc2sip webrtc2sip

It also assumes that screen is installed. This script works for me but it's not 
heavily tested and needs some more work.

Jeremy

Original comment by autosta...@gmail.com on 24 Apr 2013 at 2:07

Attachments:

GoogleCodeExporter commented 9 years ago
And you need a file /etc/default/webrtc2sip. I've attached an example.

Original comment by autosta...@gmail.com on 24 Apr 2013 at 2:25

Attachments:

GoogleCodeExporter commented 9 years ago
[deleted comment]
GoogleCodeExporter commented 9 years ago
Jeremy
I just started to observe the high CPU consumption issue your indicated.
Your script seems to work MUCH better :)   THANK YOU!

HOWEVER, its still not starting up on server reboot... I ended up putting again 
into the crontab 
@reboot service webrtc2sip start
and now it works.

I was under the impression it should work automatically if it was in the 
/etc/init.d/ folder, but it does not seem to start up on its own . 

Original comment by sdellu...@gmail.com on 15 May 2013 at 5:22

GoogleCodeExporter commented 9 years ago
Hello Steve,

In order for services to start you need to tell them when to start (i.e. in 
which runlevel). On Ubuntu this is done with the update-rc.d command:

update-rc.d webrtc2sip defaults

This will set up the webrtc2sip init script to run at boot time.

Jeremy

Original comment by autosta...@gmail.com on 15 May 2013 at 8:37

GoogleCodeExporter commented 9 years ago
Thanks Jeremy! 
I will try it now.
Also,
I wonder if there is some way to enhance the startup script to make sure that 
there are no left over TCP connections.... I find that between restarting the 
webrtc2sip software, I need to wait a few mins for the sessions to close.... 
webrtc2sip throws many errors when you try to start it if there are left over 
connections.

Perhaps adding a loop and wait for the results of 
 netstat -t | grep 10060

to be non could help?
thanks again

Original comment by sdellu...@gmail.com on 15 May 2013 at 7:44

GoogleCodeExporter commented 9 years ago
Isn't this solved with the 2.5.0 release of webrtc2ip (r85)?
That release fixes issue 13: 
http://code.google.com/p/webrtc2sip/issues/detail?id=13
Or is that a different issue?

Jeremy

Original comment by autosta...@gmail.com on 16 May 2013 at 11:44

GoogleCodeExporter commented 9 years ago
I am currently running with 2.5.0.   How rapidly should these connections be 
brought down after termination of webrtc2sip?   I still receive these messages 
and observe connections still waiting to time out....
If I check netstat -t | grep 10060, I can see several connections still active 
after quitting the application... if I wait long enough, the connections time 
out, and I can restart without issue.  I usually need to wait less than a 
minute.... but when you are testing different configurations ...typically 
starting and stopping frequently, its annoying :) ... in a real usage scenario, 
I assume you would not be starting and stopping and starting again in such 
rapid succession however.  Still this small check could be helpful on startup.
thanks!

***ERROR: function: "tnet_socket_create_2()" 
file: "src/tnet_socket.c" 
line: "157" 
MSG: bind to [173.254.255.48:10060]have failed
***ERROR: function: "tnet_socket_create_2()" 
file: "src/tnet_socket.c" 
line: "157" 
MSG: (SYSTEM)NETWORK ERROR ==>Address already in use
***ERROR: function: "tnet_socket_create_2()" 
file: "src/tnet_socket.c" 
line: "184" 
MSG: Invalid socket.
***ERROR: function: "tnet_socket_create_2()" 
file: "src/tnet_socket.c" 
line: "184" 
MSG: (SYSTEM)NETWORK ERROR ==>Address already in use
***ERROR: function: "tnet_transport_create()" 
file: "src/tnet_transport.c" 
line: "155" 
MSG: Failed to create master socket
***ERROR: function: "_tnet_transport_ssl_init()" 
file: "src/tnet_transport.c" 
line: "61" 
MSG: Invalid parameter
***ERROR: function: "tnet_transport_create()" 
file: "src/tnet_transport.c" 
line: "160" 
MSG: Failed to initialize TLS and/or DTLS caps
***ERROR: function: "tsk_runnable_set_priority()" 
file: "src/tsk_runnable.c" 
line: "180" 
MSG: Invalid parameter
***ERROR: function: "tsip_stack_start()" 
file: "src/tsip.c" 
line: "728" 
MSG: Failed to add new transport
*INFO: SIP STACK::run -- STOP
***ERROR: function: "start()" 
file: "mp_engine.cc" 
line: "537" 
MSG: Failed to start SIP stack

Original comment by sdellu...@gmail.com on 17 May 2013 at 3:18

GoogleCodeExporter commented 9 years ago
Jeremy

"update-rc.d webrtc2sip defaults"

Yes that resolved my statup issue with the init script

thanks!

Original comment by sdellu...@gmail.com on 17 May 2013 at 3:26

GoogleCodeExporter commented 9 years ago
Hello Steve,

If there are no active TCP connections on 10060, immediately. If there 
are active connections it could take up to minute.

I always make sure I kill all active connections (so any browsers 
connected via WebSocket to webrtc2sip) before I restart webrtc2sip. But 
I'll see if I can add an extra check to the init script.

Jeremy

Original comment by autosta...@gmail.com on 17 May 2013 at 8:34

GoogleCodeExporter commented 9 years ago
You can actually adjust the length of the TIME_WAIT state. By default it's 60 
seconds:
cat /proc/sys/net/ipv4/tcp_fin_timeout
60

You could try setting tcp_fin_timeout to a lower setting to shorten the length 
of the TIME_WAIT state:
echo -n 20 > /proc/sys/net/ipv4/tcp_fin_timeout

There are also tools like tcpkill and cutter that allow you to terminate active 
connections but afaik then you'll still have to deal with the TIME_WAIT state 
in the case of webrtc2sip.

Jeremy

Original comment by autosta...@gmail.com on 17 May 2013 at 9:44

GoogleCodeExporter commented 9 years ago
An option would be to issue a tcpkill or cutter command before restarting 
webrtc2sip. I'm going to test this. So basically you terminate the WebSocket 
connections on the server side and then you restart webrtc2sip with no active 
connections so webrtc2sip should start immediately again.

Jeremy

Original comment by autosta...@gmail.com on 17 May 2013 at 9:47

GoogleCodeExporter commented 9 years ago
Thanks Jeremy!
Your init.d script (the one attached to this incident) is working very well for 
me.
I made a small enhancement by adding a function to wait for the ports to be 
available on restart.  See the function below and the fully modified script 
attached.
Perhaps you may consider to add this to your package?

Also, I attempted to use your latest PPA update with the init script using 
SCREEN... however, I was not successful ... perhaps I do not really understand 
how the SCREEN function works.

thanks again!!
Steve

#-------------------------------------------------------------------------------
---------------------------------------------
SLEEP_TIME=15
DEFAULT_FILE=/etc/default/webrtc2sip
DEFAULT_CONFIG=/etc/webrtc2sip/config.xml
CMD_OUTPUT="/usr/bin/logger -s"
CMD_GREP=/bin/grep
CMD_SLEEP=/bin/sleep
CMD_CUT=/usr/bin/cut
#-------------------------------------------------------------------------------
---------------------------------------------
WaitForPorts ()
{
    strConfigFile=`${CMD_GREP} -v "#"  ${DEFAULT_FILE}  | ${CMD_GREP}  "OPTIONS=--config=" | ${CMD_CUT} -f3 -d =`
    if [ -z "${strConfigFile}" ]; then  
        strConfigFile=${DEFAULT_CONFIG}
    fi
    ${CMD_OUTPUT} "$0>...Default=[${DEFAULT_FILE}]   Config=[${strConfigFile}]"
    strTransports=`${CMD_GREP}  "<transport>" ${strConfigFile}`
    if [ -n "${strTransports}" ]; then  
        for Transport in ${strTransports}
        do
            Port=`echo ${Transport} | ${CMD_CUT} -f2 -d '>' | ${CMD_CUT} -f1 -d '<' | ${CMD_CUT} -f3 -d ';'`
            # ${CMD_OUTPUT} "$0>...Testing  port=${Port}"
            while [ -n "`netstat -t | ${CMD_GREP} ":${Port}"`" ]
            do
                ${CMD_OUTPUT} "$0>...Starting webRTC2SIP... Waiting another ${SLEEP_TIME} seconds for port: ${Port} to be available"
                ${CMD_SLEEP} ${SLEEP_TIME}
            done
        done
    fi
    ${CMD_OUTPUT} "$0>...STARTING...."
}
#-------------------------------------------------------------------------------
---------------------------------------------

Original comment by sdellu...@gmail.com on 17 May 2013 at 6:04

Attachments:

GoogleCodeExporter commented 9 years ago
Thanks, this looks great. I've been trying to work on an upstart version but 
the results were mixed.

Quick question: does this init config also handle respawning? I've seen 
webrtc2sip crashing on some random occasions (albeit rarely).

Thanks!

Original comment by ciprian....@gmail.com on 21 May 2013 at 4:39

GoogleCodeExporter commented 9 years ago
It doesn't handle respawning. You could use a tool like monit for this.

Original comment by autosta...@gmail.com on 22 May 2013 at 8:52

GoogleCodeExporter commented 9 years ago

Original comment by boss...@yahoo.fr on 24 May 2013 at 1:45

GoogleCodeExporter commented 9 years ago
When checking the process status with
service webrtc2sip status
I was having an issue with sometimes running into the condition of 
Status of webrtc2sip: webrtc2sip: is not running but 
/var/run/webrtc2sip/webrtc2sip.pid exists.

To improve this condition, I updated the case section to remove the PID file 
and update it if it is actually running.  See the update below and the full 
file attached.  Thanks!

    status)
        ${CMD_OUTPUT} "$0>...Status of ${DESC}: ${NAME} "
        if [ ! -r "${PIDFILE}" ]; then
            ${CMD_OUTPUT} "$0>...is not running."
            exit 3
        fi

        if read pid < "$PIDFILE" ; ps -p "$pid" > /dev/null 2>&1; then
            ${CMD_OUTPUT} "$0>...is running."
            exit 0
        else
            ${CMD_OUTPUT} "$0>...${PIDFILE} exists...But does not contain valid PID...REMOVING ${PIDFILE}"
            rm ${PIDFILE}
            strActualPID=`${CMD_PIDOF} ${NAME}`
            if [ -n "${strActualPID}" ]; then   
                ${CMD_OUTPUT} "$0>...${NAME} is running with PID = ${strActualPID}... so updating PID file ${PIDFILE}"
                echo  ${strActualPID} > ${PIDFILE}
                exit 0
            fi
            exit 1
        fi  
    ;;

Original comment by sdellu...@gmail.com on 25 May 2013 at 8:04

Attachments:

GoogleCodeExporter commented 9 years ago
Small updates to the init.d script attached

Original comment by sdellu...@gmail.com on 28 May 2013 at 5:03

Attachments:

GoogleCodeExporter commented 9 years ago
Hi Jeremy and Steve,

Follownig this thread, I have created the system user by:
sudo adduser --system --group --disabled-password --shell /bin/false --gecos 
"webrtc2sip" --home /var/run/webrtc2sip webrtc2sip

and deployed your corresponding files as /etc/init.d/webrtc2sip and 
/etc/default/webrtc2sip

Unfortunately, I did not manage to have the script /etc/init.d/webrtc2sip 
running successfully. At the command line, webrtc2sip can work via:

$ sudo start-stop-daemon --start --verbose --chuid root:root --exec 
/usr/bin/screen -- -dmS webrtc2sip /usr/local/sbin/webrtc2sip 
--config=/usr/local/etc/webrtc2sip/config.xml 
Starting /usr/bin/screen...
$ ps aux | grep webrtc2sip
root     28711  0.0  0.0  31268  1360 ?        Ss   15:19   0:00 
/usr/bin/SCREEN -dmS webrtc2sip /usr/local/sbin/webrtc2sip 
--config=/usr/local/etc/webrtc2sip/config.xml
root     28712  0.1  0.2 669668  5676 pts/2    Ssl+ 15:19   0:00 
/usr/local/sbin/webrtc2sip --config=/usr/local/etc/webrtc2sip/config.xml
jchan    28727  0.0  0.0   9392   916 pts/1    S+   15:19   0:00 grep 
--color=auto webrtc2sip

However, if I replace root with webrtc2sip, the process is not running via the 
command line interface:

$ sudo start-stop-daemon --start --verbose --chuid webrtc2sip:webrtc2sip --exec 
/usr/bin/screen -- -dmS webrtc2sip /usr/local/sbin/webrtc2sip 
--config=/usr/local/etc/webrtc2sip/config.xml 
Starting /usr/bin/screen...
$ ps aux | grep webrtc2sip
jchan    28708  0.0  0.0   9388   920 pts/1    S+   15:18   0:00 grep 
--color=auto webrtc2sip

Wondering if my webrtc2sip user and group properties are set correctly, or I 
should not debug this issue via the command line at all?

Thanks for your help.

Original comment by connect....@gmail.com on 22 Oct 2013 at 4:31

GoogleCodeExporter commented 9 years ago
Hi,

has anybody managed to have a working init.d script on Centos6? I compiled 
start-stop-daemon on Centos, after starting the init.d script it shows: 

"webrtc2sip is running with PID = 27972... so updating PID file 
/var/run/webrtc2sip/webrtc2sip.pid" 

but no screen nor webrtc are running. May it be related to the webrtc2sip user?

Thank you

Original comment by peter.s...@gmail.com on 27 Jan 2014 at 11:44