Xinetd
xinetd 無法啟動 lighttpd
我想
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
我如何獲得
xinetd
併lighttpd
一起工作,而不是為同一個埠而戰?
不要這樣做,
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 }