Xinetd

xinetd 無法啟動 lighttpd

  • February 22, 2018

我想lighttpd在有人嘗試連接到埠 80 時啟動。我從一個簡單的測試腳本開始,看看是否有任何工作:

/etc/xinetd.d/www

service www
{
   disable         = no
   socket_type     = stream
   protocol        = tcp
   port              = 80
   log_on_success += USERID 
   log_on_failure += USERID
   server          = /usr/server_test.sh
   user            = root
   instances       = UNLIMITED
   wait            = no
   log_type        = SYSLOG daemon debug
}

其中/usr/server_test.sh

#!/bin/sh
echo "www connection"
lighttpd -D -f /usr/lighttpd.conf &
webconfig -c /usr/cppcms.js &

service xinetd restart

當我嘗試:

nc localhost 80

我得到:

www connection 2013-11-25 16:37:13: (network.c.345) can't bind to port:  80 Address already in use

我如何獲得xinetdlighttpd一起工作,而不是為同一個埠而戰?

不要這樣做,lighttpd嚴格作為守護程序執行。守護程序xinetd意味著啟動實際上並非一直在執行的服務。當xinetd看到流量時,它會“啟動”特定服務以滿足需求,否則程序不會執行。

順便說一句,您不能在 2 個守護程序/服務之間共享 TCP 埠。只有一個服務可以綁定到特定的 TCP 埠,本質上是在它執行期間擁有它。

無論如何都要這樣做

如果您絕對確定要像這樣執行它,請查看本教程,該教程在 Raspberry Pi 上準確顯示了此場景。本教程的標題是:使用 xinetd 按需啟動 mysqld 和 httpd

該腳本已創建,/etc/xinetd.init.d/lighttpd

#!/bin/bash
# inspired on this article
# https://www.linuxnet.ch/automatic-tunnels-with-xinetd-and-netcat/
# script is called from xinetd
# script starts and stops service using /etc/init.d scripts

SERVICE=/etc/init.d/lighttpd  # script used to start/stop service
PORT=81 # port where end service should listen
PID_FILE=/var/run/lighttpd.pid # pid file generated by init script
REAPER_PID_FILE="/var/run/lighttpd_reaper.pid" # pid file generated by this script
REAPER_SLEEP=180 # The reaper sleeps in seconds and checks for idle conns
LOG=/var/log/syslog # where to log messages

# this function checks if we already have reaper
check_reaper(){
       if  [ -s $REAPER_PID_FILE ]
       then
               reaper_pid=`cat $REAPER_PID_FILE 2>/dev/null`
               ps -p $reaper_pid &> /dev/null
               if [ $? -ne 0 ]
               then
                       start_reaper &    # If we don't have a reaper we start one
                       echo $! > $REAPER_PID_FILE
               fi
       else
               start_reaper &
               echo $! > $REAPER_PID_FILE
       fi

}

# this function starts a reaper, which is a background process that will kill the end service if its inactive
start_reaper(){
       while [ -f $PID_FILE ]
       do
               sleep $REAPER_SLEEP                                      # We wait
               touched=`stat --printf %W $REAPER_PID_FILE 2>/dev/null`  # We check when the reaper PID was last touched
               now=`date +%s 2>/dev/null`
               let idle=$now-$touched
               if [ $idle -gt $REAPER_SLEEP ]              # If reaper pid has not been touched in more than a sleep cycle we stop the service
               then
                       echo `date`" REAPER STOPPING SERVICE AFTER BEING $idle" >> $LOG   
                       $SERVICE stop >> $LOG               # This is the stop service instruction
                       rm $REAPER_PID_FILE 
                       exit 0
               fi
       done
}


# This is where we start our service
start_service(){
       sleep 1                    # Added a delay to trouble shoot as browsers kickstart several connections, we need to allow the PID file to be created this can be improved.
       if [ -s $PID_FILE ]        # We check if the PID file for the end service exist to avoid calling the start script when the service has already been started
       then
               return
       else
               echo `date`" STARTING $SERVICE" >> $LOG
               $SERVICE start &>> $LOG                  #this is the start service instruction
               return
       fi
}

# We probe and wait for the service to come on line
wait_for_service(){
       nc -w30 -z 127.0.0.1 $PORT &>/dev/null          # probe end port with a timeout of 30 seconds
       if [[ $? -ne 0 ]]
       then
               echo `date`" XINET SERVICE START ON $PORT TIMED OUT" >> $LOG
       fi
}

# This is were all the magic happens netcat passes traffic back and forth
transmit(){
       nc -w30 127.0.0.1 $PORT 2>/dev/null  # netcat is awesome, timeout flag of 30 seconds can be adjusted
}

# this is the main program that is called every time
main()
{
       nc -z 127.0.0.1 $PORT &>/dev/null  # We probe the end service
       if [[ $? -ne 0 ]]                  # If its not responding
       then
               start_service              # We start service
               wait_for_service           # We wait for service to became online
       fi
       check_reaper                       # We always check we have a reaper
       touch $REAPER_PID_FILE             # We log activity by touching the reaper PID file
       transmit                           # We transmit data 
       exit 0                             
}

main

並創建了以下 xinetd 服務:

service http
{
       disable         = no
       socket_type     = stream
       protocol        = tcp
       port              = 80
       server = /etc/xinetd.init.d/lighttpd
       user            = root
       wait            = no
}

引用自:https://unix.stackexchange.com/questions/103054